CentOS(Sientific Linux) 6 で Bonding & Bridge

毎日毎日、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です。

    ということで確認も終わり!

    他にもいろいろやりたい。