2012年11月27日火曜日

Windows Server 2012のNICチーミング

今回も、保留していたお客様からの質問に対する回答です。

Windows Server 2012には、OSネイティブのNICチーミング機能が含まれます。これは、複数のNIC(同一速度のイーサネットに限られます)をまとめた仮想的なNICを作ることで、可用性と性能を向上させる機能です。

NICチーミングには、スイッチングハブ(スイッチ)の構成を必要とする「スイッチ依存モード」と、スイッチングハブの設定が不要な「スイッチ非依存モード」があります。スイッチ非依存モードは、同じスイッチでも別々のスイッチでも構成できます。

スイッチには、MACアドレステーブルが構成されますが、複数のポートに同じMACアドレスがあることは想定されていません。「スイッチ依存モード」はこの問題を解決するために、IEEE 802標準の規約を利用します。

一方のスイッチ非依存モードは、スイッチ側の設定が一切不要です。これは、以下の原理で動作しているためです。

まず、インバウンドデータ(チーミングNICへの着信)は、チーミングNIC構成時に自動的に選択された「プライマリNIC」のみが処理します。チーミングNICのMACアドレスはプライマリNICのMACアドレスになります。ARP要求に対する応答は単一NICのみが応答するため、スイッチは混乱しません。負荷分散モードでもプライマリNICは1枚に限定されます。

2枚のNICを使ったアクティブ・スタンバイ構成の場合、常にプライマリNICのMACアドレスが使われます。アクティブなNICのリンクがダウンした場合は、プライマリNICのMACアドレスがスタンバイ側で使われるため、チーミングNICのMACアドレスは(およびもちろんIPアドレスも)変化しません。同時には1枚のNICしか使わないので、アウトバウンド(チーミングNICからの発信)でも不都合は生じません。

負荷分散をしている場合のアウトバウンド接続(発信)は、指定のアルゴリズムによって負荷分散されます。この時、イーサネットフレームにはNICハードウェア固有のMACアドレスが使われ、スイッチのMACアドレステーブルにはこれが登録されます。単一IPアドレスに複数MACアドレスが対応してしまいますが、これで問題は起きないようです(理由は後述)。

NIC-Team

図は、スイッチ非依存モード、アドレスによるハッシュでチーミングNICを構成し、負荷分散した状態で、ネットワークデータをキャプチャしたものです。送信元MACアドレスが2つあるので、赤と青で色分けしました。接続ごとに負荷分散されていることが分かります。

L2スイッチ内部では、MACアドレスとポートが紐付きますが、IPアドレスとは無関係です。ARPに対する応答はプライマリNICのみが行うため、IPアドレスとMACアドレスの対応も問題ありません。既存のARPテーブルと矛盾を起こす可能性はありますが、IPアドレスとMACアドレスの対応は、もともと変化する可能性があるものなので(たとえばフェールオーバークラスター)、こちらも問題にはならないはずです。

以上のことから分かるように、スイッチ非依存モードでは着信の負荷分散ができません。そのため、効果的に利用できるのは以下の場合に限られます。

  • アクティブ/スタンバイモード…2枚のNICのうち、一方のみを使い、障害発生時に自動切り替え
  • サーバーからの発信データが多い場合(たとえばWebサーバー)

以上です。見落としている条件があるかもしれませんので、お気づきの点があればブログにコメントをいただくか、メールアドレスをご存じの方はメールでお問い合わせください。

回答が遅くなって申し訳ありませんでした。

【参考】 http://www.aidanfinn.com/?p=12924 (英語)

2012年11月18日日曜日

Windows Server 2012 Hyper-VとNICチーミング

どうしても分からなかったので、ogawadさんに助けを求めました。

Windows Server 2012は、OSレベルでNICチーミングがサポートされます。チーミングされたNICは、1つのNICに見えるので、それをHyper-Vの外部仮想スイッチ(仮想ネットワーク)として割り当てることができます。

また、Hyper-V仮想マシンに割り当てた仮想NIC同士でもチーミングが可能です。つまり、複数の物理NICそれぞれに仮想スイッチを割り当てて、仮想マシン内でチーミングを行なうこともできます。

MSC0374G-T1-01-2

この時、仮想マシンでチーミングすると、仮想スイッチを通っているためVMで物理NICのリンクダウンが検出できないのではないか、というご質問をいただき、即答できないでいました。

結論を言うと、後者の場合でもリンクダウンを検出できます。

NIC-TEAM-2

SR-IOVの有無とか、いろいろ考えてる前に試してみればすぐ分かることでした。お恥ずかしい限りです。

Hyper-V仮想マシンの設定に「NICチーミングを許可」する設定があります。これがオンになっていると、物理NICの状態を伝えてくれるようです。

逆に、SR-IOV を利用する場合、自身にスイッチ相当の機構が埋め込まれるので、利用するNICによっては、ホストOSにすらリンクダウンが通知されないものがあるそうです。

SR-IOVの方がハードウェア情報を伝えやすいと思っていたのですが、そうでもないようです。

SR-IOVについてはogawadさんのブログの「Windows Server 2012 Hyper-V の SR-IOV 構築手順 (3)」に詳しいので、そちらを参照してください。コメント欄には私の質問も載っていて、ちょっと格好悪いのですが、分からなかったものは仕方ありません。

ところがここでもうひとつの疑問が生まれます。物理NICのリンクがダウンしていても、仮想スイッチは生きているので、仮想マシン同士は通信できるはずです。しかし、チーミングドライバが物理NICのリンクダウンを伝えると、通信ができなくなってしまいます。

今度調べようと思っていたら、これまたogawadさんが調べてくれました。

ゲストチーミングしていない場合は、アップリンクとなる物理NICがダウンしても同一の仮想スイッチにつながっていれば引き続き通信できます(従来通りの動作です)。

c

ゲストチーミングしている場合は、アップリンクとなる物理NICがダウン(全滅)すると)、同一の仮想スイッチにつながっていても通信できないということです。これは、ゲストOSからリンクダウン状態として認識されるためのようです。

ogawadさん、いろいろどうもありがとうございました。