読者です 読者をやめる 読者になる 読者になる

GeekFactory

int128.hatenablog.com

サーバとL2スイッチの接続を冗長化する設計の基本

インフラ サーバ ネットワーク

インフラを設計する上で冗長化による信頼性向上は避けて通れない道です。サーバとL2スイッチの接続を冗長化する設計については意外と情報が少ないのでまとめてみました。変なこと書いてたらご指摘ください。

インフラ設計の基本は単一障害点(SPOF)を取り除くことです。構成要素のうち1つが故障してもサービスを維持できるように設計します。構成要素は以下のものが挙げられます:

  • CPU
  • マザーボード
  • メモリ
  • ローカルディスク
  • 電源
  • FC-HBA
  • NIC
  • LANケーブル
  • L2スイッチ
  • ・・・

ただし、これらすべての故障に備えようとすると費用対効果が割に合わないので、ローカルディスクから下を冗長化する構成が一般的と思います。絶対に止まってはいけないサービスは別ですけどね。

冗長化の種類

サーバを冗長化するにはクラスタを組みます。クラスタはActive-ActiveとActive-Standby(HA)の二種類に分かれます。ワーカーを監視して動いているものにリクエストを投げるという動作が基本です。mod_proxy_balancerとかHeartbeatとかUltra Monkeyが有名ですね。

サーバのHAクラスタは設計や運用のコストが高いデメリットがあります。例えば、NFSクラスタを切り替える場合、共有ディスクの付け替え、仮想IPの付け替え、プロセス起動など複雑な手順が必要になるためトラブルが起きやすく、停止時間も長くなります。NIC障害などはなるべく下位のレイヤで吸収してあげる方が良いです。

ネットワークを冗長化するには経路を複数作ります。使える経路にパケットやフレームを流すという動作が基本です。VLAN trunk、Link Aggregation、VRRP、STP、動的ルーティングを組み合わせて実現します。

サーバとネットワークの接続を冗長化するには下図のような構成が基本です。

この構成では、LANケーブルが1本抜けたりスイッチが壊れたりしてもサービスを継続できるようになっています。例えば、WebサーバのNIC#1が壊れた場合はこんな感じになります。

WebサーバではNIC#2に切り替わりますが、DBサーバはNIC#1のままです。そのため、パケットはSW1とSW2をつなぐ渡り線を通ることになります。

それでは、サーバとネットワークの仕組みを見ていきます。

サーバの構成

サーバでは2枚のNICを協調動作させます。具体的には、NICの接続状況を監視し、生きているNICにフレームを流すようにします。2枚とも生きている場合は優先度の高いものを選びます。これをbondingやteamingといいます。

ここからはLinuxの話。bondingは物理NICに依存しないカーネルドライバなので、どんなNICの組み合わせでも使えます。私の自宅では Intel e1000e と Realtek 8169 をbondingしています。

NICの死活監視は2つの方式を選択できます。1つは miimon で、NICのリンクステータスを監視します。リンクアップしているか監視するだけなので、L2スイッチから先の障害を検知できない問題があります。もう1つは arp_ip_target で、特定IPアドレスARP応答が返ってくるか監視します。経路障害を確実に検知できるメリットがありますが、ネットワークに無駄なトラフィックが発生するデメリットもあります。

# /etc/modprobe.d/bond.conf
alias bond0 bonding
options bond0 mode=1 primary=eth0 miimon=500

L2スイッチの構成

NICから伸びる2本のLANケーブルは別々のL2スイッチに接続します。これはスイッチ自体の障害に備えるためです。2台のスイッチは同一のセグメントに属するようにします。

この構成では2台のスイッチを2本のLANケーブルで接続していますが、実は1本でも構いません。1本の場合は障害時に帯域を確保できなくなる可能性がありますが、ループがなくなるのでごく普通のスイッチングハブを使えるようになります*1

スイッチ間の接続はLink Aggregation(802.3ad)を使います。複数本のLANケーブルを束ねて1本のリンクとして使います。本数の分だけ帯域は大きくなります。


今回は単純化した例を紹介しましたが、実際には上位のL3スイッチやファイアウォール冗長化したり、VLANでサーバを区分けすることになります。

サーバエンジニアとネットワークエンジニアでついつい分業してしまいがちですが、両者の仕組みを理解しておけばトラブルが起きても大丈夫!たぶん!

*1:安物ハブが使えることは果たしてメリットなのか^^;