最佳实践14:数据链路层负载均衡
通过表3-1可以看到数据链路层位于第二层,它的下层是物理层,上层是网络层。
数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层的数据可靠地传输到相邻节点的目标机网络层。
为达到这一目的,数据链路层必须具备一系列相应的功能,主要有以下几种。
·将数据组合成数据块。在数据链路层中称这种数据块为帧(Frame),帧是数据链路层的传送单位。
·控制帧在物理信道上的传输,包括如何处理传输差错。
·调节发送速率与接收方相匹配。
·在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。
链路层负载均衡的必要性
目前主流的服务器一般配备2个或4个吞吐量均为1Gbps的网卡,10Gbps网卡因价格原因和对交换机模块的要求较高还未成为服务器的主流配置。在这种情况下,在以下的应用中需要对数据链路层进行负载均衡设计。
·某些单个应用需要超过1Gbps的吞吐量。在某款手游测试阶段进行容量评估和规划时,笔者所在的运维团队发现,单台Memcached服务器的吞吐量可能达到1.3Gbps左右,明显超过了单个网卡的处理能力;此时又不可能替换成10Gbps网卡(因网络架构和成本限制)。数据链路层负载均衡成为唯一可以采用的方案。
·对网卡功能高可用性的要求。在某些关键应用中,对网卡的可用性要求较高,业务需要在单网卡故障的情况下保证连续性,数据链路层负载均衡和高可用成为必须要考虑的实现方案。
对于Linux系统来说,数据链路层的负载均衡实现方案是实施双网卡绑定(Bonding),在思科(Cisco)交换机上这一技术被称作EtherChannel。
Linux Bonding配置过程
Linux Bonding中服务器和交换机的架构如图3-1所示。
图3-1 Linux Bonding架构演示图
本配置中的基本信息如表3-2所示。
表3-2 Linux Bonding基本信息
Linux Bonding的配置步骤如下。
步骤1 配置交换机。使用的命令如下:
interface Port-channel3 switchport access vlan 9 switchport mode access #access模式 spanning-tree portfast spanning-tree bpduguard enable interface GigabitEthernet1/0/24 switchport access vlan 9 switchport mode access spanning-tree portfast spanning-tree bpduguard enable channel-protocol lacp #使用协议IEEE 802.3ad Dynamic link aggregation channel-group 3 mode active ! interface GigabitEthernet1/0/25 switchport access vlan 9 switchport mode access spanning-tree portfast spanning-tree bpduguard enable channel-protocol lacp #使用协议IEEE 802.3ad Dynamic link aggregation channel-group 3 mode active !
步骤2 配置Linux。
配置网卡em3使用的命令如下:
# cat /etc/sysconfig/network-scripts/ifcfg-em3 DEVICE=em3 BOOTPROTO=none ONBOOT=yes USERCTL=no MASTER=bond0 #属于bond0的成员 SLAVE=yes
配置网卡em4使用的命令如下:
# cat /etc/sysconfig/network-scripts/ifcfg-em4 DEVICE=em4 BOOTPROTO=none ONBOOT=yes USERCTL=no MASTER=bond0 #属于bond0的成员 SLAVE=yes
配置bond0使用的命令如下:
# cat /etc/sysconfig/network-scripts/ifcfg-bond0 DEVICE=bond0 IPADDR=192.168.9.100 NETMASK=255.255.0.0 GATEWAY=192.168.9.5 ONBOOT=yes TYPE=Ethernet BOOTPROTO=static BONDING_OPTS="miimon=100 mode=4" #注意,此处mode必须选为4
重启网卡生效。
注意
(1)步骤2的配置错误可能导致无法远程登录服务器。
建议:使用带外管理(Out-of-band Management)(例如DELL iDRAC)或者在机房本地配置。
(2)在配置过程中,Linux的Bonding模式必须选择为4,即IEEE 802.3ad Dynamic link aggregation。否则,Linux服务器和交换机协商不成功。
步骤3 在交换机上确认。命令如下:
#show etherchannel summary Flags: D - down P - bundled in port-channel I - stand-alone s - suspended H - Hot-standby (LACP only) R - Layer3 S - Layer2 U - in use f - failed to allocate aggregator M - not in use, minimum links not met u - unsuitable for bundling w - waiting to be aggregated d - default port Number of channel-groups in use: 5 Number of aggregators: 5 Group Port-channel Protocol Ports ------+-------------+-----------+----------------------------------------------- 1 Po1(SD) - 2 Po3(SU) LACP Gi1/0/24(P) Gi1/0/25(P)
注意
Po3后面必须是SU状态,如果为D,则表示协商失败。
步骤4 在服务器上确认。使用的命令如下:
# ethtool bond0 Settings for bond0: Supported ports: [ ] Supported link modes: Not reported Supported pause frame use: No Supports auto-negotiation: No Advertised link modes: Not reported Advertised pause frame use: No Advertised auto-negotiation: No Speed: 2000Mb/s #此处的Speed为2个网卡之和 Duplex: Full #全双工 Port: Other PHYAD: 0 Transceiver: internal Auto-negotiation: off Link detected: yes
查看bond0状态,使用的命令如下:
# cat /proc/net/bonding/bond0 Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009) Bonding Mode: IEEE 802.3ad Dynamic link aggregation Transmit Hash Policy: layer2 (0) MII Status: up #此处为up状态 MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 802.3ad info LACP rate: slow Aggregator selection policy (ad_select): stable Active Aggregator Info: Aggregator ID: 3 Number of ports: 2 Actor Key: 17 Partner Key: 3 Partner Mac Address: 38:20:56:67:bb:00 Slave Interface: em3 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 44:a8:42:47:f6:bd Aggregator ID: 3 Slave queue ID: 0 Slave Interface: em4 MII Status: up Speed: 1000 Mbps Duplex: full Link Failure Count: 0 Permanent HW addr: 44:a8:42:47:f6:be Aggregator ID: 3 Slave queue ID: 0
步骤5 流量测试和可用性测试。
1)分别依次拔掉em3、em4的网线,使用ping观察网络连通情况。需要验证:在任何一根网线拔掉的情况下,网络连通性不受影响,仍然可以访问。
2)从多个服务器上,同时使用iPerf(https://iperf.fr/)工具对192.168.9.100进行吞吐量测试。目的是测试交换机到服务器Bonding的入吞吐量。需要验证:吞吐量达到单网卡约2倍,约1.8Gbps。
3)从192.168.9.100,使用iPerf同时向多个服务器进行吞吐量测试。目的是测试服务器Bonding到交换机的出吞吐量。需要验证:吞吐量达到单网卡时的2倍左右,即约1.8Gbps。
该服务器正常业务流量的Bonding情况如下:
# ifstat -b em3 em4 bond0 Kbps in Kbps out Kbps in Kbps out Kbps in Kbps out 380.36 211.42 239.04 106.27 619.41 317.70 228.61 124.84 229.04 117.02 457.65 241.87 291.90 157.84 198.16 102.17 490.06 260.01 277.57 329.95 261.42 89.13 538.99 419.08 262.28 194.71 291.02 84.11 553.30 278.82 253.73 175.69 358.40 96.60 612.12 272.28 290.11 203.07 248.56 94.51 538.67 297.58 261.87 165.73 1200.52 114.76 1462.39 280.49 229.15 192.14 413.50 103.48 642.65 295.62 222.54 196.43 341.36 71.52 563.89 267.95 255.00 173.73 271.49 66.76 526.49 240.49
由此可见,bond0的带宽为em3、em4之和,两个网卡进行了负载均衡。
注意
(1)从Cisco交换机到服务器的端口负载均衡算法,采用了Cisco的私有算法,不可配置。
(2)从服务器到Cisco交换机发出数据的端口选择,可以使用xmit_hash_policy这个配置项进行调整。如果同网段的多台服务器调用该绑定的服务器,则可以使用默认算法layer2;对公网多IP的来源访问,可以修改为layer2+3。参见https://www.kernel.org/doc/Documentation/networking/bonding.txt。
经过以上5个步骤,成功创建了数据链路层的负载均衡,针对前述提到的两个数据链路层需求,可以有效地满足。