一 最小连接数

最小连接数算法会根据后端服务器当前连接情况来选择连接数最小的服务器进行连接。从服务方的角度来说,每次都会选择有足够资源的服务器进行连接。

和轮询类似,除了最小连接数,也有加权最小连接数,保证能力强的服务器能够连接更多的客户端。

按照最小连接数实现负载均衡,后端分配的请求情况如下图所示。

链路负载均衡设备的部署位置 负载均衡连接数_算法

二 映射分配 

无状态的服务可采用轮询或随机算法。但有些服务是有状态的,例如,一些存储信息或具有缓存的服务。具有固定 Key 的请求要落在固定的节点上,这时就要通过静态分配来均衡分配请求。

1 注册路由表

建立一个路由表,存储的项目是 Key 和 后端节点的 IP 地址,表示某个 Key 要落到后端哪个 IP 地址上。这种方法要求了解 Key 的数量和需要的后端资源。通常用于缓存或固定存储,每个节点 Key 的数量不能大于存储的容量。另外也要考虑 Key 的范围、请求的数量,以及后端能否承担这些访问压力。

实际操作的方案如下:

方案一:

建立一个表格,存储 Key 的范围和对应的节点。例如,对于号码类的存储,存储的是各个区间段对应 IP 地址。

方案二:

把号码压缩,分成小的区间段。例如,10000个号码作为一个 unit,然后对 unit 采用建立表格的方式进行路由。

注册路由表进行扩容或迁移比较灵活且简单,查看配置文件就可以了解整体的情况,增减服务器的时候更新配置即可。缺点是要维护一个路由表,还要保证前端节点要实时同步路由表。

2 计算路由

还可以根据 Key 的值和后端节点的总数来计算 Key 落在哪个节点上。在 Nginx 可以根据 IP 地址进行 Hash 运算,然后用 Key 放入值“模”后端 Server 的数量值,得到要服务的后端 Server 的 IP 地址,让固定的 IP 地址的请求总是被反向代理到对应的后端。

计算路由的好处是简单,只要保持后端节点数量不变即可。缺点是如果后端节点数量更新,则会增加缓存失效的比例。