Ikeda->Weblog();

Ikedaの徒然雑記。

[メモ] channel-bonding~縛って縛って縛り倒せ

| 0件のコメント

[] channel-~縛って縛って縛り倒せ先日からずっとL2 SW冗長化に関して調べていたんですが、ネットワークの偉い人から

「それって接続する機器も冗長化されてないと意味なくね?」

というツッコミを頂きまして。


考えてみりゃそりゃそうだわな( -人-)


ということで、SWに接続する機器そのもの・・というより、機器とSWを接続する回線の冗長化と併せて行うことにしました。


で、ふと思い出したのが「bonding」という機能。これは「複数の回線を1つの仮想回線にまとめる」というものなんです。なんと好都合。


ということで、早速テスト環境にて試してみましたのでメモメモ。

VMWare上のFedora 9に設定を行いますが、これらにはもともと

eth0: 192.168.254.101 (サービス用)
eth1: 192.168.250.11  (Heartbeat/DBレプリケーション用)

と、2つのNICを設定していました。ここにもう1枚NICをeth2として追加します。

ちょっとeth番号が飛んでしまいますが、既存の設定をできるだけ変えたくなかったのでこのまんま。


NIC設定を変更する


ということで、eth0 と eth2 のNIC設定ファイルを変更していきます。 こんな感じ。

/etc/sysconfig/network-scripts/ifcfg-eth[0|2]

DEVICE=eth0  # ここは設定するNICに合わせる
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no



んでもって、ボンディングした結果(?)の仮想NICについても設定ファイルを記述します。


/etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.254.101
NETMASK=255.255.255.0
BROADCAST=192.168.254.255
USERCTL=no



今までeth0に割り当てていたIPアドレスをbond0に指定し、eth0とeth2にはIPアドレス等を設定せず、「キミは bond0 というMASTERに従属(SLAVE)するのだ!」と指定するわけですね。

さて、設定ファイルはこんな感じでOKなんですが、bondingを実現するにはカーネルにモジュールを突っ込む必要があります。毎回、手でinsmodするのもなんなので、/etc/modprobe.d/bonding というファイルを作ってしまいましょう。


とりあえずbondインタフェースは1つだけなので

alias bond0 bonding
options bonding mode=2 miimon=100


こんな感じ。モジュールオプション(mode・miimon)等についてはこの辺(*リンク編集しました)が参考になります。


また、複数のbondインタフェースを作りたい!という場合、ちょっとトリックが必要なようです。
詳しい設定内容についてはこちらのブログが参考になりました。


で、これで再起動してやればOKなはずですが、とにかくまず試してみたい!ということで手動で。
  1. まずはカーネルモジュールを突っ込みます。

    # /sbin/modprobe bonding

  2. 念のため eth0 と eth2 をdownさせておきます。

    # /sbin/ifdown eth0
    # /sbin/ifdown eth2

  3. そしていよいよbondingインタフェースをup。

    # /sbin/ifup bond0



/var/log/messages を見て、

kernel: Ethernet Channel Bonding Driver: v3.3.0 (June 10, 2008)
kernel: bonding: MII link monitoring set to 100 ms
kernel: ADDRCONF(NETDEV_UP): bond0: link is not ready
kernel: bonding: bond0: Adding slave eth0.
kernel: eth0: link up
kernel: bonding: bond0: enslaving eth0 as an active interface with an up link.
kernel: ADDRCONF(NETDEV_CHANGE): bond0: link becomes ready
kernel: bonding: bond0: Adding slave eth2.
kernel: eth2: link up
kernel: bonding: bond0: enslaving eth2 as an active interface with an up link.


こんなログが出ていたらOKっぽいです。

次に実際のインタフェースを見てみます。

# /sbin/ifconfig -a
bond0 Link encap:Ethernet  HWaddr 00:0C:29:43:A4:97
inet addr:192.168.254.101  Bcast:192.168.254.255  Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe43:a497/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
RX packets:9441 errors:0 dropped:0 overruns:0 frame:0
TX packets:6297 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5133095 (4.8 MiB)  TX bytes:799501 (780.7 KiB)

eth0 Link encap:Ethernet  HWaddr 00:0C:29:43:A4:97
UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
RX packets:9078 errors:0 dropped:0 overruns:0 frame:0
TX packets:4888 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5098266 (4.8 MiB)  TX bytes:600440 (586.3 KiB)
Interrupt:19 Base address:0x2000

eth2 Link encap:Ethernet  HWaddr 00:0C:29:43:A4:97
UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
RX packets:363 errors:0 dropped:0 overruns:0 frame:0
TX packets:1409 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:34829 (34.0 KiB)  TX bytes:199061 (194.3 KiB)
Interrupt:19 Base address:0x2400


おー、立ち上がってますねぇ^^

それぞれのステータス部分にMASTERとSLAVEってのが見えてます。素晴らしいっ!


ちなみにbondingの状態を見るには proc ファイルを覗いてみるのが手っ取り早いかもしれません。

# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.3.0 (June 10, 2008)

Bonding Mode: load balancing (xor)
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:29:43:a4:97

Slave Interface: eth2
MII Status: up
Link Failure Count: 0
Permanent HW addr: 00:0c:29:43:a4:ab



うむ、Slave Interfaceとしてeth0とeth2が居ますね。Statusもupになっています。


ついでにこのまま軽く次の実験を行ってみました。


bondingインタフェースにエイリアスは効くか?


今まではeth0にeth0:0というエイリアスを設定し、heartbeatにより制御していました。このeth0:0にクライアントが接続してくるわけです。

が、bondingしたため eth0 ではなく bond0に対してエイリアスを設定しなければなりません。果たして無事にheartbeatで切り替えできるでしょうか?

cib.xmlの、nic指定の部分を eth0 から bond0 に書き換えアップデートしてみましょう。

# vi cib.src.xml
# /usr/sbin/cibadmin -U -x cib.src.xml




# /sbin/ifconfig -a
bond0     Link encap:Ethernet  HWaddr 00:0C:29:43:A4:97
inet addr:192.168.254.101  Bcast:192.168.254.255  Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe43:a497/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
RX packets:9717 errors:0 dropped:0 overruns:0 frame:0
TX packets:6513 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:5167931 (4.9 MiB)  TX bytes:829783 (810.3 KiB)

bond0:0 Link encap:Ethernet  HWaddr 00:0C:29:43:A4:97
inet addr:192.168.254.20 Bcast:192.168.254.255  Mask:255.255.255.0
UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1



さくっと動いてるよ( ̄▽ ̄;;


まぁ、どちらも耐障害性を高める意味合いの機能ですから、できなきゃまずいんですけどね(笑
ということで、bondingという素晴らしい機能のお陰で頭を抱えていた問題のいくつかが解決しそうです^^


WEBサーバ-DBサーバ間など、高い耐障害性と広い帯域を必要とする部分にbondingを利用すると、かなりいい感じでハッピーになれるかもしれません。問題はNICの増設くらいでしょうか(笑


ビバbonding!

コメントを残す