LANにおいて、耐障害性を高めつつ通信速度を高速化するためによく利用される技術がリンクアグリゲーションだ。スイッチの選定時にリンクアグリゲーション用にポートを確保しておけば、耐障害性の向上と高速化を実現できる一石二鳥の技術といえる。本稿では、リンクアグリゲーションの仕組みを解説しつつ、NETGEARのスイッチでの動作検証を行ってみよう。

LANの高速化

LANの通信を高速にするためにまっ先に思いつくことは、高速なリンクにアップグレードすることだ。たとえば、現在ギガビットイーサネットのリンクを利用しているのであれば、10ギガビットイーサネットのリンクにアップグレードする。

10ギガビットイーサネットに対応しているスイッチ製品の価格もずいぶんと安くなってきたので10ギガビットイーサネットへアップグレードすることはとても効果的な選択肢だ。ただ、リンクが1つだけでは冗長性を確保することができない。

もし、スイッチに利用していないポートがあれば、複数のリンクでスイッチ間を接続して負荷分散することで通信の高速化を期待できる。ただし、単純にスイッチ間を複数のリンクで接続しただけでは、耐障害性を高められるものの結局は1つのリンクだけしか使わずに通信の高速化は期待できない。スパニングツリーによってブロックしなければループが発生してしまうからだ。

リンクアグリゲーションの利用

そこで、リンクアグリゲーションを利用すれば、正常時に複数のリンクで負荷分散させることができる。そして、1本のリンクに障害が発生しても、残りのリンクでイーサネットフレームの転送を継続できる。その際、スパニングツリーの再計算も発生しない。

リンクアグリゲーションの設定を行うと、スイッチ内部に複数の物理ポートをまとめた仮想的なポートを作成すると考えるとわかりやすくなるだろう。スイッチ内部のリンクアグリゲーションによって作られた仮想的なポートと物理的なポートを対応づけることで複数のポートをグループ化する。次の図がリンクアグリゲーションの例だ。

図1 リンクアグリゲーションの例

この図では、2つのスイッチSW1とSW2を2本のギガビットイーサネットのリンク(1Gbps)で接続している。それぞれのスイッチでリンクアグリゲーションの設定を行うことで、仮想的なポートを作成して2つの1Gbpsのポートをグループ化する。これにより、実質的にSW1とSW2は、2Gbpsの1つのリンクで接続されているかのように扱うことができる。

リンクアグリゲーションは、片方のスイッチだけで設定しても意味がない。当然ながら、両方のスイッチで正しく設定しなければいけない。そこで、両方のスイッチで効率よくリンクアグリゲーションの設定を行うためのプロトコルがLACP(Link Aggregation Control Protocol)だ。

LACPは、IEEE802.1adとして標準化されている。LACPによって対向のスイッチ間でネゴシエーションを行うことで、リンクアグリゲーションを正常に機能させることができる。 なお、リンクアグリゲーションによって、いくつのリンクを1つに束ねられるかは利用する機器によって異なる。リンクアグリゲーションの利用を検討する際には、機器の仕様を確認しておくことも重要だ。

リンクアグリゲーションでのイーサネットフレームの転送

リンクアグリゲーションによって複数のリンクを1つにまとめた場合のイーサネットフレームの転送について考えてみよう。注意しなければいけないのは、フレームひとつひとつの転送で利用するリンクを振り分けるのではないということだ。転送するイーサネットフレームのアドレス情報などからハッシュ計算を行い、利用するリンクを振り分ける。そのため、同じアドレス情報のイーサネットフレームは同じリンクを通じて転送されることになる。

イーサネットフレームのアドレス情報をどのように判断するかは、スイッチの設定によって異なる。設定により、送信元MACアドレス、宛先MACアドレスや、ネットワーク層のIPアドレス、さらにはトランスポート層のTCP/UDPポート番号などによって利用するリンクの振り分けを行うことができる。リンクアグリゲーションのリンク上で、どのようなアドレス情報のイーサネットフレームを転送するかを考えて、適切な振り分けが行われるように設定しなければならない。次の図のような、シンプルな例で考えてみよう。

図2 リンクアグリゲーションでのリンクの振り分け その1

この図では、SW1とSW2間を2本のリンクで接続して、リンクアグリゲーションによって2本のリンクを1つにまとめている。SW1とSW2は、リンクアグリゲーションのリンクの振り分けとして、送信元MACアドレスに基づくものとする。SW1にはPC1とPC2が接続され、SW2にはSRV1が接続されている。話を簡単にするために、すべて同一VLANと考えている。

PC1からSRV1へのイーサネットフレームとPC2からSRV1へのイーサネットフレームでは、送信元MACアドレスが異なる。SW1は送信元MACアドレスがPC1のイーサネットフレームはポート1へ転送し、送信元MACアドレスがPC2のイーサネットフレームはポート2へ転送するといったように、複数のリンクを振り分けることができる。PC1/PC2からSRV1あてのイーサネットフレームは、この図のようにうまくリンクの振り分けができる。

そして、通信というものはたいてい双方向だ。PC1やPC2からSRV1に何らかのデータを送信すると、その返事が返ってくる。SRV1からPC1やPC2へのイーサネットフレームの転送を考えると、次の図のようになる。

図3 リンクアグリゲーションでのリンクの振り分け その2

SRV1からPC1またはPC2あてのイーサネットフレームの送信元MACアドレスは当然ながら、SRV1のMACアドレスで共通だ。SW1でのリンクの振り分けを送信元MACアドレスで行っていると、PC1宛てもPC2宛ても結局は同じリンクにイーサネットフレームを転送することになる。1つのリンクだけに集中すると、帯域幅が足りなくなってしまう可能性がある。この場合、SW2では送信先MACアドレスや送信先IPアドレスを基にリンクの振り分けを行うようにすると、うまく負荷分散できる。

先にも述べたが、リンクアグリゲーションのリンク上でどのようなイーサネットフレームを転送するかをしっかりと考えて、適切なリンクの振り分けができるようにすることが重要だ。可能ならば、TCP/UDPポート番号などよりレイヤの高いアドレス情報でリンクを振り分けるようにしたほうがリンクの利用効率がよくなる。アプリケーションが異なれば、TCP/UDPのポート番号も異なる。そのため、同じPCの通信であっても、アプリケーションごとにリンクが振り分けられることが期待できるからだ。

リンクの振り分けのアルゴリズムとして、どのようなアドレス情報を利用できるかも機器によって異なるので、機器の仕様を確認しておくことが重要だ。

NETGEARスイッチのリンクアグリゲーション検証

ここからは、NETGEAR社のスイッチを利用してリンクアグリゲーションの動作を検証する。利用するスイッチは、次の2機種だ。

・GSM7328S
・M5300-28G3

この2台のスイッチ間を2本のリンクで接続する。

図4 リンクアグリゲーションの検証 ネットワーク構成

リンクアグリゲーションの設定前の状態

まず、リンクアグリゲーションを設定する前の状態を確認しておこう。SW1とSW2間を2本のリンクで接続すると、ループ構成となるためスパニングツリーでブロックされるはずだ。どのポートがブロックされているかを確認した。スパニングツリーでブロックされているポートを確認するには、[Switching]→[STP]→[Advanced]→[CST Port Status]を見る。

図5 リンクアグリゲーション設定前のポートの状態

SW1ではすべてのポートが代表ポート(Designated Port)となり、Forwarding状態だ。このことよりSW1がルートブリッジとなっていることがわかる。そして、SW2はポート1がルートポートで、ポート2は代替ポート(Alternate Port)となりDiscarding状態だ。デフォルトでRSTPが有効なのでDiscarding状態という表示となっているが、ポート2がブロックされていることがわかる。つまり、SW1-SW2間を2本のリンクで接続しているものの、実際にはポート1のリンクしか使っていないというわけだ。これは何本リンクを追加しても同じ結果になる。

リンクアグリゲーションの設定

SW1-SW2間の2本のリンクを両方とも使えるようにリンクアグリゲーションを設定する。リンクアグリゲーションの設定は、[Switching]→[LAG]→[LAG Configuration]から行う。今回利用しているGSM7328SおよびM5300-28G3の機種ではあらかじめリンクアグリゲーションの内部の仮想的なポートとして「ch1」~「ch64」が作成されている。ただ、これらに物理的なポートの関連付けが行われていない状態だ。

図6 リンクアグリゲーションの設定画面

今回の検証ではあらかじめ設定されているリンクアグリゲーションの仮想ポート「ch1」に対して物理ポートの割り当てとリンクの振り分けアルゴリズムの設定を行うことにする。[LAG Name]→[ch1]をクリックすると、詳細な設定画面に移る。

SW1、SW2それぞれで物理的なポート1、ポート2を「ch1」に割り当てる。リンク振り分けは送信先/送信元IPアドレスとTCP/UDPポート番号に基づいてハッシュ計算を行うようにする。以下の図が、SW1での設定画面の様子だ。

図7 SW1 リンクアグリゲーションの設定

SW2でも設定する内容はSW1と同じだ。両方のスイッチで設定しなければリンクアグリゲーションは正常に機能しないので注意して欲しい。

リンクアグリゲーションの確認

設定が完了すると、[LAG Configuration]の画面で「ch1」の[Hash Mode]が「Src/Dest IP and TCP/UDP Port fields」で送信元/宛先IPアドレスとTCP/UDPポート番号のハッシュ計算をしてリンクを振り分けている。そして、[Configured Port]にポート1、ポート2が含まれており、ポート1、ポート2が[Active Port]となり[LAG Status]がUPであることがわかる。これによりリンクアグリゲーションが正しく設定されていることを示している。

図8 リンクアグリゲーションの設定後の状態

また、スパニングツリーの状態も確認しておこう。リンクアグリゲーションを設定すると、グループ化された物理的なポートではスパニングツリーは動作しなくなっている。スパニングツリーの計算は、リンクアグリゲーションの仮想的なポートで行われていることがわかる。

図9 リンクアグリゲーション設定後のスパニングツリーの状態

まとめ

スイッチを選定する際にリンクアグリゲーション用にポートを確保しておくことで、耐障害性を高めつつ通信速度の高速化も期待できる。

リンクアグリゲーションを効果的に機能させるためには、リンクの振り分けをどのように行うかが重要だ。検証で利用したNETGEAR社のスイッチでは、TCP/UDPポート番号なども見て効果的にリンクを振り分けられることが可能だ。また、スイッチ間だけではなくサーバとスイッチの接続でも利用できる。LANを構築する際にはリンクアグリゲーションの利用をぜひ検討していただきたい。