Bonding
将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡。
直接给两块网卡设置同一IP地址是不可以的。通过bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的MAC地址
? Mode 0 (balance-rr)
轮转( Round-robin)策略:从头到尾顺序的在每一个slave接口上面发送数据包。本模式提供负载均衡和容错的能力
? Mode 1 (active-backup)
活动-备份(主备)策略:只有一个slave被激活,当且仅当活动的slave接口失败时才会激活其他slave。 为了避免交换机发生混
乱此时绑定的MAC地址只有一个外部端口上可见
? Mode 3 (broadcast)
广播策略:在所有的slave接口上传送所有的报文,提供容错能力
active-backup、 balance-tlb 和 balance-alb 模式不需要交换机的任何特殊配置。其他绑定模式需要配置交换机以便整合链接。如: Cisco 交换机需要在模式 0、 2 和 3 中使用EtherChannel,但在模式4中需要 LACP和 EtherChannel
详细帮助:
/usr/share/doc/kernel-docversion/Documentation/networking/bonding.txt
https://www.kernel.org/doc/Documentation/networking/bonding
Bonding配置
实验环境:VMware Workstation Pro 14(试用版)
系统平台:
CentOS release 6.9 (Final) 内核 2.6.32-696.el6.x86_64
虚拟2块网卡
生成bond0的网卡配置文件
miimon 是用来进行链路监测的。如果miimon=100,那么系统每100ms 监测一次链路连接状态,如果有一条线路不通就转入另一条线路
#cat > /etc/sysconfig/network-scripts/ifcfg-bond0 <<EOF
DEVICE=bond0
BOOTPROTO=none
BONDING_OPTS='mode=0 miimon=100'
IPADDR=192.168.4.201
PREFIX=24
EOF
修改2块物理网卡配置文件,添加红色的2行
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=none
MASTER=bond0 此处值需要填写加入哪个BONDING组
SLAVE=yes
重启网络服务
#service network restart
绑定组中的各个网卡的MAC地址将会与bond0的MAC一致
查看Bonding状态
#cat /proc/net/bonding/bond0
测试
关闭了其中一个网卡,发现,ping包并没有中断
215 packets transmitted, 215 received, 0% packet loss, time 214116ms
换成mode=3模式
64 bytes from 192.168.4.201: icmp_seq=1 ttl=64 time=4.34 ms
64 bytes from 192.168.4.201: icmp_seq=1 ttl=64 time=4.38 ms (DUP!)
64 bytes from 192.168.4.201: icmp_seq=2 ttl=64 time=0.264 ms
64 bytes from 192.168.4.201: icmp_seq=2 ttl=64 time=0.281 ms (DUP!)
64 bytes from 192.168.4.201: icmp_seq=3 ttl=64 time=0.301 ms
64 bytes from 192.168.4.201: icmp_seq=3 ttl=64 time=0.319 ms (DUP!)
删除bond0
#ifconfig bond0 down
#ethtool -i bond0
#modprobe -r bonding
#service network restart
实验环境:VMware Workstation Pro 14(试用版)
系统平台:
CentOS Linux release 7.4.1708 (Core) 内核 3.10.0-693.el7.x86_64
计划使用ens36和ens37来进行bongding设置
#nmcli device
DEVICE TYPE STATE CONNECTION
ens33 ethernet connected ens33
ens36 ethernet connected ens36
ens37 ethernet connected ens37
添加bonding接口
注意黑色标注的地方,ifname并不指定具体的物理网卡,而是指定bondding组名
#nmcli connection add con-name bond1 type bond ifname bond1 mode active-backup ipv4.method auto ipv6.method ignore
添加从属接口
#nmcli connection add type bond-slave ifname ens36 master bond1
#nmcli connection add type bond-slave ifname ens37 master bond1
如果没有指定从属接口con-name提供连接名,则该名称是接口名称加类型构成
会自动生成配置文件,这个比Centos 6方便
启动BONDDING
要启动绑定,则必须首先启动从属接口
#nmcli connection up bond-slave-ens36
#nmcli connection up bond-slave-ens37
启动绑定
#nmcli connection up bond1(一般情况下,启动了从属接口,就会自动启动了)
测试:
关闭了ens36网卡
#nmcli device disconnect ens36
ens37立即接替故障接口ens36进行工作了
删除bond1
#nmcli connection down bond1
#nmcli connection delete bond1 bond-slave-ens36 bond-slave-ens37
恢复正常
网络组Network Teaming
网络组:是将多个网卡聚合在一起方法,从而实现冗错和提高吞吐量
? 网络组不同于旧版中bonding技术,提供更好的性能和扩展性
? 网络组由内核驱动和teamd守护进程实现.
? 多种方式runner
broadcast【mode 3】
特点:
这种模式的特点是一个报文会复制两份往bond下的两个接口分别发送出去,当有对端交换机失效,我们感觉不到任何downtime,但此法过于浪费资源;不过这种模式有很好的容错机制。此模式适用于金融行业,因为他们需要高可靠性的网络,不允许出现任何问题
适用于拓扑,两个接口分别接入两台交换机,并且属于不同的vlan,当一边的网络出现故障不会影响服务器另一边接入的网络正常工作。而且故障过程是0丢包
roundrobin 【mode 0】
特点:
(1)所有链路处于负载均衡状态,轮询方式往每条链路发送报文,基于per packet方式发送。服务上ping 一个相同地址:1.1.1.1 双网卡的两个网卡都有流量发出。负载到两条链路上,说明是基于per packet方式 ,进行轮询发送。
(2)这模式的特点增加了带宽,同时支持容错能力,当有链路出问题,会把流量切换到正常的链路上。
交换机端需要配置聚合口
activebackup【mode 1】
特点:
一个端口处于主状态 ,一个处于从状态,所有流量都在主链路上处理,从链路不会有任何流量。当主端口down掉时,从端口接手主状态。
不需要交换机端支持
loadbalance【mode 2】
特点:
该模式将限定流量,以保证到达特定对端的流量总是从同一个接口上发出。既然目的地是通过MAC地址来决定的,因此该模式在“本地”网络配置下可以工作得很好。如果所有流量是通过单个路由器(比如 “网关”型网络配置,只有一个网关时,源和目标mac都固定了,那么这个算法算出的线路就一直是同一条,那么这种模式就没有多少意义了。),那该模式就不是最好的选择。和balance-rr一样,交换机端口需要能配置为“port channel”。这模式是通过源和目标mac做hash因子来做xor算法来选路的。
交换机端需要配置聚合口
lacp (implements the 802.3ad Link Aggregation ControlProtocol)【mode 4】
特点:802.3ad模式是IEEE标准,因此所有实现了802.3ad的对端都可以很好的互操作。802.3ad 协议包括聚合的自动配置,因此只需要很少的对交换机的手动配置(要指出的是,只有某些设备才能使用802.3ad)。802.3ad标准也要求帧按顺序(一定程度上)传递,因此通常单个连接不会看到包的乱序。802.3ad也有些缺点:标准要求所有设备在聚合操作时,要在同样的速率和双工模式,而且,和除了balance-rr模式外的其它bonding负载均衡模式一样,任何连接都不能使用多于一个接口的带宽。 此外,linux bonding的802.3ad实现通过对端来分发流量(通过MAC地址的XOR值),因此在“网关”型配置下,所有外出(Outgoing)流量将使用同一个设备。进入(Incoming)的流量也可能在同一个设备上终止,这依赖于对端802.3ad实现里的均衡策略。在“本地”型配置下,路两将通过 bond里的设备进行分发。
应用拓扑同mode 0,和mode 2一样,不过这种模式除了配置port channel之外还要在port channel聚合口下开启LACP功能,成功协商后,两端可以正常通信。否则不能使用。
实验环境:VMware Workstation Pro 14(试用版)
系统平台:
CentOS Linux release 7.4.1708 (Core) 内核 3.10.0-693.el7.x86_64
计划使用ens36和ens37来进行网络组设置
#nmcli device
DEVICE TYPE STATE CONNECTION
ens33 ethernet connected ens33
ens36 ethernet connected ens36
ens37 ethernet connected ens37
语法格式
创建网络组接口
nmcli con add type team con-name 网络组名 ifname 网络组接口名 [config JSON]
JSON 指定runner方式
格式: '{"runner": {"name": "METHOD"}}'
METHOD 可以是broadcast, roundrobin,activebackup, loadbalance, lacp
例子:
#nmcli connection add con-name team0 ifname team0 type team config '{"runner":{"name":"activebackup"}}'
创建port接口
nmcli con add type team-slave con-name 网络接口名 ifname 物理网卡 master 网络组名
? 网络接口名若不指定,默认为team-slave-物理网卡名
例子:
#nmcli connection add type team-slave ifname ens36 master team0
网络组管理命令
teamdctl [options] teamdevname command [command args]
-h --help Show this help
-v --verbose Increase output verbosity
-o --oneline Force output to one line if possible
-D --force-dbus Force to use D-Bus interface
-Z --force-zmq=ADDRESS Force to use ZeroMQ interface [-Z[Address]]
-U --force-usock Force to use UNIX domain socket interface
Commands:
config dump 配置查看
config dump noports
config dump actual
state 状态查看
state dump
state view
port add PORTDEV 添加一个定义好了配置文件的物理网卡至网络组中
port remove PORTDEV 从网络中删除一个接口设备,不会删除配置文件
port present PORTDEV
port config update PORTDEV PORTCONFIG
port config dump PORTDEV
创建网络组
#nmcli connection add con-name team0 ifname team0 type team config '{"runner":{"name":"activebackup"}}'
自动生成的文件如下:
#cat ifcfg-team0
DEVICE=team0
TEAM_CONFIG="{\"runner\":{\"name\":\"activebackup\"}}"
BOOTPROTO=dhcp
NAME=team0
ONBOOT=yes
DEVICETYPE=Team
创建网络接口
#nmcli connection add type team-slave ifname ens36 master team0
#nmcli connection add type team-slave ifname ens37 master team0
自动生成的文件如下
#cat ifcfg-team-slave-ens36
NAME=team-slave-ens36
UUID=804bda32-b350-4500-8b46-eec141a7d13d
DEVICE=ens36
ONBOOT=yes
TEAM_MASTER=team0
DEVICETYPE=TeamPort
启动网络组
启动网络组接口不会自动启动网络组中的port接口
启动网络组接口中的port接口总会自动启动网络组接口
禁用网络组接口会自动禁用网络组中的port接口
没有port接口的网络组接口可以启动静态IP连接
启用DHCP连接时,没有port接口的网络组会等待port接口的加入
所以上图中的team0一直不会自动启用的
#nmcli connection up team-slave-ens36
#nmcli connection up team-slave-ens36
查看状态
测试什么的都是正常。
现在再增加一块物理网卡到此网络组,必须使用命令生成配置文件
#nmcli connection add type team-slave ifname ens38 master team0
#nmcli connection up team-slave-ens38
只有有配置文件后,才可以使用此命令添加
#teamdctl team0 port add ens38
删除指定的物理网卡
#teamdctl team0 port remove ens38
删除网络组
先down掉相应的网络组,再删除配置文件
#nmcli connection delete team0 team-slave-ens36 team-slave-ens37
桥接
桥接:把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。网桥就是这样一个设备,它有若干个网口,并且这些网口是桥接起来的。与网桥相连的主机就能通过交换机的报文转发而互相通信。
一般常用在KVM相关场景中。支持网卡别名。
主机A发送的报文被送到交换机S1的eth0口,由于eth0与eth1、 eth2桥接在一起,故而报文被复制到eth1和eth2,并且发送出去,然后被主机B和交换机S2接收到。而S2又会将报文转发给主机C、D。
实验环境:VMware Workstation Pro 14(试用版)
系统平台:
CentOS Linux release 7.4.1708 (Core) 内核 3.10.0-693.el7.x86_64
计划使用ens36和ens37来进行网桥设置
#nmcli device
DEVICE TYPE STATE CONNECTION
ens33 ethernet connected ens33
ens36 ethernet connected ens36
ens37 ethernet connected ens37
创建网桥
#nmcli connection add type bridge con-name bridge0 ifname bridge0 ipv4.method manual ipv4.addresses 172.18.27.42/16
生成的配置文件如下:
#cat ifcfg-bridge0
DEVICE=bridge0
STP=yes
BRIDGING_OPTS=priority=32768
TYPE=Bridge
IPADDR=172.18.27.42
PREFIX=16
NAME=bridge0
ONBOOT=yes
创建网络接口
#nmcli connection add type bridge-slave ifname ens36 master bridge0
#nmcli connection add type bridge-slave ifname ens37 master bridge0
生成的配置文件如下:
#cat ifcfg-bridge-slave-ens36
TYPE=Ethernet
NAME=bridge-slave-ens36
UUID=3433f060-8127-4cc6-9be6-23ab9716f785
DEVICE=ens36
ONBOOT=yes
BRIDGE=bridge0
启动网桥组的网络接口
#nmcli connection up bridge-slave-ens36
#nmcli connection up bridge-slave-ens37
查看状态
#brctl show bridge0
bridge name bridge id STP enabled interfaces
bridge0 8000.000000000000 yes
最小化安装系统的时候,需要安装工具包bridge-utils.x86_64
#brctl
Usage: brctl [commands]
commands:
addbr <bridge> add bridge
delbr <bridge> delete bridge
addif <bridge> <device> add interface to bridge 没有配置文件的话,重启就无效
delif <bridge> <device> delete interface from bridge
show [ <bridge> ] show a list of bridges
showmacs <bridge> show a list of mac addrs
showstp <bridge> show bridge stp info
stp <bridge> {on|off} turn stp on/off
#bridge -s link
3: ens36 state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state forwarding priority 32 cost 100
4: ens37 state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master bridge0 state blocking priority 32 cost 100
删除网络组
#nmcli connection down bridge0
#nmcli connection delete bridge0
#nmcli connection delete bridge-slave-ens36
#nmcli connection delete bridge-slave-ens37