2013年2月4日 星期一

Linux 網路負載均衡的實現



保持伺服器的高可用性是企業級IT 環境的重要因素,其中重要的一點是伺服器網路連接的高可用性。利用伺服器的網卡綁定技術有助於保證高可用特性並且提高網路性能。
在這裡介紹一下Linux 下雙網卡綁定實現負載均衡,即將兩塊網卡虛擬成為一塊網卡,這個聚合起來的設備可以看作是一個單獨的乙太網周邊設備,也可以理解為兩塊網卡具有相同的IP 位址而並行連結聚合成一個邏輯鏈路工作。其實這項技術在Sun Cisco 中早已存在,被稱為Trunking Etherchannel 技術;在Linux 2.4.x 內核中也採用這種技術,被稱為BondingBonding 技術的最早應用是在集群——Beowulf 上,為了提高集群節點間的資料傳輸而設計的。
下面討論一下Bonding 的原理,什麼是Bonding 需要從網卡的混雜(Promisc)模式說起。在通常情況下,網卡只接收目的硬體位址(MAC Address)是自身Mac 的乙太網幀,對於別的資料幀都濾掉,以減輕驅動程式的負擔 ;但同時網卡也支援另外一種被稱為混雜(Promisc)的模式,可以接收網路上所有的幀(例如:tcpdump)Bonding 也運行在這個模式下,而且修改了驅動程式中的Mac 位址,將兩塊網卡的Mac 位址改成相同,可以接收特定Mac 資料幀,然後把相應的資料幀傳送給Bond驅動程式處理。
以下的配置雙網卡綁定是在RedHat Linux Enterprise 3.0 的環境下實現的。網卡綁定的前提條件是確保兩塊網卡具有相同型號的獨立晶片組。
·         # vi /etc/sysconfig/network-scripts/ ifcfg-bond0 
[root@rhas root]# cp /etc/sysconfig/network-scripts/ifcfg-eth0 ifcfg-bond0

編輯虛擬網路介面設定檔,指定網卡IP位址。
·         # vi ifcfg-bond0
將第一行改成:DEVICE=bond0
# cat ifcfg-bond0
DEVICE=bond0
BOOTPROTO=static
IPADDR=172.31.0.13
NETMASK=255.255.252.0
BROADCAST=172.31.3.254
ONBOOT=yes
TYPE=Ethernet

這裡要注意,不要指定單個網卡的IP 位址、子網路遮罩或網卡ID;將上述資訊指定到虛擬適配器(Bonding)中即可。

[root@rhas network-scripts]# cat ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
[root@rhas network-scripts]# cat ifcfg-eth1
DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp
·         # vi /etc/modules.conf

編輯 /etc/modules.conf 檔,加入如下兩行內容,以使系統在啟動時載入bonding 模組,對外虛擬網路周邊設備bond0

alias bond0 bonding
options bond0 miimon=100 mode=1

說明:miimon 是用來進行鏈路監測的。如果miimon=100,那麼系統每100ms 監測一次鏈路連接狀態,如果有一條線路不通就轉入另一條線路;mode 的值表示工作模式,它共有0123四種模式,常用的為01兩種。
mode=0
表示load balancing (round-robin)為負載均衡方式,兩塊網卡都工作。
mode=1
表示fault tolerance (active-backup)提供冗餘功能,工作方式是主備的工作方式,也就是說預設情況下只有一塊網卡工作,另一塊做備份。
bonding
只能提供鏈路監測,即從主機到交換機的鏈路是否接通。如果只是交換機對外的鏈路down 掉了,而交換機本身並沒有故障,那麼bonding 會認為鏈路沒有問題而繼續使用。

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

加入兩行:
ifenslave bond0 eth0 eth1
route add -net 172.31.3.254 netmask 255.255.255.0 bond0
到此雙網卡綁定已經配置完成,重新開機伺服器就會看到以下表示配置成功的資訊了。
**********
Bringing up interface bond0 OK
 
Bringing up interface eth0 OK
 
Bringing up interface eth1 OK
**********
下面我們討論一下mode 分別為01時的情況:
mode=1 工作在主備模式下,這時eth1 作為備份網卡是no arp 的:
[root@rhas network-scripts]# 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 SLAVEMULTICAST 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/rc.local 裡指定網卡的順序工作,機器仍能對外服務,起到了失效保護的功能。
mode=0 負載均衡工作模式,它能提供兩倍的頻寬:
[root@rhas 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.9 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: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 的具體工作狀態: 

[root@rhas bonding]# cat /proc/net/bonding/bond0
bonding.c:v2.4.1 (September 15, 2003)
Bonding Mode: load balancing (round-robin)
MII Status: up
 
MII Polling Interval (ms): 0
 
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

沒有留言: