NIC冗長化(bonding)
カーネルのモジュールであるbondingを使用してNICの冗長化をする方法。
bondingとは?
簡単に書くと複数のNICを一つにまとめて、負荷分散や冗長化を行うというものです。
kernelのモジュールである「bondモジュール」をつかうので、bondingといったように呼ばれているらしいです。
注意点
BondingでリピータHUB(いわゆる馬鹿ハブ・ダムハブ)を使用するとコリジョンが多発する為、スイッチングHUBの使用が必要です。
※ リピーターHUBは受信データを受信中のポートを除く全てのポートから一斉に送信します。 なので、リピーターHUBをつかってbondingをしている端末でデータ送信を行うと、 bondingされているNICデバイス全てに同じデータが送信され(bondingされているNICデバイスはMACアドレスが全部同じになるため)、 問題が発生しちゃうということらしいです。
また、bondingを行うためにはカーネルレベルで対応していなくてはいけません。
Kernel-2.4.18以降であればデフォルトでBonding のモジュールは組み込まれています。それ以前のカーネルでは、カーネルをバージョンアップしたり
パッチを当てる等の作業が必要になるらしいです。(検証をしていないので未確認ですが・・・)
bondingモジュール設定(/etc/modprobe.conf)
kernelのモジュールであるbondを使えるように、設定ファイルである/etc/modprobe.confにbondingの設定を追加します。
※ディストリビューションによっては/etc/modules.confの場合もあります。
書式
設定内容はbond0のalias設定と、bondingの方式とNIC死活監視の設定となります。
alias bond0 bonding
options bonding mode=x miimon=x arp_interval=x arp_ip_target=xxx.xxx.xxx.xxx (primary=eth0)
bonding mode (方式)
bondingには以下のmode(方式)があります。
0: load balancing (round-robin):ラウンドロビン方式。
使用できるスレーブデバイスから順にデータの送受信を行い、負荷分散と冗長化に対応します。
1: fault-tolerance (active-backup):アクティブ・バックアップ方式。
1つのスレーブがアクティブでありそのスレーブに障害が起きたとき自動的に他のスレーブを使用し、冗長化に対応
2: load balancing (xor):XOR方式。
同じ送信先のMACアドレス対して同じスレーブを使用し、負荷分散と冗長化に対応
3: fault-tolerance (broadcast): 全部のスレーブデバイスでデータの送信を行います。 4: IEEE 802.3ad Dynamic link aggregation:IEEE 802.3ad ダイナミックリンク集合方式。
IEEE 802.3adに対応しているスイッチを用いて、Speed(通信速度100M/1Gb等)とDuplex(全/半二重設定)が同じグループを作って、
全てのスレーブデバイスでデータの送受信をします。(やったことないので、よく分りませんが・・・)
5: transmit load balancing: 送信時のみ負荷分散を行い受信時は冗長化(MACアドレスを引き継ぐ) 6: adaptive load balancing:アクティブロードバランシング方式。
送受信共に負荷分散を行う
NIC死活確認方式 (miimon / arp_interval)
bondingを設定する際にNICの死活監視を行う方法がMIIを使う方法とarp監視の2つがあり、どちらかを指定する必要があります。
(MIIが使えるのならばMIIを使用するのが良いような気がします、ネットワークに無駄なトラフィック流れないし。)
- miimon
- MIIリンク監視頻度を指定をミリ秒単位で指定します。0は使用しない。(MIIをサポートしないNICでは使用できません)
- arp_interval
- ARP監視頻度をミリ秒単位で指定します。0は使用しない。
arp_intervalを使用する場合は、以下の設定も必要となります。
arp_ip_target=
arp_intervalが使用するARP要求のターゲットのIPアドレスを指定します。
複数を指定する場合は「,」でくぎります。
指定例
options bond0 miimon=0 arp_interval=1000 arp_ip_target=192.168.0.1,192.168.0.2,192.168.0.3
※ 設定はミリ秒(m/s)なので、注意してください。私は間違って10秒に1回のチェックと設定しようとしてarp_interval=10とかやってしまい、ネットワークを 不安定にしました・・・
MIIリンクに対応しているかの確認
mii-toolコマンドを使用することにより、NICがMIIリンクに対応しているか簡単に確認出来ます。
対応していない# mii-tool対応している
SIOCGMIIPHY on 'eth0' failed: Operation not supported
SIOCGMIIPHY on 'eth1' failed: Operation not supported
no MII interfaces found
# mii-tool
eth0: negotiated 100baseTx-FD flow-control, link ok
/etc/modprobe.conf 編集
とりあえず、/etc/modprobe.confをバックアップしてから、viで編集していきます。
# cp -p /etc/modprobe.conf /etc/modprob.conf_yyyymmdd
# vi /etc/modprobe.conf
追加内容
今回は、bondingのmodeを1(アクティブ・バックアップ方式)で、NICの死活監視はarp監視(arp_interval)方式を使用します。
alias bond0 bonding
options bonding mode=1 miimon=0 arp_interval=10000 arp_ip_target=192.168.85.1 primary=eth0
※primary=eth0というのは、正常時に使用するNICデバイスをeth0へ指定するという設定です。
/etc/modprobe.confの中身
参考までに、/etc/modprobe.confをcatしてみるとこんな感じになっています。
alias eth0 bnx2参考 http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/ja/ref-guide/s1-modules-ethernet.html
alias eth1 bnx2
alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptscsi
alias scsi_hostadapter2 mptfc
alias scsi_hostadapter3 mptspi
alias scsi_hostadapter4 mptsas
alias scsi_hostadapter5 mptscsih
alias scsi_hostadapter6 qla2xxx
alias scsi_hostadapter7 ata_piix
alias scsi_hostadapter8 qla2300
alias usb-controller ehci-hcd
alias usb-controller1 uhci-hcd
alias bond0 bonding
options bonding mode=1 miimon=0 arp_interval=10000 arp_ip_target=192.168.85.1 primary=eth0
NIC設定
/etc/modprobe.confの設定が終わったら、今度はbondigで使用するNICデバイスの設定を行っていきます。
bond0設定
bondingインターフェイス(仮想NIC)であるbond0の設定です。書式は通常のNICの設定とほぼ同じです。
# vi /etc/sysconfig/network-scripts/ifcfg-bond0
ifcfg-bond0 設定内容
DEVICE=bond0
IPADDR=192.168.0.100
NETMASK=255.255.255.0
NETWORK=192.168.0.0
BROADCAST=192.168.0.255
ONBOOT=yes
TYPE=Ethernet
BOOTPROTO=none
USERCTL=no
eth0デバイス設定
今回bondingに使用されるNICデバイスである「eth0」「eth1」の設定を行います。
設定内容的には、MATERのNICデバイスをbond0にし自分はSLAVEである事を設定します。 なお、IP情報等の設定はありません。
# vi /etc/sysconfig/network-scripts/ifcfg-eth0
ifcfg-eth0 設定内容
DEVICE=eth0
ONBOOT=yes
TYPE=Ethernet
MASTER=bond0 SLAVE=yes BOOTPROTO=none
eth1デバイス設定
# vi /etc/sysconfig/network-scripts/eifcfg-eth1
ifcfg-eth1 設定内容
DEVICE=eth1
ONBOOT=yes
TYPE=Ethernet
MASTER=bond0 SLAVE=yes BOOTPROTO=none
設定の有効化
モジュールとNICの設定が終わったら設定を有効化します。再起動の方法はサーバの再起動となります。
# reboot
bonding動作確認
設定に間違いがなく無事設定反映が終われば、bond0というデバイスが見えてくるはずなので ifconfigコマンドでNICの状態を確認してみましょう:-)
# ifconfig -a
bond0 Link encap:Ethernet HWaddr 00:0C:29:87:92:9C
inet addr:192.168.85.129 Bcast:192.168.85.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe87:929c/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:162 errors:0 dropped:0 overruns:0 frame:0
TX packets:179 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:19961 (19.4 KiB) TX bytes:22667 (22.1 KiB)
eth0 Link encap:Ethernet HWaddr 00:0C:29:87:92:9C
inet6 addr: fe80::20c:29ff:fe87:929c/64 Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:148 errors:0 dropped:0 overruns:0 frame:0
TX packets:94 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:18160 (17.7 KiB) TX bytes:12236 (11.9 KiB)
Interrupt:10 Base address:0x1080
eth1 Link encap:Ethernet HWaddr 00:0C:29:87:92:9C
inet6 addr: fe80::20c:29ff:fe87:929c/64 Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:19 errors:0 dropped:0 overruns:0 frame:0
TX packets:98 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2101 (2.0 KiB) TX bytes:12433 (12.1 KiB)
Interrupt:9 Base address:0x1400
************** 以下省略 ***************
※すべてのMACアドレスが一緒になっているのが確認できます。
bonding詳細情報
bondingの詳細な情報については、「/proc/net/bonding/bond0」の中身をcat等で見てみると良いでしょう。
# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v2.6.1 (October 29, 2004)
Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth1
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Link Failure Count: 7
Permanent HW addr: 00:0c:29:87:92:9c
Slave Interface: eth1
MII Status: up
Link Failure Count: 6
Permanent HW addr: 00:0c:29:87:92:a6
HA動作の確認
NICデバイスに繋がっているLANケーブルを引っこ抜いても、通信が出来ることを確認します。
(NIC死活監視間隔の設定によってはNICの切り替えに時間が掛かるので、数秒ほどの通信断が発生すると思います。)