我在CentOS6.3上创建了一个3网卡的bonding接口,使用mode=6,这样就不需要交换机的硬件支持了。
这是粘合文件:
[root@~]cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)
Bonding Mode: adaptive load balancing
Primary Slave: None
Currently Active Slave: eth3
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: 00:e0:66:d3:70:b1
Slave queue ID: 0
Slave Interface: eth2
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: 00:e0:66:d3:70:b2
Slave queue ID: 0
Slave Interface: eth3
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 1
Permanent HW addr: 00:e0:66:d3:70:b3
Slave queue ID: 0
我使用三台 Windows 服务器连接bonding IP,理论上每台服务器会得到不同的MAC地址,比如服务器1连接eth1,服务器2连接eth2,服务器3连接eth3,这样负载就均衡了。
但是服务器1连接的是eth2,服务器2连接的是eth3,但是服务器3又连接的是eth2,eth1一直没用。试了很多次都失败了。最后我手动绑定了IP地址和MAC地址才解决这个问题。
为什么会发生这种情况?有没有办法让每个 NIC 都得到利用?只有三台服务器连接,因此理论上每台服务器应该连接到不同的 NIC。
多谢!
答案1
您已做出以下假设:
每个服务器将获得不同的 MAC 地址。例如,服务器 1 将连接到 eth1,服务器 2 将连接到 eth2,服务器 3 将连接到 eth3。
但这并不正确。根据Linux 内核绑定文档:
不同的对等体使用不同的硬件地址
但不是每一个对等体将要使用不同的硬件地址。
负载平衡算法基于哈希表,您需要在同一个广播域上使用三个以上的主机来实现所有从属服务器之间的平等负载平衡。
如果有大量主机与绑定设备进行通信,比如说同一个广播域中有数十或数百台主机,那么所有绑定从属设备上的主机数量将相当相等。
对于您所追求的负载平衡类型,最好使用xmit_hash_policy
设置为layer2+3
或 的模式 2 或模式 4 layer3+4
,但这只能进行传输负载平衡,是否提供类似的入站负载平衡则取决于交换机。
(注意:layer3+4
与模式 4 不兼容,如果这样配置,您的交换机可能会或可能不会抱怨,请尝试一下)
实际上,如果您希望三个 Windows 系统通过不同的接口与 Linux 系统进行通信,那么唯一 100% 可靠的方法是分离第 2 层的接口 - 将每个 eth1/eth2/eth3 放在具有不同 IP 的不同 VLAN 中,并且每个 Windows 系统都通过不同的 IP 了解 Linux 系统。