毎日毎日、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 になったようです。
明示的に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です。
ということで確認も終わり!
他にもいろいろやりたい。