二、百万级别用户系统
原则:
- 尽可能地缓存数据
- 采用无状态Web层
- 支持多个数据中心
- 在 CDN 中托管静态资源
- 通过分片扩展数据层
- 将层级拆分为独立的服务
负载均衡器
负载均衡器会将传入的流量均匀分配给在负载均衡集合中定义的Web服务器,用户直接连接负载均衡器的公共IP。通过这种设置,Web服务器不再能直接被客户端访问,负载均衡器通过私有IP与Web服务器进行通信。
- 如果服务器1下线,所有流量将被路由到服务器2。这样可以防止网站宕机。我们还可以向服务器池中添加一个新的健康Web服务器来平衡负载。
- 如果网站流量迅速增长,两个服务器无法处理流量,负载均衡器可以优雅地解决这个问题。您只需要向Web服务器池添加更多服务器,负载均衡器将自动开始将请求发送给它们。
数据库复制
- 更好的性能:在主从模型中,所有的写操作和更新操作都发生在主节点上,而读操作分布在从节点上。这种模型改善了性能,因为它允许更多的查询并行处理。
- 可靠性:如果你的数据库服务器之一被自然灾害(如台风或地震)摧毁,数据仍然得以保留。你不需要担心数据丢失,因为数据被复制到多个位置。
- 高可用性:通过在不同的位置复制数据,即使一个数据库离线,你的网站仍然可以运行,因为你可以访问存储在另一个数据库服务器中的数据。
无状态Web层
有状态服务器会记住从一个请求到下一个请求的客户端数据(状态)。无状态服务器不保存任何状态信息。
有状态Web层的问题在于同一客户端的每个请求必须路由到同一台服务器,我们将状态(例如用户会话数据)从Web层中移出,做法是将会话数据存储在持久性存储中,如关系型数据库或NoSQL数据库。用户的HTTP请求可以发送到任何Web服务器,这些服务器从共享数据存储中获取状态数据。状态数据存储在共享数据存储中,并且不保存在Web服务器中。无状态系统更简单、更健壮和可扩展。
内容分发网络(CDN)
CDN是一个由地理分布的服务器组成的网络,用于传送静态内容。CDN服务器缓存像图像、视频、CSS、JavaScript文件等静态内容。静态资源不再由 Web 服务器提供。它们从 CDN 获取以获得更好的性能。
- 看用户的 IP 地址,查表得知地理位置,找相对最近的边缘节点
- 看用户所在的运营商网络,找相同网络的边缘节点
- 检查边缘节点的负载情况,找负载较轻的节点
- 其他,比如节点的“健康状况”、服务能力、带宽、响应时间等
流程
- 如果CDN服务器没有image.png的缓存,CDN服务器会从源请求文件。
- 源将image.png返回给CDN服务器,其中包括可选的HTTP头部Time-to-Live(TTL),描述图像被缓存的时间。
- CDN缓存图像并将其返回给用户A。图像会在CDN中缓存,直到TTL过期。
- 用户B发送请求以获取相同的图像。
- 只要TTL未过期,图像将从缓存中返回。
其中有两个衡量CDN
服务质量的指标:
- 命中率:用户访问的资源恰好在缓存系统里,可以直接返回给用户,命中次数与所有访问次数之比
- 回源率:缓存里没有,必须用代理的方式回源站取,回源次数与所有访问次数之比
消息队列
消息队列是一种持久性组件,存储在内存中,用于支持异步通信。它作为缓冲区并分发异步请求。消息队列的基本架构很简单。称为生产者/发布者的输入服务创建消息,并将其发布到消息队列中。其他服务或服务器,称为消费者/订阅者,连接到队列并执行消息定义的操作。
数据中心
在正常运行时,用户会根据地理位置通过geoDNS路由到最近的数据中心,其中在美国东部的流量占x%,在美国西部的流量占*(100 - x)%*。geoDNS是一种DNS服务,根据用户所在地将域名解析为IP地址。
如果发生任何重大数据中心故障,我们会将所有流量引导到一个正常运行的数据中心。
技术挑战:
- 流量重定向:需要有效的工具将流量引导到正确的数据中心。根据用户所在地,可以使用geoDNS将流量引导到最近的数据中心。
- 数据同步:来自不同地区的用户可能使用不同的本地数据库或缓存。在故障转移情况下,流量可能会路由到一个数据中心,该数据中心的数据不可用。一种常见的策略是在多个数据中心之间复制数据。一项先前的研究展示了Netflix如何实现异步多数据中心复制。