4. 查询Bonding配置
=================================
4.1 Bonding配置
---------------------------------
每个bonding设备对应于一个只读文件,存在于/proc/net/bonding目录,文件内容包括bonding配置的信息,选项以及每个slave的状态。
例如,在使用参数mode=0,miimon=1000时,加载驱动后,/proc/net/bonding/bond0的内容为:
Ethernet Channel Bonding Driver: 2.6.1 (October 29, 2004)
Bonding Mode: load balancing (round-robin)
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 1000
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth1
MII Status: up
Link Failure Count: 1
Slave Interface: eth0
MII Status: up
Link Failure Count: 1
根据你配置、状态、以及bonding驱动版本的差异,上述内容的精确格式和内容有可能不同。
4.2 网路配置
---------------------------------
网络配置可以通过ifconfig命令查看,Bonding设备会设上MASTER标记,slave设备会设上SLAVE标记。ifconfig的输出不包含哪个slave关联于哪个master的关系。
在上例中,bond0接口是master(MASTER),而eth0和eth0是slave(SLAVE)。注意除了TLB和ALB模
式外,所有bond0的slave和bond0有着同样的MAC地址(HWaddr),TLB和ALB需要每个slave有独立的MAC地址。
# /sbin/ifconfig
bond0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:7224794 errors:0 dropped:0 overruns:0 frame:0
TX packets:3286647 errors:1 dropped:0 overruns:1 carrier:0
collisions:0 txqueuelen:0
eth0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0
TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0
collisions:0 txqueuelen:100
Interrupt:10 Base address:0x1080
eth1 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0
TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
Interrupt:9 Base address:0x1400
5. 交换机配置
=================================
在本节中,"交换机(switch)"指被bond设备直接连接的系统(也就是说,另一端电缆连接着的),这可能是一个专职的交换机设备,也可能是其它的系统(比如,另一个运行Linux的系统)。
active-backup、balance-tlb和balance-alb模式不需要对交换机做任何的配置。
802.3ad模式需要交换机有对应的配置为802.3ad聚合的端口,具体的配置方法因交换机类型而异,比如,Cisco 3550系列交换机要求对应的端口首先必须被分组在一个单独的etherchannel实例,然后这个etherchannel设置为"lacp"模式已启用802.3ad(取代标准EtherChannel)。
balance-rr、balance-xor和broadcast模式通常需要交换机对应的端口被分组在一起,不同的交换机对分组有着不同的命名,可能会被叫做“etherchannel”(比如上文的Cisco示例),或者叫做“trunk group”,或者其他类似的命令。对于这些模式,每个交换机也会有它自己的针对到bond的传输策略的配置选项。典型的选择包括对每个MAC地址或者IP地址进行XOR操作,两端的传输策略不一定完全一致。对这三种模式,bonding模式会针对一个EtherChannel组选择一种传输策略;所有这三种模式都会和另一个EtherChannel组进行互操作。
----------------------------------------------------------------------------------------
The balance-rr, balance-xor and broadcast modes generally
require that the switch have the appropriate ports grouped together.
The nomenclature for such a group differs between switches, it may be
called an "etherchannel" (as in the Cisco example, above), a "trunk
group" or some other similar variation. For these modes, each switch
will also have its own configuration options for the switch's transmit
policy to the bond. Typical choices include XOR of either the MAC or
IP addresses. The transmit policy of the two peers does not need to
match. For these three modes, the bonding mode really selects a
transmit policy for an EtherChannel group; all three will interoperate
with another EtherChannel group.
----------------------------------------------------------------------------------------
6. 支持802.1q VLAN
=================================
我们可以使用8021q驱动在一个bond接口上配置VLAN设备,然而,只有来自8021q设备和经过(pass
through)bonding的数据包缺省会被打上VLAN标记。自生成的数据包,比如,bonding的学习包、在ALB模式生成ARP包或者ARP监测机制的ARP包,这些包都会被bonding自身在内部打上标记。因此,bonding必须要“学习”在它上面的VLAN ID的配置,然后使用这些ID来标记自生成的数据包。
简单起见,为了支持那些可以使用VLAN hardware acceleration offloading的适配器,bonding接
口把它自身声明为一个完全hardware offloading能力的设备,它通过获取add_vid/kill_vid通知来获取必备的信息,然后它把这些动作传播给slave。在混合的适配器类型下,那些打上硬件加速标记的数据包,如果经过一个不支持offloading的适配器,bonding驱动将“un-accelerated”,因此VLAN标记依然存在正确的位置。
----------------------------------------------------------------------------------------
For reasons of simplicity, and to support the use of adapters
that can do VLAN hardware acceleration offloading, the bonding
interface declares itself as fully hardware offloading capable, it gets
the add_vid/kill_vid notifications to gather the necessary
information, and it propagates those actions to the slaves. In case
of mixed adapter types, hardware accelerated tagged packets that
should go through an adapter that is not offloading capable are
"un-accelerated" by the bonding driver so the VLAN tag sits in the
regular location.
----------------------------------------------------------------------------------------
在从属slave至少有一个的情况下,VLAN接口"必须"被增加在bonding接口的最上面。直到第一个slave加入前,bonding接口的硬件地址将是00:00:00:00:00:00。如果VLAN接口在第一个slave加入前被创建,它会选择一个全0的硬件地址,一旦第一个slave加入到bond,bond设备自己就会选择slave的硬件地址,VLAN设备也将会使用这个地址。
同时,要注意到如果所有的slave都被从bond移除,而bond上还有一个或多个VLAN接口时,类似的问题也会发生,当新的slave加入,bonding接口将获取第一个slave的硬件地址,而这可能和当前VLAN接口的硬件地址不一样(当前VLAN接口的硬件地址是从之前的slave上获取的)。
有两种方法来保证VLAN设备一直使用正确的硬件地址,即使所有slave被从bond接口上移除:
1. 移除所有VLAN接口,然后重新创建它们
2. 手动设置bonding接口的硬件地址,使它和VLAN接口的硬件地址一致。
要注意改变一个VLAN接口的硬件地址将会改变它下面的设备(比如bonding接口)到混杂模式,这有可能不是你期望的结果。
7. 链路监控
=================================
当前的bonding驱动支持两种模式,来监控slave设备的链路状态:ARP监控和MII监控。
由于bonding驱动自身的实现限制,现在我们不可能同时启用ARP和MII监控。
7.1 ARP监控操作
---------------------------------
ARP监控正如其名字所暗示的:它想网络上的对端系统发送ARP请求,并且通过ARP相应作为链路是否可用的标志,这可以保证网络两端的流量确实是通的。
ARP监控依赖于设备驱动来验证流量是否是通的,进一步,驱动必须保留上次接收时间,dev->last_rx,以及传输起始时间,dev->trans_start。如果这些值不会被驱动更新,则ARP监控立刻会认为对应于该驱动的slave出现了故障,这些slave将会进入断开状态。如果网络监控工具(比如tcpdump)显示ARP请求和相应都正常,那有可能是你的设备驱动没有更新last_rx和trans_start。
7.2 配置多ARP目的地址
---------------------------------
尽管ARP监控可以只用一个目的地址来实现,但在高可靠性(High Availability)环境下,如果能够对多个目的地址进行监控也是很有用的。在只有一个目的地址的情况下,如果目标本身被关闭或者遇到问题以致无法响应ARP请求,这时额外的一个目标(或更多)可以增加ARP监控的可靠性。多ARP目的地址之间必须以逗号分割,如下:
# 3个目的地址的ARP监控选项示例
alias bond0 bonding
options bond0 arp_interval=60 arp_ip_target=192.168.0.1,192.168.0.3,192.168.0.9
如果只有一个目的地址,配置也很类似:
# 只有1个目的地址的ARP监控选项示例
alias bond0 bonding
options bond0 arp_interval=60 arp_ip_target=192.168.0.100
7.3 MII监控操作
---------------------------------
MII监控通过监控本地网络接口的载波状态来实现监控链路状态。可以通过3种方法之一来实现:通过依赖设备驱动来维护载波状态;通过查询设备的MII寄存器;或者通过给设备发送ethtool查询。
如果模块参数use_carrier被设为1(缺省值),MII监控将会依赖于设备来获取载波状态信息(通过netif_carrier子系统)。正如前文介绍的use_carrier参数信息,如果MII监控不能发现设备的载波消失(比如当电缆被物理拔断时),那有可能时设备不支持netif_carrier。
如果use_carrier为0,MII监控首先会查询设备(通过ioctl)的MII寄存器并检查链路状态,如果查询失败(返回载波断开不属于失败),则MII监控会发送一个ethtool ETHOOL_GLINK查询以尝试获取类似的信息,如果两种方法都失败了(设备不支持或者在处理MII寄存器和ethtool查询时发生了错误),那么MII监控将会假定链路是正常的。
8. 潜在问题缘由
=================================
8.1 路由历险记
---------------------------------
如果配置了bonding,很重要的一点是slave设备不能拥有传递到master的路由(或者,通常根本没有路由),比如,假定bonding设备bond0有两个slave:eth0和eth1,路由表如下:
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.0.0.0 0.0.0.0 255.255.0.0 U 40 0 0 eth0
10.0.0.0 0.0.0.0 255.255.0.0 U 40 0 0 eth1
10.0.0.0 0.0.0.0 255.255.0.0 U 40 0 0 bond0
127.0.0.0 0.0.0.0 255.0.0.0 U 40 0 0 lo
路由配置有可能持续更新设备的接收/发送次数(ARP监控需要),但可能旁路了bonding设备(在这个示例里,外出到网络网络10的流量将会在bond0之前使用eth0或者eth1)。
ARP监控(以及ARP本身)可能会被这个配置所混淆,因为ARP请求(ARP监控生成)会在某个接口(bond0)上发出,但对应的响应在另一个接口上到达(eth0),这个响应将会被视为一个未关联ARP响应(因为ARP通过接口进行匹配)。MII监控不会被路由表状态所影响。
这里的解决方法是:保证slave没有它们自己的路由,如果由于某些原因它们必须要有,这些路由不要传递到它们的master,通常情况下都是这样的,但某些特别的配置或者错误的操作或者静态添加路由可能会导致问题。
8.2 Ethernet设备重命名
---------------------------------
有些系统,它的网络配置脚本没有直接把网络接口名和物理设备关联(如果关联的话,同样的物理设备总是有同样的"ethX"名),对于这些系统,可能需要增加一些特别的逻辑到/etc/modules.conf或者/etc/modprobe.conf(由系统中安装的部件决定)。
比如,某个modules.conf包含如下内容:
alias bond0 bonding
options bond0 mode=some-mode miimon=50
alias eth0 tg3
alias eth1 tg3
alias eth2 e1000
alias eth3 e1000
如果eth0和eth1都是bond0的slave,则当bond0接口启用时,这两个设备可能被重新排序,这是因为
bonding会被首先加载,然后它的slave设备驱动才会加载,既然没有其他驱动被加载,当e1000驱动加载时,它将会把eth0和eth1认为是它的设备,但是bonding配置尝试把eth2和eth3从属过来(而eth2和
eth3可能被赋予tg3设备)。
增加如下内容:
add above bonding e1000 tg3
这样,当bonding加载时,将会导致modprobe在tg3前加载e1000。该命令在modules.conf手册里有完
整的描述。
对于使用modprobe.conf(或者modprobe.conf.local)的系统,同样的问题也会发生。这时,可以在modprobe.conf(或modprobe.conf.local)加入如下内容(所有内容在同一行,这里清晰起见分行了):
install bonding /sbin/modprobe tg3; /sbin/modprobe e1000;
/sbin/modprobe --ignore-install bonding
这将会导致,当加载bonding模块时,除了执行正常的操作,同时还执行指定的命令,该命令以正确的顺序加载设备驱动,然后以--ignore-install来调用modprobe,这将导致随后调用通常的操作。完整的描述在modprobe.conf和modprobe的手册里。
8.3 速度变慢或Miimon无法监测到链路异常
---------------------------------
缺省地,bonding会启用use_carrier选项,这将使得bonding信任设备来维护载波状态。
正如在上文选项一节所述,某些驱动不支持netif_carrier_on/_off链路状态跟踪系统,当启用use_carrier,bonding将会永远认为链路是正常的,而不管它们的实际状态。
而且,某些驱动虽然支持netif_carrier,但并不实时维护它,比如只是以某个固定的间隔轮训。在这种情况下,miimon会检测到链路异常,但是可能在某个很长的时间间隔后,如果发现miimon很慢才能检测到链路异常,尝试着设置use_carrier=0,看看能不能改善。如果可以改善,则很可能是驱动需要一个很长的固定间隔才会检查载波状态,而且没有缓存MII寄存器的值(因此当use_carrier=0时查询寄存器可以正常工作);如果use_carrier=0不能解决问题,则可能是驱动缓存了MII寄存器的值,或者是其它的问题。
同时,请记住miimon只会检查设备的载波状态,它无法判定设备是否处于打开状态,或对端交换机的状态,或交换机拒绝传输流量,即使载波状态依然正常。
9. SNMP代理
=================================
如果运行SNMP代理,bonding驱动应该在任何网络驱动参与到bond前被加载,这个要求是由于接口索引(ipAdEntIfIndex)被关联到第一个有着指定IP地址的被发现的接口,也就是说,对每个IP地址只有一个ipAdEntIfIndex,比如,如果eth0和eth1是bond0的slave,eth0的驱动在bonding驱动前被加载,IP地址的接口将会被关联到eth0接口,配置如下,IP地址192.168.1.1将会使用接口索引2,这将指向ifDescr表(ifDescr.2)中的eth0:
interfaces.ifTable.ifEntry.ifDescr.1 = lo
interfaces.ifTable.ifEntry.ifDescr.2 = eth0
interfaces.ifTable.ifEntry.ifDescr.3 = eth1
interfaces.ifTable.ifEntry.ifDescr.4 = eth2
interfaces.ifTable.ifEntry.ifDescr.5 = eth3
interfaces.ifTable.ifEntry.ifDescr.6 = bond0
ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.10.10.10 = 5
ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.192.168.1.1 = 2
ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.74.20.94 = 4
ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.127.0.0.1 = 1
如果在所有参与到bond的网络驱动加载前加载bonding驱动,我们可以避免这个问题。如下是一个示例,它会首先加载bonding驱动,IP地址192.168.1.1被正确地关联到ifDescr.2:
interfaces.ifTable.ifEntry.ifDescr.1 = lo
interfaces.ifTable.ifEntry.ifDescr.2 = bond0
interfaces.ifTable.ifEntry.ifDescr.3 = eth0
interfaces.ifTable.ifEntry.ifDescr.4 = eth1
interfaces.ifTable.ifEntry.ifDescr.5 = eth2
interfaces.ifTable.ifEntry.ifDescr.6 = eth3
ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.10.10.10 = 6
ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.192.168.1.1 = 2
ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.10.74.20.94 = 5
ip.ipAddrTable.ipAddrEntry.ipAdEntIfIndex.127.0.0.1 = 1
当某些发行包没有在ifDescr中报告接口名,IP地址和IfIndex的关联依然保留,而且SNMP功能,比如Interface_Scan_Next将会报告这些关联。
10. 混杂模式
=================================
当运行网络监控工具,比如tcpdump,经常会要打开设备德混杂模式,这样所有流量都会被发现(不仅仅看到目标为本机的流量)。bonding驱动处理针对bonding主设备的混杂模式(比如bond0),并把设定传播给其他slave设备。
对于balance-rr,balance-xor,broadcast和802.3ad模式,混杂模式设置会被传播给所有slave。
对于active-backup,balance-tlb和balance-alb模式,混杂模式设置仅会被传播给激活的slave。
对于balance-tlb模式,激活的slave是指当前正在接收inbound流量的slave。
对于balance-alb模式,激活的slave是指用做"primary"的slave,这个slave用于模式相关的控制流
量,对于发送到未指定对端或如果流量未做均衡。
----------------------------------------------------------------------------------------
For balance-alb mode, the active slave is the slave used as a
"primary." This slave is used for mode-specific control traffic, for
sending to peers that are unassigned or if the load is unbalanced.
----------------------------------------------------------------------------------------
对于active-backup,balance-tlb和balance-alb模式,当激活的slave改变时(比如由于链路异常
),混杂设定会被传播给新的激活slave。
阅读(1932) | 评论(0) | 转发(0) |