Linux使用bonding实现双网冗余
作者:mmseoamin日期:2024-01-25

1、简介

linux bonding 是一种将多个物理网卡绑定为一个逻辑网卡的技术,它可以实现网络的冗余、负载均衡和带宽扩展等功能。linux bonding 是 linux 内核中提供的一个模块,它支持七种工作模式,不同的模式有不同的特点和适用场景。linux bonding 的配置和管理可以通过一些命令或工具来进行,例如 ifenslave、nmcli、ethtool 等。linux bonding 的状态和参数可以通过 /proc/net/bonding 或 ethtool 命令来查看和修改。

2、bonding模式

bonding技术提供了七种工作模式,在使用的时候需要指定一种,每种有各自的优缺点:

Mode 0(balance-rr):又称为“round-robin”模式。数据包按照轮询的方式依次发送到每个接口,实现负载均衡。这种模式不提供冗余性。(平衡抡循环策略,需要配置交换机静态聚合)

Mode 1(active-backup):又称为“active-passive”模式。只有一个接口处于活动状态,用于传输数据。其他接口处于备用状态,仅在活动接口故障时接管。提供故障切换和冗余性。(主-备份策略)

Mode 2(balance-xor):使用源和目的MAC地址以及传输层协议和端口号来选择要发送的接口。提供负载均衡和冗余性。(平衡策略,需要配置交换机静态聚合)

Mode 3(broadcast):将所有数据包发送到所有接口。实现广播传输,但不提供负载均衡或冗余性。(广播策略,需配置交换机静态聚合)

Mode 4(802.3ad):也称为“LACP”(Link Aggregation Control Protocol)模式。使用LACP协议动态协商绑定接口的工作方式。提供负载均衡和冗余性。(IEEE 802.3ad 动态链接聚合,需要交换机动态聚合)

Mode 5(balance-tlb):使用负载传输平衡(TLB)算法在传输和接收时进行负载均衡。这种模式仅在传输方向上实现负载均衡,接收方向上只使用一个接口。(适配器传输负载均衡)

Mode 6(balance-alb):使用自适应负载平衡(ALB)算法在传输和接收时进行负载均衡。这种模式在传输和接收方向上都实现负载均衡,不需要特殊的交换机支持。(适配器适应性负载均衡)

需要说明的是如果想做成mode 0的负载均衡,仅仅设置这里options bond0 miimon=100 mode=0是不够的,与网卡相连的交换机必须做特殊配置(这两个端口应该采取聚合方式),因为做bonding的这两块网卡是使用同一个MAC地址.从原理分析一下(bond运行在mode 0下):

mode 0下bond所绑定的网卡的IP都被修改成相同的mac地址,如果这些网卡都被接在同一个交换机,那么交换机的arp表里这个mac地址对应的端口就有多 个,那么交换机接受到发往这个mac地址的包应该往哪个端口转发呢?正常情况下mac地址是全球唯一的,一个mac地址对应多个端口肯定使交换机迷惑了。所以 mode0下的bond如果连接到交换机,交换机这几个端口应该采取聚合方式(cisco称为 ethernetchannel,foundry称为portgroup),因为交换机做了聚合后,聚合下的几个端口也被捆绑成一个mac地址.我们的解 决办法是,两个网卡接入不同的交换机即可。

mode6模式下无需配置交换机,因为做bonding的这两块网卡是使用不同的MAC地址。

3、实现双冗余模式步骤

  • 首先,你需要确认你的板子上的两个网卡是否支持 bonding 模块,以及你的 linux 系统是否已经安装了 bonding 模块。你可以使用 lsmod | grep bonding 命令来查看是否已经加载了 bonding 模块,如果没有,你可以使用 modprobe bonding 命令来加载它。
  • 其次,你需要选择一个合适的 bonding 模式来实现双网冗余。根据你的需求,我建议你使用 mode=1 (active-backup) 模式,这个模式只有一个网卡是活动的,另一个是备份的,当活动网卡出现故障时,备份网卡会自动接管流量。这个模式不需要交换机的特殊配置,也不会影响网络性能。
  • 然后,你需要修改你的板子上的两个网卡的配置文件,以及创建一个 bond 的配置文件。假设你的两个网卡分别是 eth0 和 eth1 ,那么你需要修改 /etc/sysconfig/network-scripts/ifcfg-eth0 和 /etc/sysconfig/network-scripts/ifcfg-eth1 文件,将它们设置为 bond 的从属网卡。具体的修改内容如下:

            DEVICE=eth0 # ifcfg-eth1 文件对应的位置修改为 eth1

            USERCTL=no

            ONBOOT=yes

            MASTER=bond0

            SLAVE=yes

            BOOTPROTO=none

            然后,在 /etc/sysconfig/network-scripts/ 目录下创建一个文件 ifcfg-bond0 ,将它设置为 bond         的主网卡,并指定 IP 地址、子网掩码、网关等信息。具体的内容如下:

            DEVICE=bond0

            TYPE=Bond

            BOOTPROTO=none

            USERCTL=no

            IPADDR=192.168.1.100 # 根据你的实际情况修改

            NETMASK=255.255.255.0 # 根据你的实际情况修改

            GATEWAY=192.168.1.1 # 根据你的实际情况修改

            BONDING_OPTS="mode=1 miimon=100" # 指定 bonding 模式为 1 ,监测间隔为 100 毫秒

            ONBOOT=yes

            BONDING_MASTER=yes

    • 最后,你需要重启网络服务或者重新启动板子,让配置生效。你可以使用 systemctl restart network 命令来重启网络服务,或者使用 reboot 命令来重新启动板子。重启后,你可以使用 cat /proc/net/bonding/bond0 命令来查看 bond 的状态和参数,确认是否成功实现了双网冗余。