本日はいまだにお問合せを多くいただくサーバーのインタフェース冗長化に関する設定をご紹介致します。
 早速ですが皆様はLinuxのBondingのモード設定を理解して正しく運用できていますでしょうか。多くの皆様は正しく設定されていると思いますが、WEBに載っていたのでそのまま使ってみたら動いたので使っているという方も一部いらっしゃるのではないかと思います。

Linux bondingを使うときにネットワークの観点からは、注意していただきたい設定があります。

 タイトルにも記載したLinux Bonding mode=0を使うときはネットワーク構成を意識して注意して使ってください

 どうなっているかわからないときはLinux Bonding mode=0は使わないことを推奨致します

Linux Bondingの説明

参考Link: RHEL6導入ガイド 25.7.2. チャネルボンディングの使用

https://access.redhat.com/site/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/sec-Using_Channel_Bonding.html

Mode No. Mode Name description
0 balance-rr 耐障害性とロードバランシングのためラウンドロビンポリシーを設定します。利用可能な第 1 のインターフェースからそれぞれのボンディングされたスレーブインターフェースで送受信が順次行われます。
1 active-backup 耐障害性のためアクティブなバックアップポリシーを設定します。利用可能な第 1 のボンディングされたスレーブインターフェースにより送受信が行われます。別のボンディングされたスレーブインターフェースは、アクティブなボンディングされたスレーブインターフェースが失敗した場合にのみ使用されます。
2 balance-xor 耐障害性とロードバランシングのため XOR (排他的論理和) ポリシーを設定します。この方法を使用すると、インターフェースによって受信要求の MAC アドレスとスレーブ NIC の 1 つの MAC アドレスが一致します。このリンクが確立すると、利用可能な第 1 のインターフェースから送信が順次行われます。
3 broadcast 耐障害性のためブロードキャストポリシーを設定します。すべての送信は、すべてのスレーブインターフェースで行われます。
4 802.3ad  IEEE 802.3ad 動的リンクアグリゲーションのポリシーを設定します。同一の速度とデュプレックス設定を共有するアグリゲーショングループを作成します。アクティブなアグリゲーターのすべてのスレーブで送受信を行います。802.3ad に対応するスイッチが必要です。
5 balance-tlb 耐障害性とロードバランシングのため送信ロードバランシング (TLB) ポリシーを設定します。発信トラフィックは、各スレーブインターフェースの現在の負荷に従って分散されます。受信トラフィックは、現在のスレーブにより受信されます。受信しているスレーブが失敗すると、別のスレーブが失敗したスレーブの MAC アドレスを引き継ぎます。
6 balance-alb 耐障害性とロードバランシングのためアクティブロードバランシング (ALB) ポリシーを設定します。IPV4 トラフィック用の送受信ロードバランシングが含まれます。ARP ネゴシエーションにより、受信ロードバランシングが可能です。

 この中でイーサネットスイッチの世界で一般的に使われているのはmode=1, mode=2, mode=4だけです。

 その他の設定は特殊環境での利用となりますので利用時には注意が必要です。
ボンディングの設定方法を紹介しているWebサイトも数多くあり、特に最近のネットワーク機能との相性が良くない設定がmode=0:balance-rrです。
図1のように上位のスイッチが2台以上でスタッキングやマルチシャーシLAGを組んでいる場合には特にmode=0ではなくmode=2をご利用下さい。

図1: mode=0を使ってはいけないネットワーク構成

 ここでmode=0を使ってラウンドロビンでパケットを送信してしまうと、ネットワーク内ではどこをとおっているかわからなくなります。一見、効率良さそうに見えますがTCP/IPの世界で順番が入れ替わってしまうと、通信をやり直す必要があります。そのためイーサネットスイッチでは基本的にフローベースの通信を行うことで順番が入れ替わることを防ぎながら、宛先に到達できるようにしています。そのフローベースの通信をさせる設定というのがmode=2: balance-xorであり、スイッチ側の設定はStatic LAGと呼ばれる設定になります。

 またIEEE802.3adを使ったDynamic LAGでの構成もケーブリングミスを防ぐためには有効です。サーバー側ではmode=4: 802.3adを利用し、スイッチ側でもIEEE802.3adの設定を行います。IEEE802.3adでは双方向でLACPと呼ばれるパケットを交換して正しい接続先のときだけリンクを上げるような仕組みになっております。ケーブリングミスがあるときはリンクが使えないので、ケーブリングミスによるL2ループを回避することが可能となります。このときの注意点としてはLACPDUの送信タイマーのデフォルト値です。Linuxではlacp_rateという設定があり、デフォルトは0: slow(30秒)となっています。お使いのスイッチに依存しますが一部メーカーを除いて1: fast(1秒)がデフォルト値になっている場合が多いのでお使いのスイッチに合わせて変更してください。

 デルのスイッチ製品は "fast" がデフォルト設定となります。

 そして注意事項がもう一つ。

 Linux bondingドライバの802.3adの動作としては、LACPのネゴシエーションに失敗してもBondingインタフェースをリンクアップするようです。スイッチ側がStatic LAGで構成されているときに、スイッチから見ると両方のインタフェースがUPしているように勘違いしてしまいます。スイッチは複数リンクにパケットを送信しますが、サーバー側は片方のインタフェースでDROPしますので、約半分のパケットが到達不能となります。サーバー側とスイッチ側の設定が間違っているのが根本的な原因ですが、動作としておかしな状況になりますので注意してください。

 以上です。

 今回はLinux Bondingとスイッチ側のリンクアグリゲーションをするときの注意事項についてご紹介しました。

 設定を覚えていないという方はこれを機に一度設定を確認してみてはいかがでしょうか。