# 基于 Linux 的链路聚合实现

# 简介:

聚合链路是将多块网卡逻辑地连接到一起从而允许故障转移或者提高吞吐率的方法。提高服务器网络可用性。

# 实现方式:

# 基于内核支持 bonding 模块进行实现,该模块有两种加载方式

  1. 在编译内核时候编译进入内核源码当中,这样的话在 lsmod 时候不会显示该驱动模块
  2. 在编译内核时候选择以模块方式加载,这样的话在编译完成之后会产生一个 bonding.ko 的驱动文件

# 链路聚合的模式:

  • mod=0 ,即:(balance-rr) Round-robin policy(轮询)
    聚合口数据报文按包轮询从物理接口转发。
    – 负载均衡 — 所有链路处于负载均衡状态,轮询方式往每条链路发送报文这模式的特点增加了带宽,同时支持容错能力,当有链路出问题,会把流量切换到正常的链路上。
    – 性能问题 — 一个连接或者会话的数据包如果从不同的接口发出的话,中途再经过不同的链路,在客户端很有可能会出现数据包无序到达的问题,而无序到达的数据包需要重新要求被发送,这样网络的吞吐量就会下降。Bond0 在大压力的网络传输下,性能增长的并不是很理想。
    – 需要交换机进行端口绑定
  • mod=1,即: (active-backup) Active-backup policy(主 - 备份策略)只有 Active 状态的物理接口才转发数据报文。
    – 容错能力 — 只有一个 slave 是激活的 (active)。也就是说同一时刻只有一个网卡处于工作状态,其他的 slave 都处于备份状态,只有在当前激活的 slave 故障后才有可能会变为激活的 (active)。
    – 无负载均衡 — 此算法的优点是可以提供高网络连接的可用性,但是它的资源利用率较低,只有一个接口处于工作状态,在有 N 个网络接口的情况下,资源利用率为 1/N。
  • mod=2,即:(balance-xor) XOR policy(平衡策略)
    聚合口数据报文按源目 MAC、源目 IP、源目端口进行异或 HASH 运算得到一个值,根据该值查找接口转发数据报文
    – 负载均衡 — 基于指定的传输 HASH 策略传输数据包。
    容错能力 — 这模式的特点增加了带宽,同时支持容错能力,当有链路出问题,会把流量切换到正常的链路上。
    – 性能问题 — 该模式将限定流量,以保证到达特定对端的流量总是从同一个接口上发出。既然目的地是通过 MAC 地址来决定的,因此该模式在 “本地” 网络配置下可以工作得很好。如果所有流量是通过单个路由器,由于只有一个网关,源和目标 mac 都固定了,那么这个算法算出的线路就一直是同一条,那么这种模式就没有多少意义了。
    – 需要交换机配置为 port channel
  • mod=3,即:broadcast(广播策略)
    这种模式的特点是一个报文会复制两份往 bond 下的两个接口分别发送出去,当有对端交换机失效,我们感觉不到任何 downtime,但此法过于浪费资源;不过这种模式有很好的容错机制。此模式适用于金融行业,因为他们需要高可靠性的网络,不允许出现任何问题。
  • mod=4,即:(802.3ad) IEEE 802.3ad Dynamic link aggregation(IEEE 802.3ad 动态链接聚合)
    在动态聚合模式下,聚合组内的成员端口上均启用 LACP(链路汇聚控制协议)协议,其端口状态通过该协议自动进行维护。
    – 负载均衡 — 基于指定的传输 HASH 策略传输数据包。默认算法与 blance-xor 一样。
    – 容错能力 — 这模式的特点增加了带宽,同时支持容错能力,当有链路出问题,会把流量切换到正常的链路上。对比 blance-xor,这种模式定期发送 LACPDU 报文维护链路聚合状态,保证链路质量。
    – 需要交换机支持 LACP 协议
  • mod=5,即:(balance-tlb) Adaptive transmit load balancing(适配器传输负载均衡)
    在每个物理接口上根据当前的负载(根据速度计算)分配外出流量。如果正在接收数据的物理接口口出故障了,另一个物理接口接管该故障物理口的 MAC 地址。
    需要 ethtool 支持获取每个 slave 的速率
  • mod=6,即:(balance-alb) Adaptive load balancing(适配器适应性负载均衡)
    该模式包含了 balance-tlb 模式,同时加上针对 IPV4 流量的接收负载均衡,而且不需要任何 switch (交换机) 的支持。接收负载均衡是通过 ARP 协商实现的。bonding 驱动截获本机发送的 ARP 应答,并把源硬件地址改写为 bond 中某个物理接口的唯一硬件地址,从而使得不同的对端使用不同的硬件地址进行通信。

特别注意:

模式 1、5、6 不需要交换机的设置便可直接使用

模式 0、2、3、4 需要交换进行相应的策略协议配置才能进行正常使用

# 配置流程:

  1. 查看系统是否开启 bonding 功能

    如果没有开启则需要执行命令添加接口,该接口选择了 balance-rr 模式

    ip link add name bond0 type bond mode balance-rr

    如果是模块形式加载的,则需要先 insmod bonding.ko 加载成功之后才可进行添加虚拟接口操作

    image-20240328170109679

  2. 将物理网络接口添加到 Bond 接口。假设有两个物理接口 eth0eth1

    ip link set dev eth0 master bond0
    ip link set dev eth1 master bond0
  3. 配置 Bonding 接口的 IP 地址和子网掩码

    image-20240328172715327

    ip addr add 3.3.3.232/22 brd + dev bond0
  4. 最后,启用 Bonding 接口

    ip link set up dev bond0
  5. 设置 bonding 的监听参数

    tee /sys/class/net/bond0/bonding/miimon <<< 100
    tee /sys/class/net/bond0/bonding/updelay <<< 200

最终效果执行如下命令进行检测参数是否正确

cat /proc/net/bonding/bond0

image-20240328171938659

需要更改模式则需要执行如下命令,选择自己需要的模式,需要再接口 down 的情况下进行更改模式

echo "active-backup 1" > /sys/class/net/bond0/bonding/mode

可以看到网络是正常可以 ping 通的,而且目前选择的网络接口为 eth11

image-20240328173001931

当选择把 eth11 down 之后

image-20240328173100194

虚拟网卡 bond0 会自动切换到另一张网卡,并且网络依然保持畅通

image-20240328173146001

完整的设置命令脚本如下:

echo "active-backup 1" > /sys/class/net/bond0/bonding/mode		#选择自己想要的模式
ip link set dev eth11 master bond0
ip link set dev eth13 master bond0
ip addr add 3.3.3.233/22 brd + dev bond0		#设置 IP
ip link set up dev bond0
tee /sys/class/net/bond0/bonding/miimon <<< 100			#设置每秒钟监控网络链路状态的次数
tee /sys/class/net/bond0/bonding/updelay <<< 200		#故障转移后等待重新激活物理接口的毫秒数