Ubuntu10.04鯖でbondingするよ・・・と言う話にゃのだが意外とめんどくさい。
にゃにせそこかしこに例が載ってるがコピペばかりで動かにゃい。
とりあえず
modprobe bonding
echo bonding >> /etc/modules
apt-get install ifenslave
echo alias bond0 bonding >> /etc/modprobe.d/bonding.conf
/etc/network/interfaces
auto bond0
iface bond0 inet static
address 1.1.1.1
netmask 255.255.0.0
broadcast 1.1.255.255
gateway 1.1.0.1
slaves eth0 eth1
bond-mode 0
bond-miimon 100
とこんにゃ感じでとりあえず動いてるように見えるが実はちょっと怪しい。
bond-mode 6
にして
/etc/init.d/networking restart
するとみょんにゃことに・・・にゃんぞこれ
とりあえずハマり所が何点か。
まずbonding状態の確認方法
cat /proc/net/bonding/bond0
但し正常に設定されてるとは限らにゃいので
ifconfig
してeth0とeth1のMACを確認する。bond-mode5,6にゃら異にゃるMACににゃってにゃいとおかしい。他には
dstat -N eth0,eth1,bond0
しておいてwgetかnfsかにゃにかipv4で受信してみる。等量のトラフィックが流れてきてたらそれはちっともmode5,6じゃにゃいよね・・・っていう。
次。/etc/network/interfacesのupとかdownって起動時にしか中身読まにゃい? post-upとか書き換えてもrebootしにゃいと反映されてにゃい。にゃんか方法があるだろうけどそもそもaddressにゃんかは読んでくれるので無駄にゃ作業をしてしまった。
ということでとりあえずにゃんでもいいから動いて欲しい設定
/etc/network/interfaces
auto lo
iface lo inet loopback
auto bond0
iface bond0 inet static
post-up /sbin/ifenslave -d bond0 eth0 eth1 ; /sbin/ifenslave bond0 eth0 eth1 || true
pre-down /sbin/ifenslave -d bond0 eth0 eth1 || true
address 1.1.1.1
netmask 255.255.0.0
broadcast 1.1.255.255
gateway 1.1.0.1
slaves eth0 eth1
bond-mode 6
bond-miimon 100
してreboot。
もうこれでもかとごり押し。eth0, eth1については定義しにゃくてよし。これで
/etc/init.d/networking restart
して音信不通ににゃったりはしにゃくにゃるはず。
で複数ホストからDLするとどっちかのNICに負荷が偏ってたりする。これは再度restartすれば治るので、もう起動後しばらくして一度restartさせるようにしちゃう。
crontabで
* * * * * root test -f /tmp/bonding_init.cron || ( sleep 60 ; /etc/init.d/networking restart ; touch /tmp/bonding_init.cron )
とかしとけばにゃんとかにゃるだろうたぶん。負荷分散されてるはずがされてにゃいとか一番困るだろうし。
と、これで複数ホストからdownloadすると2つのNICに負荷分散されるのが分かる。