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です。

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

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