负载平衡(Load balancer)


负载平衡系统将传入的客户端请求分发到计算资源 (如应用程序服务器和数据库)。在每种情况下, 负载平衡服务将处理结果从计算资源附 u返回到相应的客户端。负载平衡器在以下情况下有效:

  • 防止请求进入不健康的服务器
  • 防止重载资源
  • 帮助消除单点故障

    系统设计之负载平衡介绍_第1张图片

负载平衡器可以使用硬件或软件 (如 HAProxy) 来实现, 但相对来说硬件价格会昂贵一些。

其他的优点包括:

  • SSL终端
    可以在负载平衡系统里面对进来的请求进行解密或者对服务器处理完成的结果返回给客户端时进行加密。后端服务器 不必执行这些消耗时间和精力的操作。
  • 会话状态保持
    如果web应用没有保持跟踪会话的状态,可以发出cookies并将特定的客户端请求路由到相同的实例。


为了防止故障, 通常在active-passive和active-active模式下设置多个负载平衡器。

负载平衡器可以根据各种指标路由通信量, 包括

  • 随机
  • 最少加载
  • Session/cookies
  • 循环或加权循环
  • 4层
  • 7层

4层负载平衡

4层负载平衡是在传输层上的服务,根据传输层的信息进行请求分发。通常, 这涉及到源、目标 IP 地址和header中的端口, 而不是数据包的具体内容。4层负载平衡向上游服务器转发网络数据包, 执行网络地址转换 (NAT)。

7层负载平衡

7层负载平衡是在应用层上决定如何分发请求的。这可能涉及头部、消息和 cookie 的内容。7层负载平衡器终止网络通信, 读取消息, 进行负载平衡决策, 然后打开与所选服务器的连接。例如, 7 层负载平衡器可以将视频通信定向到承载视频的服务器, 同时将更敏感的用户计费流量定向到更安全的服务器。

尽管在硬件上的性能损耗比较小,但以灵活性为代价, 4 层负载平衡比7层需要更少的时间和计算资源。

水平缩放(水平扩展)

通过水平缩放,负载平衡可以提高性能和可用性。向系统中的单个节点添加资源 (或从中移除资源), 通常涉及将 cpu 或内存增加到一台计算机上叫做垂直扩展,相比使用商业机器进行扩展具有成本效益, 提高可用性。

水平缩放的缺点

  • 水平缩放会引入复杂性, 并涉及克隆服务器
    1. 服务器应该是无状态的: 它们不应包含任何与用户相关的数据, 如会话或配置文件图片
    2. 会话可以存储在集中式数据存储区 (如数据库 (SQL、NoSQL) 或持久缓存 (Redis、Memcached) 中
  • 下游服务器 (如缓存和数据库) 需要同时处理更多的连接, 因为上游服务器扩容了

负载平衡的缺点

  • 如果负载平衡器没有足够的资源或配置不正确, 则可能会成为性能瓶颈。
  • 引入负载平衡可以帮助消除单点故障,但会增加系统的复杂性的。
  • 单个负载平衡是会造成单点故障, 而配置多个负载平衡机将进一步提高复杂性。

    原文出处:https://github.com/donnemartin/system-design-primer#load-balancer