使用 bind 绑定多个网卡
由于服务器上对于可用性的要求都比较高, 对于各项功能都会有有冗余设计, 比如, 磁盘, 电源, 网卡, 甚至服务器本身等等, 今天尝试做一下网卡绑定实现网卡的冗余.
网卡绑定的实现表面上看起来有些像是硬盘实现逻辑卷, 都是通过创建一个逻辑设备来实现的. 实现网卡的绑定其实还挺简单的, 相比逻辑卷更容易理解.
首先, 我们在 / etc/sysconfig/network-scripts / 目录下创建一个文件, 文件名通常会叫 ifcfg-bondxx, 除了 ifcfg - 后面的内容其实都是可以自己定义的, 但通常都会写成 bind 之类的, 文件的内容其实和普通网卡配置文件的内容是一样的, 就像这样
- DEVICE=bond1
- BOOTPROTO=static
- IPADDR=172.20.16.121
- GATEWAY=172.20.0.1
- PREFIX=16
- BONDING_OPTS="miimon=100 mode=1"
第一行的 DEVICE 是你给这个逻辑设备指定的名字, 这个名字得和文件名的后半部分一样.
第二行是指定 IP 的获取方式, 你也可以写 dhcp 让他自动获取, 如果是自动获取, 那么 IPADDR,GATEWAY 和 PREFIX 都不需要再填
最后一行是比较重要的, 必须得填, 这个是绑定网卡的选项, mode 代表绑定网卡的工作模式, miimon 是一个时间间隔, 代表备份网卡每隔多久查询一次工作网卡的工作情况. 单位是 ms
以上只是第一步, 逻辑网卡已经创建好了, 下面就要指定那些网卡属于这个逻辑网卡了. 也很简单, 只要把你想加入这个逻辑网卡的物理网卡的配置文件稍微修改一下就可以了. 就像这样
- TYPE="Ethernet"
- BOOTPROTO=static
- NAME=eth1
- MASTER=bond1
- SLAVE=yes
- USERCTL=no
- DEVICE=eth1
- ONBOOT=yes
- IPADDR=192.168.20.110
- GATEWAY=192.168.0.1
- PREFIX=16
其实后面的三行是无效的, 不过我懒得删掉了, 比较重要的是 MASTER=bond1,SLAVE=yes, 这两行指定了该网卡是属于逻辑网卡 bond1 的从属设备, DEVICE 也是必须的, 它指明了这个配置文件是给哪个网卡用的, 其他的没有也可以, 不过建议写上 ONBOOT=yes
现在我们添加了第一个网卡到逻辑网卡, 添加第二块的方法和第一个是一样的. 换个文件而已. 不在说.
然后我们就可以重启我们的网络服务了, 在 centos7 中是用 systemctl restart network 之后就可以看看成果了. 如果没有问题的话在执行 ifconfig 之后会看到下面的内容:
- [root@cent7 network-scripts]# ifconfig
- bond1: flags=5187<UP,BROADCAST,RUNNING,MASTER,MULTICAST> mtu 1500
- inet 172.20.16.121 netmask 255.255.0.0 broadcast 172.20.255.255
- inet6 fe80::250:56ff:fe3b:6a38 prefixlen 64 scopeid 0x20<link>
ether 00:50:56:3b:6a:38 txqueuelen 1000 (Ethernet)
RX packets 212 bytes 21252 (20.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 13 bytes 1000 (1000.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- ......
- eth1: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500
ether 00:50:56:3b:6a:38 txqueuelen 1000 (Ethernet)
RX packets 1224 bytes 176616 (172.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
- TX packets 265 bytes 73426 (71.7 KiB)
- TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- eth2: flags=6211<UP,BROADCAST,RUNNING,SLAVE,MULTICAST> mtu 1500
ether 00:50:56:3b:6a:38 txqueuelen 1000 (Ethernet)
RX packets 286 bytes 35478 (34.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 62 bytes 5878 (5.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
最明显的就是多了一个叫 bond1 的网卡, 而且是有 IP 的, eth1 和 2 有同样的 mac 地址, 并且都没有 IP, 我们可以通过查看 /proc/net/bonding/bond1 这个文件中的内容来看 bond1 的工作情况, 如果你乐意还可以手工下线一个网卡看看这个绑定的设备的工作情况.
还记得 bond1 配置文件中的 BONDING_OPTS="miimon=100 mode=1" 这一行吗 , 其实这个 mode 是有好几种的, 不过我们常用的并不多, 比如 mode0 是轮巡代表数据包会从头到尾经过每一个网卡, 这种模式提供了负载均衡的能力和一定的容错性, 还有 mode3, 这种模式数据包会独立通过每一个网卡, 每个网卡也会给一个响应, 具体体现就是数据的每一个请求都会得到多个回应. 如果你想知道更多, 下面有一个官方的文档.
https://www.kernel.org/doc/Documentation/networking/bonding.txt
使用 team 绑定多个网卡
在 centos7 中也可以使用 bond 进行多网卡绑定, 不过 centos7 中有更好的实现方法, 建议在 centos7 中使用. 首先还是修改配置文件的方法进行绑定. 其格式和步骤和 bond 并没有什么区别. 看一下文件格式.
首先是 team0 也就是那个逻辑网卡配置文件的格式
- DEVICE=team0
- DEVICETYPE=Team
- TEAM_CONFIG="{\"runner\":{\"name\":\"activebackup\"}}"
- BOOTPROTO=none
- IPADDR=172.20.16.121
- PREFIX=16
- NAME=team0
- ONBOOT=yes
大部分内容都是一样的, 只有第三行的 TEAM_CONFIG 有些差别, 不过第三行除了 activebackup 这个单词, 其他部分是不需要变动的, 这个单词对应的就是 mode 部分, 比如 activebackup 对应 mode1, 其他还有比如: broadcast roundrobin activebackup loadbalance
然后就是从网卡的配置, 也是差不多的
- DEVICE=eth1
- DEVICETYPE=TeamPort
- TEAM_MASTER=team0
- NAME=eth1
- ONBOOT=yes
配置文件修改之后就可以重启网络服务生效了. 完成之后的 ifconfig 和之前的并无太大差别:
- [root@cent7 network-scripts]# ifconfig
- eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether be:27:a5:16:09:f8 txqueuelen 1000 (Ethernet)
RX packets 1280 bytes 182697 (178.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
- TX packets 299 bytes 75980 (74.1 KiB)
- TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- eth2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
ether be:27:a5:16:09:f8 txqueuelen 1000 (Ethernet)
RX packets 359 bytes 42823 (41.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 72 bytes 6582 (6.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- ...
- team0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
- inet 172.20.16.121 netmask 255.255.0.0 broadcast 172.20.255.255
- inet6 fe80::bc27:a5ff:fe16:9f8 prefixlen 64 scopeid 0x20<link>
ether be:27:a5:16:09:f8 txqueuelen 1000 (Ethernet)
RX packets 36 bytes 3261 (3.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 19 bytes 1326 (1.2 KiB)
TX errors 0 dropped 2 overruns 0 carrier 0 collisions 0
或者也可以使用 nmcli 命令直接生成对应的配置文件
nmcli con add type team con-name team0 ifname team0 config '{"runner": {"name":"loadbalance"}}'
nmcli con mod team0 ipv4.addresses 192.168.1.100/24
nmcli con mod team0 ipv4.method manual
nmcli con add con-name eth1 type team-slave ifname eth1 master team0
nmcli con add con-name eth2 type team-slave ifname eth2 master team0
nmcli con up team0
nmcli con up eth1
nmcli con up eth2
上面的前三行是可以合成一行的, 只是太长了,
add 是增加
type team 表示增加的是一个 team 类型的
con-name team0 指定连接名称
ifname team0 表示指定接口,
config 这部分是配置信息, 和之前手写配置文件内容格式相同
mod 是修改指定连接
ipv4.addresses 指定 ip 地址
ipv4.method manual 表示手动指定 ip, 如果为空则自动选择 (如果使用手动 ip, 此选项必须添加)
之后的两行
type team-slave 表示该设备是从属设备
master team0 指定设备连接属于谁
最后三行启用相关设备.
使用 teamdctl team0 stat 可以查看 team 连接的详细信息
来源: http://www.bubuko.com/infodetail-2586071.html