1 负载均衡

1.1 Nginx

nginx [engine x] is an HTTP and reverse proxy server, a mail proxy server, and a generic TCP/UDP proxy server …

serve 功能,比如 OpenResty 在用
proxy 功能,代理 L4、L7,3w QPS。支持 Failback。
缓存静态文件,内部服务在用,外部服务一般用 CDN 缓存

1.2 Keepalived

The main goal of this project is to provide simple and robust facilities for loadbalancing and high-availability to Linux system …

对服务器健康检测,并执行故障转移。当人工修复故障服务器后,Keepalived 自动将其加入到服务器集群中。
可以工作在 L3、L4、L7:

  • L3。发送 ICMP 请求(Ping),检查 IP 地址是否激活
  • L4。检测 TCP、UDP 端口,检查端口是否已经占用
  • L7。执行 HTTP GET,然后对结果 MD5 哈希,检查是否符合预期值

1.3 LVS

The Linux Virtual Server as an advanced load balancing solution can be used to build highly scalable and highly available network services …

DR 模式只分发请求,不处理流量,负载均衡性能强,代理 L4 有 30w QPS。作为对比,负载均衡硬件 F5的 QPS 是 50w。
未适配 numa 架构多CPU,默认配置下吞吐量比 Nginx 低,需要自行调优。

1.4 DNS

代理 L3,同一个域名可以映射不同的 VIP。

2 策略

2.1 Random

随机。请求随机分配到不同 backend。
Nginx 使用 weight 支持加权,使用 ip_hash 会话保持。

适用场景

每个 backend 性能相近,否则使用加权。
服务器 [A, B, C] 对应权重 [5, 1, 1],进行7次负载均衡后,随机加权选择的序列为 [A, A, B, A, B, A, A],但选择次数多了一定符合加权概率。

2.2 Round Robin

轮询。请求按时间顺序分配到不同 backend。
Nginx、Dubbo 实现平滑轮询算法。

适用场景

每个 backend 性能相近,否则使用加权。
服务器 [A, B, C] 对应权重 [5, 1, 1],进行7次负载均衡后,平滑轮询的序列为 [A, A, B, A, C, A, A],非平滑轮询的序列为 [A, A, A, A, A, B, C]。

2.3 Consistent Hash

一致性哈希。使用一致性哈希解决扩容问题。
数据倾斜问题使用虚拟节点解决。

适用场景

要保证某一类请求顺序处理,使用一致性哈希算法 + 队列。
比如把同一个用户的请求发送到同一台机器上去执行,就意味着把某一类请求发送到同一台机器上去执行。所以我们只需要在该机器上运行的程序中保证顺序执行就行了,比如你加一个队列。

2.4 Least Active

最小活跃数,请求发给活动连接最少的 backend。
在所有 backend 中选出活跃数最少的一个,如果选不出来,再根据权重选,如果权重也一样,则随机选择。
Dubbo 要求实现 activeFilter,在方法调用前后维护活跃数,响应越快的服务器堆积的请求越少,对应的活跃数也少。

适用场景

2.5 Shortest Response

最短响应时间。请求调用成功响应时间最短的 backend。
在所有 backend 中选出平均响应时间最短的一个,如果选不出来,再根据权重选,如果权重也一样,则随机选择。

适用场景

参考文献