科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航



ZDNet>安全频道>ZD评测>Linux双网卡绑定实现负载均衡和失效保护

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

对于bonding的网络负载均衡是我们在文件服务器中常用到的,比如把三块网卡,当做一块来用,解决一个IP地址,流量过大,服务器网络压力过大的问题。

来源:IT168 2008年04月14日

关键字:Linux 系统安全

  对于bonding的网络负载均衡是我们在文件服务器中常用到的,比如把三块网卡,当做一块来用,解决一个IP地址,流量过大,服务器网络压力过大的问题。对于文件服务器来说,比如NFS或SAMBA文件服务器,没有任何一个管理员会把内部网的文件服务器的IP地址弄很多个来解决网络负载的问题。如果在内网中,文件服务器为了管理和应用上的方便,大多是用同一个IP地址。对于一个百M的本地网络来说,文件服务器在多个用户同时使用的情况下,网络压力是极大的,特别是SAMABA和NFS服务器。为了解决同一个IP地址,突破流量的限制,毕竟网线和网卡对数据的吞吐量是有限制的。如果在有限的资源的情况下,实现网络负载均衡,最好的办法就是 bonding ;

  另一种情况就是服务器的一个网卡失效或者网络连接意外断开,如果做了bonding就可以切换到另一个网卡的网络连接上.保证服务的不中断.

  详细的资料可以参考:

  下面试验一下热备模式.

  首先要看linux是否支持bonding,RHEL4已经默认支持了.(大部分发行版都支持)

  # modinfo bonding

  filename: /lib/modules/2.6.18-8.el5/kernel/drivers/net/bonding/bonding.ko

  author: Thomas Davis, tadavis@lbl.govand many others

  description: Ethernet Channel Bonding Driver, v3.0.3

  version: 3.0.3

  license: GPL

  srcversion: 2547D22885C2FDF28EF7D98

  如果有类似上面的信息输出,说明已经支持了.

  如果没有,说明内核不支持bonding,需要重新编译内核

  编译内核的步骤这里就不多写了,在make menuconfig里面

  找到Bonding driver support这样的对话框,选中它.

  如果是模块编译,还需要挂载模块.挂载bonding 模块的方法;

  

  [root@localhost#] modprobe bonding

  如果/sbin/ifenslave没有,我们还需要把它也单独编译出来

  [root@lin:/home/beinan#] cd /usr/src/linux-2.6.20/Documentation/networking

  [root@lin:/home/networking#] gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux-2.6.20/include ifenslave.c -o ifenslave

  [root@lin:/home/networking#] cp ifenslave /sbin/ifenslave

  1.编辑虚拟网络接口配置文件,指定网卡IP

  没有这个文件我们可以从以前的配置文件复制一个过来,减少输入的文字.

  #cd /etc/sysconfig/network-scripts/

  #cp ifcfg-eth0 ifcfg-bond0

  #vi ifcfg-bond0 

  将第一行改成 DEVICE=bond0

 

  # cat ifcfg-bond0

  DEVICE=bond0

  BOOTPROTO=static

  IPADDR=192.168.1.200

  NETMASK=255.255.255.0

  BROADCAST=192.168.1.255

  ONBOOT=yes

  TYPE=Ethernet

  接下来修改以前的网卡的设置

  [root@rhas-13 network-scripts]# cat ifcfg-eth0

  DEVICE=eth0

  ONBOOT=yes

  BOOTPROTO=none

  [root@rhas-13 network-scripts]# cat ifcfg-eth1

  DEVICE=eth0

  ONBOOT=yes

  BOOTPROTO=none //网卡启动协议.这里我试验了static,dhcp,none发现没有什么区别

  3 # vi /etc/moprobe.conf (旧的版本可能是modules.conf)

  编辑 /etc/moprobe.conf 文件,加入如下一行内容,以使系统在启动时加载bonding模块,对外虚拟网络接口设备为 bond0

  加入下列行

  alias bond0 bonding

  options bond0 miimon=100 mode=1

  alias net-pf-10 off //这行是关闭ipv6支持,也可以不要)

  说明:miimon是用来进行链路监测的。 比如:miimon=100,那么系统每100ms监测一次链路连接状态,如果有一条线路不通就转入另一条线路;mode的值表示工作模式,他共有0,1,2,3四种模式,常用的为0,1两种。

  mode=0表示load balancing (round-robin)为负载均衡方式,两块网卡都工作。

  mode=1表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,也就是说默认情况下只有一块网卡工作,另一块做备份.

  bonding只能提供链路监测,即从主机到交换机的链路是否接通。如果只是交换机对外的链路down掉了,而交换机本身并没有故障,那么bonding会认为链路没有问题而继续使用

  4 # vi /etc/rc.d/rc.local

  加入

  ifenslave bond0 eth0 eth1

  重启后我们用ifconfig查看网卡信息,可以看到多出一个bond0网卡.

  bond0 Link encap:Ethernet HWaddr00:0C:29:C2:B3:44

  inet addr:192.168.1.200 Bcast:192.168.1.255 Mask:255.255.255.0

  UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1

  RX packets:48 errors:0 dropped:0 overruns:0 frame:0

  TX packets:38 errors:0 dropped:0 overruns:0 carrier:0

  collisions:0 txqueuelen:0

  RX bytes:8817 (8.6 KiB) TX bytes:4807 (4.6 KiB)

  eth0 Link encap:Ethernet HWaddr 00:0C:29:C2:B3:44

  UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1

  RX packets:44 errors:0 dropped:0 overruns:0 frame:0

  TX packets:46 errors:0 dropped:0 overruns:0 carrier:0

  collisions:0 txqueuelen:1000

  RX bytes:8196 (8.0 KiB) TX bytes:6007 (5.8 KiB)

  Interrupt:169 Base address:0x2000

  eth1 Link encap:Ethernet HWaddr 00:0C:29:C2:B3:44

  

  UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1

  RX packets:8 errors:0 dropped:0 overruns:0 frame:0

  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

  collisions:0 txqueuelen:1000

  RX bytes:861 (861.0 b) TX bytes:0 (0.0 b)

  Interrupt:193 Base address:0x2080

  lo Link encap:Local Loopback

  inet addr:127.0.0.1 Mask:255.0.0.0

  UP LOOPBACK RUNNING MTU:16436 Metric:1

  RX packets:12 errors:0 dropped:0 overruns:0 frame:0

  TX packets:12 errors:0 dropped:0 overruns:0 carrier:0

  collisions:0 txqueuelen:0

  RX bytes:960 (960.0 b) TX bytes:960 (960.0 b)

  接下来修改以前的网卡的设置

  [root@rhas-13 network-scripts]# cat ifcfg-eth0

  

  DEVICE=eth0

  ONBOOT=yes

  BOOTPROTO=none

  [root@rhas-13 network-scripts]# cat ifcfg-eth1

  

  DEVICE=eth0

  ONBOOT=yes

  BOOTPROTO=none //网卡启动协议.这里我试验了static,dhcp,none发现没有什么区别

  3 # vi /etc/moprobe.conf (旧的版本可能是modules.conf)

  编辑 /etc/moprobe.conf 文件,加入如下一行内容,以使系统在启动时加载bonding模块,对外虚拟网络接口设备为 bond0

  加入下列行

  alias bond0 bonding

  options bond0 miimon=100 mode=1

  alias net-pf-10 off //这行是关闭ipv6支持,也可以不要)

  说明:miimon是用来进行链路监测的。 比如:miimon=100,那么系统每100ms监测一次链路连接状态,如果有一条线路不通就转入另一条线路;mode的值表示工作模式,他共有0,1,2,3四种模式,常用的为0,1两种。

  mode=0表示load balancing (round-robin)为负载均衡方式,两块网卡都工作。

  

  mode=1表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,也就是说默认情况下只有一块网卡工作,另一块做备份.

  bonding只能提供链路监测,即从主机到交换机的链路是否接通。如果只是交换机对外的链路down掉了,而交换机本身并没有故障,那么bonding会认为链路没有问题而继续使用

  4 # vi /etc/rc.d/rc.local

  加入

  ifenslave bond0 eth0 eth1

  重启后我们用ifconfig查看网卡信息,可以看到多出一个bond0网卡.

  bond0     Link encap:Ethernet  HWaddr 00:0C:29:C2:B3:44 

  inet addr:192.168.1.200  Bcast:192.168.1.255  Mask:255.255.255.0

  UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1

  RX packets:48 errors:0 dropped:0 overruns:0 frame:0

  TX packets:38 errors:0 dropped:0 overruns:0 carrier:0

  collisions:0 txqueuelen:0

  RX bytes:8817 (8.6 KiB)  TX bytes:4807 (4.6 KiB)

  eth0      Link encap:Ethernet  HWaddr 00:0C:29:C2:B3:44 

  UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1

  RX packets:44 errors:0 dropped:0 overruns:0 frame:0

  TX packets:46 errors:0 dropped:0 overruns:0 carrier:0

  collisions:0 txqueuelen:1000

  RX bytes:8196 (8.0 KiB)  TX bytes:6007 (5.8 KiB)

  Interrupt:169 Base address:0x2000

  eth1      Link encap:Ethernet  HWaddr 00:0C:29:C2:B3:44 

  UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1

  RX packets:8 errors:0 dropped:0 overruns:0 frame:0

  TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

  collisions:0 txqueuelen:1000

  RX bytes:861 (861.0 b)  TX bytes:0 (0.0 b)

  Interrupt:193 Base address:0x2080

  lo        Link encap:Local Loopback 

  inet addr:127.0.0.1  Mask:255.0.0.0

  UP LOOPBACK RUNNING  MTU:16436  Metric:1

  RX packets:12 errors:0 dropped:0 overruns:0 frame:0

  TX packets:12 errors:0 dropped:0 overruns:0 carrier:0

  collisions:0 txqueuelen:0

  RX bytes:960 (960.0 b)  TX bytes:960 (960.0 b)

  那也就是说在主备模式下,当一个网络接口失效时(例如主交换机掉电等),不回出现网络中断,系统会按照cat /etc/rc.d/rc.local里指定网卡的顺序工作,机器仍能对外服务,

  起到了失效保护的功能.

  可以查看到bond0的工作状态  [root@localhost ~]# cat /proc/net/bonding/bond0

  Ethernet Channel Bonding Driver: v3.0.3 (March 23, 2006)

  Bonding Mode: fault-tolerance (active-backup)

  Primary Slave: None

  Currently Active Slave: eth0

  MIIStatus: up

  MII Polling Interval (ms): 100

  Up Delay (ms): 0

  Down Delay (ms): 0

  Slave Interface: eth0

  MII Status: up

  Link Failure Count: 0

  Permanent HW addr: 00:0c:29:c2:b3:44

  Slave Interface: eth1

  MII Status: up

  Link Failure Count: 0

  Permanent HW addr: 00:0c:29:c2:b3:4e

  以上是一种实现方法.公司的数据库服务器上采用了另一种配置方法

  主要区别在网卡的配置文件上:

  vi ifcfg-eth0

  DEVICE=eth0

  #USERCTL=no

  BOOTPROTO=none

  ONBOOT=yes

  MASTER=bond0

  SLAVE=yes

  ifcfg-eth1中也加入红色的两行,

  /etc/rc.local中的ifenslave bond0 eth0 eth1 可以省略掉.

  在虚拟机中试验一下效果.

  从另一台机器ping我们刚才设置的IP地址,然后在虚拟机vmware下面,点其中的一个网卡

  选中disconnect(断开)

  可以看到ping只是出现了两个time out后就又恢复了正常.说明我们的配置起作用了.

  需要说明的是如果想做成负载均衡,仅仅设置这里options bond0 miimon=100 mode=0是不够的,还需要设置交换机的端口.

  从原理分析一下(bond运行在mode 0下):

  mode 0下bond所绑定的网卡的IP都被修改成一样的mac地址,如果这些网卡都被接在同一个交换机,那么交换机的arp表里这个mac地址对应的端口就有多个,那么交换机接受到发往这个mac地址的包应该往哪个端口转发呢?正常情况下mac地址是全球唯一的,一个mac地址对应多个端口肯定使交换机迷惑了。

  所以mode0下的bond如果连接到交换机,交换机这几个端口应该采取聚合方式(cisco称为ethernetchannel,foundry称为portgroup),因为交换机做了聚合后,聚合下的几个端口也被捆绑成一个mac地址

推广二维码
邮件订阅

如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

重磅专题