system-design-prime
可用性模式
有两种支持高可用性的模式: 故障切换(fail-over)和复制(replication)。
故障切换
工作到备用切换(Active-passive)
关于工作到备用的故障切换流程是,工作服务器发送周期信号给待机中的备用服务器。如果周期信号中断,备用服务器切换成工作服务器的 IP 地址并恢复服务。
宕机时间取决于备用服务器处于“热”待机状态还是需要从“冷”待机状态进行启动。只有工作服务器处理流量。
工作到备用的故障切换也被称为主从切换。
双工作切换(Active-active)
在双工作切换中,双方都在管控流量,在它们之间分散负载。
如果是外网服务器,DNS 将需要对两方都了解。如果是内网服务器,应用程序逻辑将需要对两方都了解。
双工作切换也可以称为主主切换。
缺陷:故障切换
- 故障切换需要添加额外硬件并增加复杂性。
- 如果新写入数据在能被复制到备用系统之前,工作系统出现了故障,则有可能会丢失数据。
复制
主─从复制和主─主复制
这个主题进一步探讨了数据库部分:
CDN 内容分发网络
内容分发网络 CDN(英语:Content Delivery Network或Content Distribution Network)是一个全球性的代理服务器分布式网络,它从靠近用户的位置提供内容。通常,HTML/CSS/JS,图片和视频等静态内容由 CDN 提供,虽然亚马逊 CloudFront 等也支持动态内容。CDN 的 DNS 解析会告知客户端连接哪台服务器。
CDN 的分类
Pull CDN
当用户第一次访问CDN的时候,CDN上是没有资源的,这时候CDN会去向服务器拉取资源。之后的访问就直接在CDN服务器中返回就可以。
push CDN
服务器可以在用户访问资源之前,把资源push给CDN服务器。
如何选择哪种CDN?
关于使用哪种 CDN 类型的决定在很大程度上取决于流量和下载量。从长远来看,托管视频和播客(又名大量下载)的旅游博客会发现推送 CDN 更便宜、更高效,因为在您主动将其推送到 CDN 之前,CDN 不会重新下载内容。拉式 CDN 可以通过在 CDN 服务器上保留最受欢迎的内容来帮助高流量小下载的网站。内容的后续更新(或“拉取”)频率不足以使成本超过推送 CDN 的成本。
LoadBlancer 负载均衡器
负载均衡器将传入的请求分发到应用服务器和数据库等计算资源。无论哪种情况,负载均衡器将从计算资源来的响应返回给恰当的客户端。负载均衡器的效用在于:
- 防止请求进入不好的服务器
- 防止资源过载
- 帮助消除单一的故障点
通常会设置采用工作─备用 或 双工作 模式的多个负载均衡器,以免发生故障。
负载均衡方式
轮询调度(Round Robin Scheduling)
轮询调度是一种简单的负载均衡算法,它按照固定的顺序将请求依次分配给每个服务器。具体步骤如下:
- 服务器列表被初始化,并按某种顺序排列。
- 当一个请求到达时,负载均衡器将该请求分配给列表中的下一个服务器。
- 服务器列表顺序循环,即当最后一个服务器处理完请求后,下一个请求将再次分配给第一个服务器。
轮询调度的优点是实现简单,且能够均匀地分配负载。然而,它没有考虑服务器的实际负载或性能差异,可能导致某些服务器过载,而其他服务器则处于空闲状态。
加权轮询调度(Weighted Round Robin Scheduling)
加权轮询调度是对轮询调度的一种改进,它允许为每个服务器分配一个权重值,以反映其处理能力或性能。权重值高的服务器将处理更多的请求。具体步骤如下:
- 每个服务器被分配一个权重值,表示其相对处理能力。
- 负载均衡器维护一个服务器列表,并根据权重值调整每个服务器的请求分配频率。
- 当一个请求到达时,负载均衡器根据权重值将请求分配给相应的服务器。
加权轮询调度的优点是能够更好地适应服务器性能的差异,提高整体系统的效率。然而,它需要预先知道或估计每个服务器的处理能力,并且在服务器性能动态变化时可能需要重新调整权重。
四层负载均衡
四层负载均衡根据监看传输层的信息来决定如何分发请求。通常,这会涉及来源,目标 IP 地址和请求头中的端口,但不包括数据包(报文)内容。四层负载均衡执行网络地址转换(NAT)来向上游服务器转发网络数据包。
七层负载均衡器
七层负载均衡器根据监控应用层来决定怎样分发请求。这会涉及请求头的内容,消息和 cookie。七层负载均衡器终结网络流量,读取消息,做出负载均衡判定,然后传送给特定服务器。比如,一个七层负载均衡器能直接将视频流量连接到托管视频的服务器,同时将更敏感的用户账单流量引导到安全性更强的服务器。
以损失灵活性为代价,四层负载均衡比七层负载均衡花费更少时间和计算资源,虽然这对现代商用硬件的性能影响甚微。