オルタナティブ・ブログ > プログラマー社長のブログ >

プログラミングでメシが食えるか!?

ネットワークポートの冗長化

»

今回は技術ネタです。

あるシステムを開発していて、ネットワークポートの冗長化の実験をしてみましたので、様子を紹介しましょう。

今どきのホストには1つ以上のネットワークポートがついていると思います(有線LANポートがないものもありますが)。サーバ機ですと2個以上ついていることも多く、そのような場合、片方だけ使うと、せっかくあるもう一つのポートがもったいない感じですよね。

素人考えでも、「せっかく2個ついているなら、2個ともつないでしまおう」→「2個になれば片方壊れても大丈夫」「性能も2倍になる?」と考えますね。

実際にはつなぐだけではうまくいかないのですが、リンクアグリゲーションまたはポートトランキングなどと呼ばれる技術で実現できます。

Linuxの場合、ボンディングと呼ばれる技術で、複数のネットワークインターフェースを束ねることが簡単にできます。

RHEL系ですと、
/etc/sysconfig/network-scripts/ifcfg-bond0

DEVICE=bond0
BOOTPROTO=static
ONBOOT=yes
BONDING_OPTS="mode=balance-rr miimon=100"

/etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
BOOTPROTO=none
MASTER=bond0
SLAVE=yes

/etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
BOOTPROTO=none
MASTER=bond0
SLAVE=yes

という感じに記述してネットワークをリスタートすると、eth0とeth1が束ねられ、bond0というデバイスとして使用することができるようになります。上記のifcfg-bond0ではdhcpや固定IPを指定していませんが、bond0にIPアドレスを指定すればeth0,eth1を通じて普通にIP通信ができます。

mode=と書かれたところで、実は7種類のモードが指定できます。ここでは「balance-rr:ラウンドロビンでのバランシング」を指定していますが、全部で7種類あります。

0: balance-rr
耐障害性と負荷バランシングに対するラウンド ロビン ポリシーを設定します。ボンディングされたスレーブインターフェイスは使用できるものから順に、送受信を順次行ないます。

1: active-backup
耐障害性に対するアクティブ バックアップ ポリシーを設定します。最初に使用できるボンディングされたスレーブインターフェイスによって送受信が行なわれます。ボンディングされた他のスレーブインターフェイスはアクティブなスレーブインターフェイスが失敗した場合のみ使用されます。

2: balance-xor
耐障害性と負荷バランシングに対する XOR (exclusive-or)ポリシーを設定します。この方法では、インターフェイスによって1スレーブ NIC の MACアドレスと受信要求の MACアドレスが適合されます。このリンクが確立されると、最初に使用できるインターフェイスから送信を順次行ないます。

3: broadcast
対障害性用のブロードキャストポリシーを設定します。全ての送信は、全てのスレーブインターフェイスで送られます。

4: 802.3ad
IEEE 802.3ad ダイナミックリンク集合ポリシーを設定します。同じスピードとデュープレックス設定を共有する集合グループを作成します。アクティブな集合体内の全てのスレーブ上で送信と受信をします。そして802.3ad 対応のスイッチを必要とします。

5: balance-tlb
対障害性とロードバランシング用の送信ロードバランシング (TLB)ポリシーを設定します。外部への送信は、各スレーブインターフェイス上の現在のロードに従って配信されます。受信は現在のスレーブにより受け付けられます。もし受信するスレーブに障害があるともう一つのスレーブが問題のスレーブの MAC アドレスを引き取ります。

6: balance-alb
対障害性とロードバランシング用のアクティブロードバランシング (ALB)を設定します。IPV4 通信用の送信および受信ロードバランシングを含んでいます。受信のロードバランシングは ARP ネゴシエーションによって達成されます。

まあ、実際にやってみて、パケットの様子を観察するとよく分かると思います。

さて、開発中のシステムでは、このボンディングを2組使いますので、それだけで4ポート、さらに管理用に1ポート必要と言うことで・・・

Nw1
こんな状態になってしまいました。。一番上はスマートスイッチ、二番目が開発中のプログラムを動作させているホストです。ネットワークポートが4個しかないので、追加でUSB-Ethernetアダプタを使っています(右の白いやつ)。

ボンディングしているものをネットワークにつなぐ際には、基本的にはリンクアグリゲーション対応のスイッチに接続します。普通のHUBにつないでもそれらしく動くことも多いのですが、ループを発生させてしまったり、あるいはブロードキャストがうまく配送されなかったりすることがあります。一番上のスマートスイッチでは、左から2ポートずつ、上段・下段でリンクアグリゲーションを設定していて、さらに3ポートずつVLANで隔離して実験しています。

balance-rrでは、2つのネットワークポートを順番に使う感じに動きますので、スループットが理論値で倍になり、さらに、片方に障害が発生しても通信を継続できるようになります。実際に片方のケーブルを抜いたりしても、数パケットロスすることはありますが、通信は継続できます。なお、balance-rrはパケット単位でラウンドロビンするので、運が悪いとパケット到着順が入れ替わる可能性もあります。他のモードでセッションごとに振り分けたりもできるのですが、IPv6対応できていなかったりで、今のところまだやや微妙な技術ですね。active-backupを指定すると2つ使えても片方だけを使い、障害発生時のみ切り替わる、というシンプルな動きにもできます。

机の上をこんなケーブルだらけの状態にしながら、IPv4,IPv6の動きを確認したりしていますが、こういう仕事は楽しくて好きなのですよねぇ!

Comment(0)