Linux‎ > ‎

Linux NIC Bonding

Introduction

Linux Bonding Driver可聚集多個網路埠捆綁(Bonding)成單一個邏輯網路埠,也就是所謂的鏈路聚集(Link Aggregation)的應用。鏈路聚集功能可讓擁有多個GbE埠的主機發揮更大效益,得到更可靠或更高效率的網路服務。

一般來說,它提供多種用途的模式(mode)來達到多個網路埠間的Hot standbyLoad balance,可預防單點錯誤的發生。預設共有7種模式可供選擇,依照使用者不同的負載平衡及容錯的需求來作安裝及設定。

 

LAB Environment

OS & Version

CentOS 6.3 (2.6.32-279.14.1.el6.x86_64)

Bonding device

bond0

eth0

Bonding Mode: 0 / balance-rr

eth1

bond1

eth2

Bonding Mode: 6 / balance-alb

eth3

 

Bonding Modes

Mode

Mode Name

Explanation

LB / FT

0

balance-rr

Round-robin policy: 所有的網路埠採循序式輪流來作封包的傳遞,由第一個網路埠開始傳送,依序至最後的網路埠,但同一時間只有一個網路埠有在運作。

Load Balance

Fault Tolerance

1

active-backup

Active & Backup policy: 在構成Bonding的群組內,只有一個網路埠是Active狀態,其餘都是備援狀態。只有當Active的網路埠故障,另外備援的網路埠才會接手轉換成Active埠。

不需要外部Switch額外的設定及支援。

Fault Tolerance

2

balance-xor

XOR policy: 可視為進階版的Mode 0,不同於Mode 0簡單的將封包依序輪流指派給不同的網路埠,Mode 2加入了Hash演算法計算來源端與目的端的MAC位址數量來去作網路埠的分派及封包的傳遞。

Load Balance

Fault Tolerance

3

broadcast

Broadcast policy: 將所有的封包發送給Bonding內所有可用的網路埠作傳遞。

Fault Tolerance

4

802.3ad

IEEE 802.3ad Dynamic link aggregation: 按照802.3ad規範,將多個網路埠組成一個共享相同速度及全雙工的鏈路聚集。但Switch需要能支援並啟動802.3ad協定才能啟用這個模式。

Cisco 3550系列為例,首先需將要組成的網路埠設定為EtherChannel (或稱為Trunk Group),然後再設定為LACP模式,以啟動802.3ad協定。

Load Balance

Fault Tolerance

5

balance-tlb

Adaptive transmit load balancing: 這個模式對於封包發送與接收作業採用不同的分配機制。封包發送會依據各個網路埠目前的負載情況(計算相對速度)來作發送的分配;而封包接收則由目前正在運作中的網路埠來負責,如果接收埠故障,則由另一埠套用原先MAC位址接手。

不需要外部Switch額外的設定及支援。

Transmit:

Load Balance

Fault Tolerance

 

Receive:

Fault Tolerance

6

balance-alb

Adaptive load balancing: TLB的加強版,採用ARP協定,在接收埠端加入TLB沒有的Load Balance

不需要外部Switch額外的設定及支援。

Load Balance

Fault Tolerance

 

Configuration Bonding Devices (Initscripts Support)

1.   修改 /etc/sysconfig/network-scripts/ifcfg-* ,指定MasterSlaveeth埠。下列範例將新增兩組Bonding device,分別為Bond0Bond1Bond0成員包含eth0eth1埠裝置,Bond1成員則包含eth2eth3

ifcfg-bond0

ifcfg-eth0

ifcfg-eth1

DEVICE=bond0

IPADDR=172.20.144.82

NETMASK=255.255.255.0

GATEWAY=172.20.144.254

ONBOOT=yes

BOOTPROTO=none

USERCTL=no

BONDING_OPTS="mode=0 miimon=100"

DEVICE=eth0

USERCTL=no

ONBOOT=yes

MASTER=bond0

SLAVE=yes

BOOTPROTO=none

DEVICE=eth1

USERCTL=no

ONBOOT=yes

MASTER=bond0

SLAVE=yes

BOOTPROTO=none

 

ifcfg-bond1

ifcfg-eth2

ifcfg-eth3

DEVICE=bond1

IPADDR=1.1.1.2

NETMASK=255.255.255.0

ONBOOT=yes

BOOTPROTO=none

USERCTL=no

BONDING_OPTS="mode=6 miimon=100"

DEVICE=eth2

USERCTL=no

ONBOOT=yes

MASTER=bond1

SLAVE=yes

BOOTPROTO=none

DEVICE=eth3

USERCTL=no

ONBOOT=yes

MASTER=bond1

SLAVE=yes

BOOTPROTO=none

 

2.  上列Bonding選項參數(BONDING_OPTS)是直接寫入至各個ifcfg-bond*設定檔內(: RHEL版本需在v5之後才可指定BONDING_OPTS參數)。除了上述方法外,也可將Bonding選項參數寫至 /etc/modprobe.conf (: 通用各個RHEL發行版本)。內容參考如下:

alias bond0 bonding

options bond0 -o bond0 mode=0 miimon=100

 

alias bond1 bonding

options bond0 -o bond1 mode=6 miimon=100

: 此處若要系統Bonding模組載入多個bond數量,必須要為每個不同的bond命名。例如加入 -o <bond name>。之後,依據上列設定二組bond0bond1,系統將會參照這二組選項並依序載入兩次。

 

3.   設定結束後,請重新啟動網路服務。

[root@JLAB ~]# service network restart

 

4.   目錄 /proc/net/bonding/ 底下包含了各個Bonding裝置的唯讀資訊檔,開啟此檔案可檢視有關Bonding的設定、選項及各個網路埠的狀態

I.  檢視Bond0狀態

[root@JLAB ~]# cat /proc/net/bonding/bond0

Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)

 

Bonding Mode: load balancing (round-robin)

MII Status: up

MII Polling Interval (ms): 100

Up Delay (ms): 0

Down Delay (ms): 0

 

Slave Interface: eth1

MII Status: up

Speed: 1000 Mbps

Duplex: full

Link Failure Count: 0

Permanent HW addr: 00:50:56:bd:37:7e

Slave queue ID: 0

 

Slave Interface: eth0

MII Status: up

Speed: 1000 Mbps

Duplex: full

Link Failure Count: 0

Permanent HW addr: 00:50:56:bd:6a:0e

Slave queue ID: 0

 

II.  檢視Bond1狀態

[root@JLAB ~]# cat /proc/net/bonding/bond1

Ethernet Channel Bonding Driver: v3.6.0 (September 26, 2009)

 

Bonding Mode: adaptive load balancing

Primary Slave: None

Currently Active Slave: eth2

MII Status: up

MII Polling Interval (ms): 100

Up Delay (ms): 0

Down Delay (ms): 0

 

Slave Interface: eth2

MII Status: up

Speed: 1000 Mbps

Duplex: full

Link Failure Count: 0

Permanent HW addr: 00:50:56:bd:67:0b

Slave queue ID: 0

 

Slave Interface: eth3

MII Status: up

Speed: 1000 Mbps

Duplex: full

Link Failure Count: 0

Permanent HW addr: 00:50:56:bd:00:d5

Slave queue ID: 0

 

5.   確認所有網路埠狀態

[root@JLAB ~]# ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: eth0: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000

    link/ether 00:50:56:bd:6a:0e brd ff:ff:ff:ff:ff:ff

3: eth1: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond0 state UP qlen 1000

    link/ether 00:50:56:bd:6a:0e brd ff:ff:ff:ff:ff:ff

4: eth2: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond1 state UP qlen 1000

    link/ether 00:50:56:bd:67:0b brd ff:ff:ff:ff:ff:ff

5: eth3: <BROADCAST,MULTICAST,SLAVE,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master bond1 state UP qlen 1000

    link/ether 00:50:56:bd:00:d5 brd ff:ff:ff:ff:ff:ff

6: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP

    link/ether 00:50:56:bd:6a:0e brd ff:ff:ff:ff:ff:ff

    inet 172.20.144.82/24 brd 172.20.144.255 scope global bond0

    inet6 fe80::250:56ff:febd:6a0e/64 scope link tentative dadfailed

       valid_lft forever preferred_lft forever

7: bond1: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP

    link/ether 00:50:56:bd:67:0b brd ff:ff:ff:ff:ff:ff

    inet 1.1.1.2/24 brd 1.1.1.255 scope global bond1

    inet6 fe80::250:56ff:febd:670b/64 scope link

       valid_lft forever preferred_lft forever

 

6.   當然,也可用工具 ethtool來檢查各個網路埠的狀態。

 

Reference: http://www.kernel.org/doc/Documentation/networking/bonding.txt

Ċ
James Chan,
2012年12月8日 凌晨1:47
Ċ
James Chan,
2012年12月8日 凌晨1:57
Comments