毎日毎日、NICを冗長化したいと思いながら一年経ってました。 そろそろやらねば!と思い、先日 bonjour-01サーバにてBondingを実装しました。
また今回は、bonding した デバイスをbr0にBridgeします。 Topotalのbr0は、KVMとVPNで利用しているブリッジデバイスで めちゃくちゃ重要です。
KVMがつながらないと、Topotalのサービスが全停止するし VPNがつながらないと、学内からメール受信もLINEでチャットもできない。
やっぱり考えれば考えるほど、bondingで冗長化したほうがいい。しましょう。
Bonding とは
1台のマシンに複数のネットワーク・インタフェース・カード(NIC)を搭載し、 それらのNICを一つの仮想的なNICとして扱うための技術です。参考(ITPro)
複数NICを仮想的な1つのNICにする技術です。 これにより、NICの冗長化や負荷分散が可能となります。
Bonding の種類
Bonding には6つのモードがあります。モードごとに冗長構成、負荷分散の設定が異なります。 WebにはBondingのいろいろな情報が落ちていますが、信頼性の高い情報が欲しいものです。
ということで探してみたらサーバにありました。 サーバによってLinuxカーネルのバージョンは異なりますのでファイルパスも変わります。
less /usr/local/src/linux-3.2.5/Documentation/networking/bonding.txt
確認すればわかりますが、英語です。頑張りましょう。
日本語が良いという方は以下のリンクをどうぞ。少し古いので注意してください。 Linux bonding ドライバの設定方法
今回は、冗長化も負荷分散(送受信)もでき、特別なスイッチが不要な、 コストパフォーマンスが高い mode 6(balance-alb)を実装します。 監視方法は、MIIリンク監視とARP監視の2つがありますが、ここではMIIリンク監視にします。 理由はARP監視では、同一セグメントへARPパケットをブロードキャストするため コストがかかると判断したからです。 ARP監視で実装する場合には、arp_validate パラメタを3にするといいらしい。
Bonding & Bridging 設定
それでは設定ファイルの例を記載します。
NICの確認
MIIリンク監視をするためには、NICのドライバがMIIに対応している必要があります。 ethtool コマンドを入力して、「No data available」と出力されず、下記のような出力がなされれば大丈夫です。
コマンドの使い方は、 ethtool [interface name] です。
# ethtool eth0
Settings for eth0:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 2
Transceiver: internal
Auto-negotiation: on
MDI-X: on
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000001 (1)
Link detected: yes
bridgeの設定
いつも通りで大丈夫。特にいじる必要なし。
# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
BROADCAST=192.168.0.255
IPADDR=192.168.0.1
NETMASK=255.255.255.0
NETWORK=192.168.0.0
DELAY=0
bondingの設定
modprobe の設定
# vim /etc/modprobe.d/bonding
alias netdev-bond0 bonding
options bond0 mode=6 miimon=100 arp_interval=0
alias の部分、CentOS6 から、bond0 は deprecatedとなり、netdev-bond0 になったようです。
- miimon・・・MIIリンク監視の頻繁度を設定する。ミリ秒単位。0で無効
- arp_interval・・・ARPの監視頻度。ミリ秒。0で無効。
明示的にARP監視を無効にしています。なくてもmiimonの記載があれば無効になります
modprobeコマンドにて、bonding モジュールをロード
# modprobe bonding
次に仮想NIC(bond0)の定義をします。
# vim /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
BONDING_OPTS="miimon=100 mode=balance-alb arp_interval=0"
arp_interval=0 の部分で mode=balance-alb は 6 を指定しても同じです。
次に、物理NICの設定をします。今回は、eth0とeth1をbondingします。
# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
MASTER=bond0
SLAVE=yes
HWADDR=xx:xx:xx:xx:xx:xx
# vim /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
ONBOOT=yes
MASTER=bond0
SLAVE=yes
HWADDR=xx:xx:xx:xx:xx:xx
HWADDR も明示的に指定。
動作確認
# /etc/init.d/network restart
外側から、Ping疎通などで確認して正常に応答があればOK。 設定したホストで bondingの状況を確認。
# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: adaptive load balancing
Primary Slave: None
Currently Active Slave: eth1
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: 1
Permanent HW addr: xx:xx:xx:xx:xx:xx
Slave queue ID: 0
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:xx
Slave queue ID: 0
eth0, eth1 の MII Statusが upになっています。 これで、eth0,1 がbonding されたことがわかります。 Currently Active Slave: eth1 上記はeth1が現在アクティブであることを示してます。
一回落としてみます。
# ifdown eth1
もう一度確認。
# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)
Bonding Mode: adaptive load balancing
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Slave Interface: eth0
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:xx
Slave queue ID: 0
eth1 のカラムが消え、eth0がActiveになりました。 これで冗長化の確認ができました。
アクティブデバイスの切り替えは下記コマンドにて行えます。
# ifenslave -c bond0 eth1
最後に、Bridge ができているかを確認します。
# brctl show br0
bridge name bridge id STP enabled interfaces
br0 8000.001e6713db59 no bond0
tap0
vnet0
vnet1
vnet2
vnet3
vnet4
vnet5
br0 に対して、bond0 というデバイスが ブリッジされていることがわかります。 ちなみに、tap0 はVPNの仮想NIC、vnetは仮想基盤の仮想NICです。
ということで確認も終わり!
他にもいろいろやりたい。