链路负载均衡详解

〇、链路负载均衡的功能（What）

链路负载均衡的作用是将内网用户访问外网的流量分发到多条链路中。就好比从公司到家，有好几条路可以选，链路负载均衡可以帮助咱们在下班的时候选一条最快到家躺着的路，或者有最好风景的路，再或者是有烧烤的路。

从功能上，我们可以看出链路负载均衡的场景：

对于企业来说，应用多出口链路可以防止某一出口链路故障对公司业务的影响，也能避免跨 ISP 访问资源慢的问题。

一、为什么需要链路负载均衡（Why）

上文我们说，链路负载均衡的主要功能是选路，而网络中负责选路的还有路由，而且路由也有能够同时应用于多出口链路的等价静态路由和策略路由，那为什么我们还需要链路负载均衡？

等价静态路由与策略路由

要回答这个问题，首先我们要 define 等价静态路由和策略路由的概念：

等价静态路由：手动配置的，具有相同目的地、相同优先级、不同下一跳的两条或多条静态路由。数据转发时会随机选择其中的一条静态路由；

策略路由：手动配置的，可以匹配四元组、角色、ISP、应用、域名等多维信息，在多个下一跳中根据不同的选路算法进行选路的策略。

根据等价静态路由和策略路由的概念可以看出：两者都可以进行多出口的选路，而且策略路由的功能更加强大，完成了更接近于链路负载均衡的功能。但是，两者的缺点也很明显：策略都是静态的，而链路却是动态的。

链路负载均衡

链路有健康度的概念，在动态的网络环境中，链路可能发生故障、可能拥塞，有着各种意外情况。链路负载均衡的需求便是来源于此，因为静态的路由策略无法感知到链路的动态变化，所以需要一种增强的策略，在路由匹配的前提下，能够根据链路的状态动态的进行选路。

链路负载均衡是对路由功能的一种增强，依赖于路由的匹配结果。

二、链路负载均衡要实现什么（How）

要实现链路负载均衡，首先我们要整理出其特性：

链路基本信息维护：出接口、下一跳、运营商、带宽、优先级、权重、健康度等；

链路状态感知：

接口状态：启用、停用、新增 IP、删除 IP、类型为路由口、交换口...

链路状态：与目的相关，丢包率、带宽、负载...

链路池：链路集合，是负载均衡的选择范围；

链路负载均衡算法：随机、轮询、加权轮询、优先级、负载率、就近选路...

除了以上特性外，考虑到存在客户端到服务器的多条连接被 NAT 转为不同的 IP 的情况，可能被服务器认为是攻击而被阻断，所以需要对特定时间内具有相同特征（如四元祖）的会话进行链路选择跟随，称为 “会话保持”。

链路状态感知

监听接口状态

使用 ping 等协议感知链路状态

不建议过度的感知链路状态，因为会占用链路带宽及服务器的资源。通常使用流量统计等可以计算出链路的负载率信息，结合接口状态监测即可。

链路负载均衡算法

随机

通过 hash 算法从正常链路中选择一条，如果没有，从过载链路中随机选择

轮询

在正常链路中按序选择一条，如果没有，从过载链路中按序选择

加权轮询

按权值比重将连接分配到正常链路列表中，同上，如果没有，从过载链路中按加权轮询选择一条。

加权的原理基本上就是根据权重大小每次模拟选择一条链路，然后将此条链路权重减一，下次模拟选路按新的权重进行选路，最终生成一个选路列表。实际选路时然后轮询这个选路列表。假设存在 a:2、b:4、c:1 三条链路，按照权重模拟选路生成列表为：{b, b, a, b, a, b, c}，实际选路就按此列表轮询选择。

优先级

按优先级在正常链路列表中选择一条，同上，如果没有，从过载链路中按优先级选择一条

负载率

根据链路的流量与链路带宽的比例计算负载率，选择最小负载的一条

就近选路

根据目的 ip 查询 ISP 信息库，找到目的所在的 ISP，选择为此 ISP 的链路。可以结合其他算法对选择结果做进一步负载均衡。

会话保持

根据四元组及选路结果建立会话保持表，会话保持表中项定时过期。新连接到达后查询会话保持表，如果匹配成功，则更新会话保持表的过期时间；如果没有匹配成功，则新加会话保持表项。

Done!

此文由 Mix Space 同步更新至 xLog
原始链接为 https://www.vikifish.com/posts/network/linklb