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组进行互操作。 ---------------------------------------------------------------------------------------- 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标记依然存在正确的位置。 ---------------------------------------------------------------------------------------- 在从属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监控选项示例 如果只有一个目的地址,配置也很类似: # 只有1个目的地址的ARP监控选项示例 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 路由配置有可能持续更新设备的接收/发送次数(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 如果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; 这将会导致,当加载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 如果在所有参与到bond的网络驱动加载前加载bonding驱动,我们可以避免这个问题。如下是一个示例,它会首先加载bonding驱动,IP地址192.168.1.1被正确地关联到ifDescr.2: interfaces.ifTable.ifEntry.ifDescr.1 = lo 当某些发行包没有在ifDescr中报告接口名,IP地址和IfIndex的关联依然保留,而且SNMP功能,比如Interface_Scan_Next将会报告这些关联。 10. 混杂模式 对于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 ---------------------------------------------------------------------------------------- 对于active-backup,balance-tlb和balance-alb模式,当激活的slave改变时(比如由于链路异常),混杂设定会被传播给新的激活slave。 11. 配置Bonding用于高可靠性(High Availability,缩写为HA) 11.1 单交换机拓扑下的HA 如果两个主机(或一个主机和一个交换机)通过多个物理链路直连,想要优化最大带宽就不具有可行性。在这种情况下,只有一个交换机(或对端),如果它坏了,那没有替代的链接来接替。此外,bonding负载均衡模式支持成员的链路监控,因此如果单个链路坏了,负载将会被均衡到剩余的设备。 参看第12节“配置Bonding用于最大吞吐量”,如果你想配置只有一个对端设备的bonding。 11.2 多交换机拓扑下的HA 如下是一个简单的网络,配置用于最大化网络可靠性: | | 在该配置中,两个交换机间存在着一个链路(交换机间链路,ISL,Inter Switch Link),并存在多个连到外部的端口(每个交换机上的"port3"),从技术角度看,把它扩充到3个或更多交换机没有任何问题。 11.2.1 多交换机拓扑下的HA模式选择 在如上例所示的拓扑中,可用于优化可靠性的bonding模式只有active-backup和broadcast模式,其他的模式要求在同一个对端断开的所有链路能够有特定的行为。 active-backup: 通常是推荐的模式,尤其是如果交换机间存在ISL并能一起很好的工作。如果一个交换机被配置为备份交换机(比如,有更低的处理能力,更高的费用等等),则可以使用primary选项来保证期望的链路在它可用时总是用它。 broadcast:该模式是一种特定目的的模式,只在特定的需求下才需要。比如,如果两个交换机没有互联(没有ISL),而且它们连接的网络是完全独立的,在这种情况下,如果需要某些特定的单向流量能够都到达这两个独立的网络,那可能需要broadcast模式。 11.2.2 多交换机拓扑下的HA链路监控选择 链路监控的选择根本上是依赖于你的交换机,如果交换机可以在发生异常时可靠地断开端口,则MII或ARP监控都是可以的。比如,在上例中,如果"port3"在远端的链路异常,由于MII监控没有直连所以无法监测到,而ARP监控如果想监测到必须要配置为port3的远端的目标地址,这样如果没有路由器的支持,要想监测这一类错误时不可能的。 一般来说,在多交换机拓扑下,ARP监控可以在监测端到端连接错误(可能由任何独立部件在传输流量方面的异常导致)方面提供更高层的可靠性。此外,ARP 监控应该被配置为多个目标(至少网络里的每个交换机都有一个),这可以保证不管哪个交换机可用,ARP监控总是有个合适的目标来查询。 12. 配置Bonding用于最大吞吐量(Maximizing Throughput,缩写为MT) 12.1 单交换机拓扑下的最大吞吐量 在单交换机配置情况下,最好的最大化吞吐量的方法依赖于应用程序和网络环境,不同的环境下,不同的负载均衡模式由不同的优点和缺点,如下文所述。 对这些讨论,我们将把拓扑分为两类,根据大部分流量的目的地,我们把拓扑分为“网关”(gatewayed)和“本地”(local)配置。 在网关型配置下,“交换机”主要时担当一个路由的功能,主要的网络流浪通过这个路由器到达其他网络,如下图所示:
路由器可能是一个专用的路由器设备,也可能是其它充当网关的主机。对我们的讨论,重要的一点是:从Host A来的大部分网络流量将会在到达目的地前先通过路由器到其它的网络。 在路由器网络配置情况下,尽管Host A可能和很多其它系统通信,但所有流量将通过本地网络中的一个对端(路由器)来发送和接收。 要说明的是:配置bonding的目的,对于两个系统通过多个物理链接直连,和网关型配置其实是一样的,在这种情况下,碰巧所有流量都通向“网关”自身,而不是网关外的其它网络。 在本地型配置情况下,“交换机”主要充当交换的功能,主要的流量通过这个交换机到达同一个网络上的其它工作站,下图是一个示例: +----------+ +----------+ +--------+
|