よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

NICの冗長化

先日、複数のNICを1つにまとめて、負荷分散や冗長化を行う技術であるBondingの検証を実施しました。
そのときに知ったことをまとめておきます。

■検証環境
 RedHat AS 4 UPDATE 6 (インストール後にパッケージのアップデートなし)にて検証実施。
 ネットワーク構成は以下の通り。

f:id:interu:20080827013108p:image
※ルータ - L3Switch間でSTP(スパニングツリー)を有効としています。
 プライオリティは、ルータ、L3SwitchA、L3SwitchBの順で設定。
 また、L3Switch間はtrunkで。


では早速下調べで知ったこと&実際の設定について述べていきます。


まずBondingについてですが、目的に応じてモードを指定することが可能です。

 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の冗長化が目的だったので、モード1のアクティブ-バックアップで検証をすることにしました。

続いて、アクティブ-バックアップで動作させるためには、アクティブであるNICがLink Upしているかどうかを監視する必要があります。
このNICの死活監視についてはMII監視とARP監視の2通りがあるそうです。

MII監視

 デバイスドライバが提供する機能でLink Downを検知

ARP監視

 物理デバイスの受信パケットカウントでLink Downを検知

MII監視を使用する場合は、mii-toolコマンドで各NICがMIIリンクに対応しているかどうかを確認する必要があるとのこと。

# mii-tool
eth0: negotiated 100baseTx-FD flow-control, link ok
eth1: negotiated 100baseTx-FD flow-control, link ok

※他サイトのコピーですが、似たような表示が出力されたことは確認しています。

ここまで確認できたので、MII監視を利用してみようと
/etc/modprobe.confに以下を追記して試してみました。

install bond0 /sbin/modprobe bonding -o bond0 mode=1 miimon=100 primary=eth0
alias eth0 epic100
alias eth1 tg3

#eth0,eth1,bond0の設定については省略します


bond0を活性化し、eth0とeth1のどちらがアクティブとなっているのかを以下のコマンドで確認すると以下のような出力でeth0が今現在はアクティブであることがわかります。

#cat /proc/net/bonding/bond0
・・・(略)
Currently Active Slave: eth0
・・・(略)

ここまで確認できたのため、クライアントからサーバ宛にpingを送出させながらeth0につながっているLANケーブルを抜いてみました。

f:id:interu:20080827013109p:image

想定では、eth1のNICがアクティブになりpingに応答するだろうと思っていたのですが、思うように行かず・・・。
ルータやL3Switchの設定がまずいのかといろいろと調査しましたがそうではなく、MII監視でeth0のリンクがダウンしているにもかかわらず、
アクティブなNICがeth0のままであるところに問題があることがわかりました。

# mii-tool
eth0: link down ※たしかこんな感じの表示だった・・・
eth1: negotiated 100baseTx-FD flow-control, link ok

そしてbondingの状態は以下の通り。

#cat /proc/net/bonding/bond0
・・・(略)
Currently Active Slave: eth0
・・・(略)

なので、試しにeth0を非活性化してみると、アクティブなNICがeth1に切り替わりpingに応答するようになりました。
これでは微妙なので、ARP監視も試してみることにしました。

ARP監視では以下のような設定を/etc/modprobe.confに追記する必要があります。

arp_interval :導通確認の間隔

arp_ip_target:導通確認用のIPアドレス

今回はこのように設定。

install bond0 /sbin/modprobe bonding -o bond0 mode=1 primary=eth0 arp_interval=1000 arp_ip_target=192.168.0.xxx ←eth0のIPアドレス
alias eth0 epic100
alias eth1 tg3

これでMII監視時と同じようにeth0に接続しているLANケーブルを抜いてみると、きちんとフェイルオーバするではないですか!

MII監視の設定が間違っていたのかなぁ??
あとで調べてみようっと。

ちなみに障害が発生していたリンクが復旧するとアクティブなNICはeth1からeth0にフェイルバックしてしまいます。
フェイルバックを無効化するオプションがないか探してみたのですが、どうやらなさそうですね。。。。