またbonding

またまたbondingです。

Linuxのbondingは自分で作り込んじゃうのが一番簡単です。
サーバ屋さんはネットワークの事、知らない人が多いし。ネットワーク屋はサーバのbondingなんてまるで興味無かったりしますから。


前にもボンディング(最終)とかボンディング(ちょっとまとめ)とか愚痴書いてるけど、相変わらず。
今回はRedHat(RHEL4)でbonding。別に要件には無いのですけれど、ネットワーク側のコンサル部隊が冗長構成を取るという事にしているので。Linuxのbondingはmodeによって色々設定出来ますよー。とか言うと、そうなんですか!とか返してくるくせに基本設計ではこうしますみたいな書き方されちゃうし。あんたら、もうちょっとサーバのNICの扱いぐらい調べてきたらどうなの?と。ホント、なんて言うんだろう、L2経路冗長&負荷分散とか言うとEther Channelのこととかしか浮かばないんだろうなぁ。。。




前も書いたけれど、Linuxのbondingはネットワークの構築まで自分でやるのでなければmode=1のフォルトトレランス(アクティブ-スタンバイモード)で組むのが一番無難です。
最近の冗長構成はスタックで組む構成も多くなってますので、その場合ならIEEE802.3ad(LACP)で組むとかもアリですが、スイッチの冗長まで考えるとアクティブ-スタンバイで組むほうが楽っちゃ楽です。(NWとSVの構築が別の場合特に調整というか、意思統一が図れないケースが多いので)


NICの故障時にどういう動きになるかを考えて組まなければなりませんが、耐障害性を上げたいのであればActive-Standbyで、性能を重視するならIEEE802.3adやAdaptive Load Balance、更に送信トラフィックだけを重視するか受信トラフィックだけを重視するかによって、modeの選択が変わると思っておけば間違いないかと思います。


今回は耐障害性を重視するので、Active-Standbyで組むことにします。

まず、NICのMIIを取得する方法。NICが物理的にLink Downしたときに使用するNICを切り替えるならMII監視を使います。
良い点はトリガーがLinkUp/Downなので、構成がシンプルなこと。悪い点はネットワークの経路上の問題でLinkUpしたまま通信不可能になった場合は検出が出来ないこと。
この場合必要になるのはNICがMII情報の取得に対応していること。
確認は簡単です。

# mii-tool
eth0: no autonegotiation, 100baseTx-FD, link ok
eth1: negotiated 100baseTx-FD flow-control, link ok
こんな感じでlink状態が表示されるならMII情報の取得が出来ていることになります。

でこの場合、modprobe.confに
alias bond0 bonding
options bonding mode=1 miimon=100
という風に書きます。
mode=1がbonding mode = fault-tolerance(active-backup)の指定、
miimon=100が、miiの監視間隔で単位がミリ秒。なのでmiimon=100とすると1秒に10回確認するという指定になります。miimonの値は0で監視しないという意味になります。

次にARPパケットの監視を行う方法。
alias bond0 bonding
options bonding mode=1 arp_interval=1000 arp_ip_target=192.168.100.1
という風に書きます。
mode=1がbonding mode = fault-tolerance(active-backup)の指定、
arp_interval=1000が、ARPパケットで監視する間隔です。
arp_ip_target=192.168.100.1が監視する対象です。カンマ(,)区切りで16個まで書けます。


次に各インターフェースの設定を行います。
実インターフェース(eth0)は/etc/sysconfig/network-scripts/ifcfg-eth0に
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
束ねるインターフェース(MASTER)がbond0、自分は束ねられる(SLAVE=yes)という感じで設定します。
もう一つのインターフェース(eth1等)も同様に設定します。

bond0インターフェース(仮想)は/etc/sysconfig/network-scripts/ifcfg-bond0に
DEVICE=bond0
ONBOOT=yes
IPADDR=192.168.100.10
NETMASK=255.255.255.0
NETWORK=192.168.100.0
BROADCAST=192.168.100.255
という具合に記述します。bond0インターフェースはIPアドレスを記述するだけなので、簡単です。

これだけ設定をすれば後は簡単に動きます。

bondingドライバを読み込んで
# modprobe bond0

ネットワークを再起動
# service network restart
すれば動作します。

bondingの状態は/procを見ることで表示されます。

# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v2.6.3-rh (June 8, 2005)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: None
Currently Active Slave: eth0
MII Status: up
MII Polling Interval (ms): 0
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:xx

Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: yy:yy:yy:yy:yy:yy
見たまんまですが。

あとはPingを通しながらLinkUpしたままで、経路をダウンさせて見るなり、リンクケーブルを抜いて見るなり、テストすればOKです。最近のカーネルでは変な動きにはならないので、期待通りに動くはずです。