保持服務器的高可用性接的高可用性是企業級IT 環境的重要因素。其中最重要的一點是服務器網絡連環境的重要因素。其中最重要的一點是服務器網絡連接的高可用性。網卡(NIC)綁定技術有助于保證高可用性特性并提供其它優勢以提高網絡性能。
我們在這介紹的Linux雙網卡綁定實現就是使用兩塊網卡虛擬成為一塊網卡,這個聚合起來的設備看起來是一個單獨的以太網接口設備,通俗點講就是兩塊網卡具有相同的IP地址而并行鏈接聚合成一個邏輯鏈路工作。其實這項技術在Sun和Cisco中早已存在,被稱為Trunking和Etherchannel技術,在Linux的2.4.x的內核中也采用這這種技術,被稱為bonding。bonding技術的最早應用是在集群——beowulf上,為了提高集群節點間的數據傳輸而設計的。下面我們討論一下bonding的原理,什么是bonding需要從網卡的混雜(promisc)模式說起。我們知道,在正常情況下,網卡只接收目的硬件地址(MACAddress)是自身Mac的以太網幀,對于別的數據幀都濾掉,以減輕驅動程序的負擔。但是網卡也支持另外一種被稱為混雜promisc的模式,可以接收網絡上所有的幀,比如說tcpdump,就是運行在個模式下,bonding也運行在這個模式下,而且修改了驅動程序中的mac地址,將兩塊網卡的Mac地址改成相同,可以接收特定mac的數據幀。然后把相應的數據幀傳送給bond驅動程序處理。
說了半天理論,其實配置很簡單:
綁定的前提條件:芯片組型號相同,而且網卡應該具備自己獨立的BIOS芯片
SUSE LINUX Enterprise Server 9下的配置步驟
1. 編輯虛擬網絡接口配置文件,指定網卡IP
[sles9:/etc/sysconfig/network]# cp /etc/sysconfig/network/ifcfg.template ifcfg-bond0
[sles9:/etc/sysconfig/network]# vi /etc/sysconfig/network/ifcfg-bond0
2. #vi ifcfg-bond0
#將STARTMODE設置為'onboot'
STARTMODE='onboot'
#將BOOTPROTO設置為'static'
BOOTPROTO='static'
#設置IPADDR
IPADDR=172.31.0.13
#設置子網掩碼
NETMASK=255.255.252.0
#設置廣播地址
BROADCAST=172.31.3.255
這里要主意,不要在單個網卡的配置文件中指定IP地址設定信息如:地址、子網掩碼或網卡ID。將上述信息指定到虛擬(bonding)配置文件ifcfg-bond?中即可。
將IPADDR,NETMASK,BROADCAST的設置從網卡配置文件 /etc/sysconfig/network/ifcfg-eth-id-xx:xx:xx:xx:xx:xx 中刪除掉,其中 xx:xx:xx:xx:xx:xx 是要配置bonding 的網卡的 MAC 地址。
3. 編輯/etc/modprobe.conf文件,加入如下內容,系統在加載bonding模塊時,使用文件里指定的參數:
alias bond0 bonding
options bond0 miimon=100 mode=1
#options bond0 arp_interval=100 arp_ip_target=xxx.xxx.xxx.xxx mode=1
說明:miimon是用來進行鏈路監測的。比如:miimon=100,那么系統每100ms監測一次鏈路連接狀態,如果有一條線路不通就轉入另一條線路;mode的值表示工作模式,他共有0,1,2,3四種模式,常用的為0,1兩種。bonding可以通過兩種機制進行鏈路監控,miimon需要驅動支持,arp_interval/arp_ip_target不需要驅動支持,arp_interval指定arp檢查的時間間隔,arp_ip_target是要反向查詢arp的ip地址列表,最多16個,以逗號分隔,例如:arp_interval=100 arp_ip_target=192.168.100.5,192.168.100.6,表示每100毫秒作一次arp檢查,如果192.168.100.5和192.168.100.6的arp檢查的結果都失敗了,則鏈路狀態為斷開,bonding的active interface作出切換。
mode=0表示load balancing(round-robin)為負載均衡方式,兩塊網卡都工作。
mode=1表示fault-tolerance(active-backup)提供冗余功能,工作方式是主備的工作方式,也就是說默認情況下只有一塊網卡工作,另一塊做備份。
bonding只能提供鏈路監測,即從主機到交換機的鏈路是否接通。如果只是交換機對外的鏈路down掉了,而交換機本身并沒有故障,那么bonding會認為鏈路沒有問題而繼續使用
4 # vi /etc/rc.d/boot.local
加入下面幾行
# probe ethernet card kernel module first
/sbin/modprobe e1000
# probe bonding kernel module
/sbin/modprobe bonding miimon=100 mode=1
#/sbin/modprobe bonding arp_inerval=100 arp_ip_target=192.168.100.5,192.168.100.6
這里我們假設用戶只有兩塊Intel e1000 網卡,首先加載網卡的驅動e1000,如果是其他的網卡使用不同的驅動,然后加載bonding驅動。
實際上在這個階段需要作的操作是首先按照網卡的邏輯順序加載網卡驅動,然后在所有網卡的驅動都按所需的順序成功加載之后再用合適的參數加載bonding驅動。
例如:在邏輯上的 eth0 eth1 為 Intel e1000,eth2 eth3 為 BCM5700,
這種情況下/etc/rc.d/boot.local :
# probe first, second ethernet card kernel module
/sbin/modprobe e1000
# probe third, fourth ethernet card kernel module
/sbin/modprobe bcm5700
# probe bonding kernel module
/sbin/modprobe bonding miimon=100 mode=1
#/sbin/modprobe bonding arp_interval=100 arp_ip_target=192.168.100.5,192.168.100.6 mode=1
對于鏈路狀態的監控,除了用miimon參數外,還可以用arp_interval/arp_ip_target參數來監控
arp_interval用于配置arp檢查的時間間隔,arp_ip_target用于配置在作arp檢查時,使用的ip地址,
可以有多個ip地址,用逗號分隔。例如:arp_interval=100 arp_ip_target=10.0.0.1,10.0.0.2
5 添加配置文件 /etc/sysconfig/bonding.conf 和 系統V啟動腳本 /etc/init.d/bonding
配置文件 /etc/sysconfig/bonding.conf內容:
# BOND_INTERFACE: interface used as bonding interface
BOND_INTERFACE="bond0"
# BOND_ARGS: ether interfaces which will passed to BOND_INTERFACE
BOND_ARGS="eth0 eth1"
啟動腳本 /etc/init.d/bonding 內容:
#! /bin/sh
# Copyright (c) 1995-2001 SuSE GmbH Nuernberg, Germany.
# Author: Dirk Lerner
# /etc/init.d/bonding
# and symbolic its link
# /usr/sbin/rcbonding
#
### BEGIN INIT INFO
# Provides: bonding
# Required-Start: network
# Required-Stop:
# Default-Start: 2 3 5
# Default-Stop: 0 1 6
# Description: bonding
### END INIT INFO
. /etc/rc.status
CONFIG="/etc/sysconfig/bonding.conf"
test -f $CONFIG || exit 5
. $CONFIG
IFENSLAVE_BIN=/sbin/ifenslave
test -x $IFENSLAVE_BIN || exit 5
rc_reset
case "$1" in
start)
echo -n "start bonding service interface $BOND_INTERFACE slave $BOND_ARGS ..."
for i in $BOND_ARGS
do
$IFENSLAVE_BIN $BOND_INTERFACE $i
done
rc_status -v
;;
stop)
echo -n "stop bonding service interface $BOND_INTERFACE slave $BOND_ARGS ..."
for i in $BOND_ARGS
do
$IFENSLAVE_BIN -d $BOND_INTERFACE $i
done
rc_status -v
;;
status)
echo -n "show bonding service interface $BOND_INTERFACE status..."
$IFENSLAVE_BIN -a $BOND_INTERFACE 2> /dev/null
rc_status -v
;;
*)
echo "Usage: $0 start|stop|status"
exit 1
esac
rc_exit
6. 編譯 ifenslave 工具
ifenslave util's source code was in kernel source packages, if your system do not install it please install kernel-source package first.
# cd /usr/src/linux/Documentation/networking
# gcc -Wall -Wstrict-prototypes -O -I/usr/src/linux/include ifenslave.c -o ifenslave
# cp ifenslave /sbin/ifenslave
7. 為 bonding 創建系統V 啟動腳本鏈接
# chkconfig -a bonding
到這時已經配置完畢, 重新啟動網絡服務。
# /etc/rc.d/boot.local
# /etc/rc.d/network restart
# /etc/rc.d/bonding start
下面我們討論以下mode分別為0,1時的情況
mode=1工作在主備模式下,這時eth1作為備份網卡是noarp的
[root]#ifconfig驗證網卡的配置信息
bond0 Link encap:Ethernet HWaddr 00:0E:7F:25:D9:8B
inet addr:172.31.0.13 Bcast:172.31.3.255 Mask:255.255.252.0
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:18495 errors:0 dropped:0 overruns:0 frame:0
TX packets:480 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1587253 (1.5 Mb) TX bytes:89642 (87.5 Kb)
eth0 Link encap:Ethernet HWaddr 00:0E:7F:25:D9:8B
inet addr:172.31.0.13 Bcast:172.31.3.255 Mask:255.255.252.0
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:9572 errors:0 dropped:0 overruns:0 frame:0
TX packets:480 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:833514 (813.9 Kb) TX bytes:89642 (87.5 Kb)
Interrupt:11
eth1 Link encap:Ethernet HWaddr 00:0E:7F:25:D9:8B
inet addr:172.31.0.13 Bcast:172.31.3.255 Mask:255.255.252.0
UP BROADCAST RUNNING NOARP SLAVE MULTICAST MTU:1500 Metric:1
RX packets:8923 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:753739 (736.0 Kb) TX bytes:0 (0.0 b)
Interrupt:15
那也就是說在主備模式下,當一個網絡接口失效時(例如主交換機掉電等),不會出現網絡中斷,系統會按照cat /etc/rc.d/boot.local 里指定網卡的順序工作,機器仍能對外服務,起到了失效保護的功能。
在mode=0負載均衡工作模式下,能在提供帶寬的負載均衡的同時提供失效保護,我們來看一下網卡的配置信息
[root]# ifconfig
bond0 Link encap:Ethernet HWaddr 00:0E:7F:25:D9:8B
inet addr:172.31.0.13 Bcast:172.31.3.255 Mask:255.255.252.0
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:2817 errors:0 dropped:0 overruns:0 frame:0
TX packets:95 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:226957 (221.6 Kb) TX bytes:15266 (14.9Kb)
eth0 Link encap:Ethernet HWaddr00:0E:7F:25:D9:8B
inet addr:172.31.0.13 Bcast:172.31.3.255 Mask:255.255.252.0
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:1406 errors:0 dropped:0 overruns:0 frame:0
TX packets:48 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:113967 (111.2 Kb) TX bytes:7268 (7.0 Kb)
Interrupt:11
eth1 Link encap:Ethernet HWaddr 00:0E:7F:25:D9:8B
inet addr:172.31.0.13 Bcast:172.31.3.255 Mask:255.255.252.0
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:1411 errors:0 dropped:0 overruns:0 frame:0
TX packets:47 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:112990 (110.3 Kb) TX bytes:7998 (7.8 Kb)
Interrupt:15
在這種情況下出現一塊網卡失效,僅僅會是服務器出口帶寬下降,也不會影響網絡使用。
通過查看bond0的工作狀態查詢能詳細的掌握bonding的工作狀態
[sles9:~]# cat /proc/net/bond0/info
bonding.c:v2.2.14 (June 30, 2003)
Bonding Mode: load balancing (round-robin)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Multicast Mode: all slaves
Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0e:7f:25:d9:8a
Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0e:7f:25:d9:8b
SUSE LINUX Enterprise Server 8下的配置步驟
配置步驟與 SLES9 類似,下面只列出區別的地方
(1) SLES8 下內核模塊參數的配置是在 /etc/modules.conf
3. 編輯 /etc/modules.conf 文件,加入如下內容,以使系統在啟動網絡服務時加載bonding模塊,對外虛擬網絡接口設備為bond0:
alias bond0 bonding
options bond0 miimon=100 mode=1
#options bond0 arp_interval=100 arp_ip_target=xxx.xxx.xxx.xxx,xxx.xxx.xxx.xxx mode=1
(2) SLES8 下的網卡配置文件缺省命名不是 ifcfg-eth-id-xx.xx.xx.xx.xx.xx,而是
將IPADDR,NETMASK,BROADCAST的設置從網卡配置文件
/etc/sysconfig/network/ifcfg-ethn中刪除掉,但保留 BOOTPROTO 為static,STARTMODE 為onboot,其中ethn 是邏輯上要加入 bonding 配置的網卡的邏輯設備名。