负载均衡算法有很多,下面介绍6种常见的负载均衡算法。
静态算法
1. 轮询(Round Robin)
将客户端请求按照顺序发送给不同的服务实例。通常要求服务实例是无状态的。
如下图所示:
第1个请求,先发给第1台服务器A
第2个请求,发给下一台服务器,即第2台服务器B
第3个请求,发给下下一台服务器,即第3台服务器C
第4个请求,由于3台服务器都已经轮流发送了一遍,因此需要从头开始,先发给第1台服务器A
以此类推...
2. 粘性轮询(Sticky Round Robin)
这是轮询算法的改进版本。
如果Alice的第1个请求发送给了服务A,那么后续的请求也会继续发送给服务A。
同样的,Bob的第1个请求发送给了服务B,那么后续的请求也会继续发送给服务B。
3. 加权轮询(Weighted Round Robin)
可以为每个服务设置权重。权重较高的服务将会处理比其他服务更多的请求。
如下图所示,服务A、B和C的权重分别为0.8、0.1和0.1,那么服务A将会接收并处理更多的请求。
可以看到,前3个请求都路由给了服务A,而第4个请求路由给了服务B。
4. 哈希(Hash)
该算法根据传入请求的IP或URL进行哈希函数运算,根据哈希运算的结果,将请求路由到相应的服务实例。
由于我们共有3台服务器,因此将哈希结果对3取模之后,得到的取值范围为0、1和2。
以IP作为哈希的Key为例:
对Alice的IP进行哈希取模处理之后,结果为0,因此Alice的请求都会路由到服务A。
而对Bob的IP进行哈希取模处理之后,结果为2,因此Bob的请求都会路由到服务C。
动态算法
5. 最小连接数(Least Connections)
新的请求会被发送到当前并发连接数最少的服务实例。
服务A、服务B和服务C,当前已建立的连接数分别是1000、100和10。
显然,服务C当前的连接数远小于服务A和服务B。因此,新的4个请求都路由给了服务C。
6. 最短响应时间(Least Response Time)
新的请求会被发送到响应时间最快的服务实例。
服务A、服务B和服务C,当前的请求响应时间分别是100ms、10ms和1ms。
显然,服务C当前的响应时间是最快的。因此,新的4个请求都路由给了服务C。
粘性轮询(Sticky Round Robin)和 哈希(Hash)
从效果上来看,粘性轮询算法和哈希算法似乎很相似。但其实,还是有很多差异的点。
例如:
- 粘性轮询是轮询算法的变种和改进版本,路由的规则还是通过轮询来实现的。而哈希,则是根据指定的Key(如IP、URL)进行哈希取模,来确定路由的目标服务。
- 粘性轮询通常需要维护存储客户端和服务实例之间的绑定关系,以使同一个客户端总是能够路由到同一个服务实例。
- 在需要扩容服务器时,粘性轮询可以保证客户端路由的服务器节点都是不变的,而哈希算法通常不可避免的部分客户端是需要重新路由到新加入的节点的。