yield-bytes

沉淀、分享与无限进步

hadoop集群平台网络配置bond模式实现高可用

  在前面文章关于hadoop大数据项目开发中,每台服务器之间其实存在大量的IO,例如NameNode服务器和DataNode服务器同步fimag文件件,DataNode之间的数据IO,为压榨服务器对于超大数据的吞吐量,在服务器的网络层使用bond模式配置Linux网卡,可以将该服务器上多个物理网卡虚拟成一张网卡,由该虚拟网卡对外提供统一网络服务,实现多个网卡自适应负载均衡以及提高数据的吞吐量,同时也实现链路双备份功能,保证服务器底层网络高可用性。bond虚拟网卡可以绑定多个网络,例如绑定2两个网卡,一般物理服务器有4个千兆网卡,所以也可以绑定4个网卡,绑定的网卡类型需要一致,否则无法进行bond模式配置。
  以centos7.5 的两个网卡配成bond模式作为示例,其中在之前的hadoop的相关文章里,nn节点与dn2节点构成HA,dn节点作为DataNode,当这三个节点的底层网络都配成bond模式,将进一步提高本blog之前搭建大数据开发平台的高可用性。作为全栈开发者,这些涉及简单网络的配置,应该需要掌握。

1、为测试服务器添加多个网卡

在VMware workstations中,给相应服务器新增一个网卡,选择NAT模式,这样这是基于虚拟机操作,实际生成环境中,我的开发项目会部署在真实服务器上,真实服务器不需要NAT模式。

2、查看测试服务器的网卡信息

原网卡ens33是配有IP的,新增的网卡ens37无IP绑定。

1
2
3
4
5
6
7
8
9
10
[root@nn ~]# ip a

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 12:1d:21:fg:43:f1 brd ff:ff:ff:ff:ff:ff
inet 192.188.0.5/24 brd 192.188.0.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 12:1d:21:fg:43:f2 brd ff:ff:ff:ff:ff:ff
inet6 ***/64 scope link noprefixroute
valid_lft forever preferred_lft forever

可以看到两个网卡ens33和ens37,都是千兆网速,都为up状态

3、配置两个网卡

3.1 这里需要先把原网卡配置拷贝一份作为备份。

备份网卡ens33的配置文件

1
2
3
[root@nn network-scripts]# pwd
/etc/sysconfig/network-scripts
[root@nn network-scripts]# cp ifcfg-ens33 ifcfg-ens33.bak

新增网卡ens37是没有对应配置文件,只需要从ens33拷贝一份即可

1
[root@nn network-scripts]# cp ifcfg-ens33 ifcfg-ens37
3.2 将ens33和ens37配成slave模式

这里不再需要配置ip和dns,mac地址也不需要配置,linux自动识别。

配置ens33,

注意该网卡已配置有IP,在改完该网卡配置后,请勿直接重启网卡,否则ssh无法远程连接,因为slave模式下,该网卡配置文件里面是无IP地址的。

1
2
3
4
5
6
7
8
9
10
11
12
DEVICE=ens33
NAME=ens33
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
USERCTL=no
# bond网卡的名字
MASTER=bond0
# ens33网卡启用slave模式
SLAVE=yes

配置ens37 ,同上

1
2
3
4
5
6
7
8
9
10
11
DEVICE=ens37
NAME=ens37
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
USERCTL=no
# bond网卡的名字
MASTER=bond0
# ens33网卡启用slave模式
SLAVE=yes

若有更多的网卡需要绑定为bond0模式,则按以上配置改即可。

4、配置bond0虚拟网卡

/etc/sysconfig/network-scripts下,需要创建一个ifcfg-bond0文件,用于配置名字为bond0的虚拟网卡,注意这里bond0只是一个名字,可以按需要命名,例如mybond。

1
[root@nn network-scripts]# vi ifcfg-bond0

配置文件如下

1
2
3
4
5
6
7
8
9
10
11
12
DEVICE=bond0
TYPE=Ethernet
NM_CONTROLLER=no
BONDING_OPTS="miimon=100 mode=6"
BOOTPROTO=none
USERCTL=no
ONBOOT=yes
IPADDR=192.188.0.5
NETMASK=255.255.255.0
GATEWAY=192.188.0.1
DNS1=114.114.114.114
DNS2=114.114.114.115

若不想在bond0配置文件写入BONDING_OPTS="miimon=100 mode=6"

也可以在/etc/modprobe.d/dist.conf

新增如下两行:

alias bond0 bonding options bond0 miimon=100 mode=6

但个人建议直接在bond0网卡配置mod模式,方便后期查看和更改。

5、bond0的配置说明和工作原理

重点配置项为:BONDING_OPTS=”miimon=100 mode=6”

该配置文件:miimon=100,意思是linux每100ms监测一次本服务器网络链路连接状态(这里说的网络连接,是指该服务器网卡与接入层交换机端口连接的状态),如果有其中网卡例如ens33中断,那么bond0会将网络连接切到可用ens37;

mode的值表示工作模式,共有0,1,2,3,4,5,6六种模式,常用为0,6,1三种

  • mode=0,表示load balancing (round-robin)为负载均衡方式,两块网卡都工作,但是与网卡相连的交换必须做特殊配置( 这两个端口需要配置成聚合方式),因为做bonding的这两块网卡是使用同一个MAC地址
  • mode=1,表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,也就是说默认情况下只有一块网卡工作,另一块做备份 。

  • mode=6,表示load balancing (round-robin)为负载均衡方式,两块网卡都工作,该模式下无需配置交换机,因为做bonding的这两块网卡是使用不同的MAC地址。

    mode6因为可以做负载均衡,因此实际场景使用效果好,mode6的工作原理:bond0虚拟网卡的mac地址为两张网卡mac地址其中的一个,bond0通过更改自身与某个网卡一样的Mac地址,以达到随时切换转发数据包到相应正常工作的网卡中。从外部交换机来看,交换机只看到bond0这个网卡,bond0就像Nginx,都是代理角色,代理后面有多个实体。

    mode6负载均衡的是这么实现的:

    假设测试服务器的网卡ens33连接交换机33号端口,ens37连接交换机37端口。

    当bond0检测到ens33流量超过阈值时,则bond0会将自己Mac地址切换到en37的mac地址,所以交换机通过发arp广播包,找到37端口就是连接ens37网卡,所以网络流量就从交换机37端口转发到ens37网卡。

6、 加载内核bond模块 modprobe bonding

1
2
3
[root@nn network-scripts]# modprobe bonding
[root@nn network-scripts]# lsmod |grep bond
bonding 152656 0

重启网络

1
2
[root@nn network-scripts]# service network restart
Restarting network (via systemctl): [ OK ]

7、查看bond0虚拟网卡状态并测试主备网卡切换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@nn network-scripts]# cat /proc/net/bonding/bond0 
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

# 负载均衡模式
Bonding Mode: adaptive load balancing
Primary Slave: None
# 当前对外连接网络额度是网卡ens33
Currently Active Slave: ens33
# 状态up
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens33
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 12:1d:21:fg:43:f1
Slave queue ID: 0

Slave Interface: ens37
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 12:1d:21:fg:43:f2
Slave queue ID: 0

查看bond0的mac地址,跟ens33的mac地址一样:12:1d:21:fg:43:f1

1
2
3
4
5
6
7
8
9
10
11
[root@nn ~]# ip a

2: ens33: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
link/ether 12:1d:21:fg:43:f1 brd ff:ff:ff:ff:ff:ff
3: ens37: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP group default qlen 1000
link/ether 12:1d:21:fg:43:f2 brd ff:ff:ff:ff:ff:ff

191: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 12:1d:21:fg:43:f1 brd ff:ff:ff:ff:ff:ff
inet 192.168.142.4/24 brd 192.168.142.255 scope global noprefixroute bond0
valid_lft forever preferred_lft forever

关闭ens33网卡,看看bond0是否会切换到ens37

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@nn network-scripts]# ifdown ens33
Device 'ens33' successfully disconnected.

[root@localhost network-scripts]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: adaptive load balancing
Primary Slave: None
# 可以看到当ens33不工作后,网络连接已经切换到ens37
Currently Active Slave: ens37
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens37
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 12:1d:21:fg:43:f2
Slave queue ID: 0