Windows NLBの構成

皆さんこんにちは、Miyaです。

本記事で取り上げるのはWindows Serverの役割の一つである「ネットワーク負荷分散(NLB)」です。

高性能なハードウェアLBと比較すると性能は劣るものの、Windows Serverのライセンスさえあれば無料で使えることから、簡易なアプリケーションの負荷分散として利用しているお客さんが多い印象です。

NLBは構成が簡単でありますが、ある程度の専門知識を必要とするため、ここでは構成するための知識を補うことを目的とし、構成方法は次回の記事で取り上げていきたいと思います。

スポンサーリンク:

Windows NLBとは?

ロードバランサー(LB)はよく耳にお聞きするかと思います。クライアントからのリクエストを配下のノード(サーバー)に分配することで、負荷分散を実現するソリューションです。

これらのソリューションを実現する機器は高機能な制御が可能である反面、お値段は決して安くはありません。

「ただの社内WEBサーバーだし、もっと安く出来ないの?」などの要望に応えるのが、Windows NLBです。

NLBは、2台以上で構成されたサーバー群(=NLBクラスター)に送信されるIPトラフィック負荷を分散アルゴリズムに従って複数のホストに分散させることが出来ます。

Windows NLB

また、NLBはNLBクラスターの障害を検知し、IPトラフィックを自動的に稼働中のノードへ再配分する機能も備えているため、無料かつ簡単にサービスの拡張性と可用性が狙えるサービスです。

Windows NLBの仕組み

Windows NLBを構成するにあたって、各オプションによってどのような負荷分散が行われるのかを理解しておく必要があります。

不適切な設定だと、上手くセッション維持が出来なくなるので、アプリケーションの特性に適した負荷分散の設定を投入しましょう。

負荷分散の仕組み

Windows NLBを構成して負荷分散する場合、NLBクラスター内の各ノードのIPアドレスに接続するのではなく、NLBクラスターに割り当てられる仮想ネットワークアダプタの仮想IPアドレスを指定して、アプリケーションに接続する方式に切り替わります。

Windows NLB

NLBクラスターは、クライアントからIPトラフィックを受け取ると、それを受け入れるかどうかを判断、通信を行います。

Windows NLB

トラフィックの受け入れ先ノードを決定する時、ポート規則アフィニティと呼ばれるオプションを構成することで、さまざまな分散アルゴリズムを実現することが出来ます。

ノードの障害/回復の仕組み

Windows NLBは、NLBクラスター内のノードの障害を検知できると表現しましたが、単純にハートビートで死活監視をしているだけです。

NLBクラスターは、下記の流れに従って死活監視を行い、障害を検知すると、NLBクラスターから該当ノードを除外します。これにより、クライアントが障害ノードに接続することを阻止するわけです。

Windows NLB

障害ノードがNLBクラスターから削除された後に復旧した場合、そのノードは自動的にクラスタに再参加します。例えば、Windows Update適用後に再起動した場合、自動的にNLBクラスターから除外され、再起動プロセス完了後、自動的にNLBクラスターに再参加を試むため、管理者による作業を必要としません。

便利な機能なように思えますが、所詮はハートビートによる死活監視であるため、アプリケーションの障害を検知することはできません。

そのため、アプリケーション障害が発生してもWindows NLBは継続して障害ノードにIPトラフィックを送信する動作となります。

アプリケーションの障害を検知するには、イベントログなどを監視・通報するための別システムが必要になります。

Microsoft製品であれば、Syste Center Operations Managerがそれに該当します。管理パックを使ったアプリケーションの障害検知は出来ますが、使い勝手の悪さと、ユーザーに優しくない管理コンソールが理由であまり人気がありませんね…。

負荷分散の構成オプション

Windows NLBを構成するためには、アプリケーションに適した負荷分散を構成する必要があります。

Windows NLBでは、クライアントからのIPトラフィックに対して、どのノードが受け入れるのかをポートやプロトコル、セッション維持が必要であるかどうかを見て判断します。

これらの設定はポート規則アフィニティの設定によって制御することが出来ます。

それぞれの設定によって、どのように分散されるのかを理解し、アプリケーションに適した構成を設定を投入することが大切です。

ポート規則とは?

ポート規則とは、クライアントからNLBクラスターへの宛先ポート番号ごとに分散アルゴリズムを構成する機能です。

ポート規則の中には、「複数ホスト」「単一ホスト」の2つのフィルターモードがあるので、シナリオに適したフィルターモードを選択しましょう。

複数ホスト

NLBクラスター内の全てのノードに割り当てられている重みに従って、応答するノードを決定します。

各ノードの重みは、ホストのパフォーマンスや使用率にもとづき自動的に計算される仕組みです。

複数ホストの場合、さらにアフィニティと呼ばれる分散方法を決定するオプションを構成することできます。そちらは後ほど解説します。

単一ホスト

NLBクラスターは、各ノードの中でも最も優先度が高いノードにIPトラフィックを送信する設定です。

最も優先度の高いノードに障害が発生した場合は、次の優先度が高いノードに切り替え、IPトラフィックを送信します。

「複数ホスト」のように、全てのノードに対してIPトラフィックを分散する方法ではなく、単一のノードに送信する設定であるため、可用性は確保できるものの拡張性は確保できません。

アフィニティとは?

アフィニティとは、特定のクライアントからNLBクラスターへの要求をどのように分散させるかを決定するためのオプション構成です。「ポート規則」でフィルターモードを「複数ホスト」に設定している場合に構成可能な項目です。

アフィニティなし

このモードでは、クライアントがNLBクラスター内のすべてのノードにリクエストしても、必ず同じ結果が返ってくるステートレスに適したアフィニティです。

ステートレスとは、システムが現在の状態を表すデータなどを保持せず、入力の内容によってのみ出力が決定される方式。 同じ入力に対する出力は常に同じになる。 これに対し、システム内部に状態を表すデータなどを保持しておき、処理内容に反映させるような方式をステートフル(stateful)という。

ステートレスとは – IT用語辞典

HTTP通信など単純な通信がステートレスに該当します。逆にセッションを保持する必要のあるHTTPSや、認証を必要とするアプリケーションはステートフルと呼ばれ、セッションを維持する必要があるので、本設定には不適切であると言えます。

例えば、WEBサーバーをNLBクラスターとして構成した場合、初回アクセスのhttps://miya1beginner.com/はHOST1だったが、ページ移動先がhttps://miya1beginner.com/nextpageはHOST2であった。この時、HOST1で保持しているセッション情報や、クライアントのCookieが使えなかったりとTCPの通信に不整合が発生してきます。

単一

このモードでは、アフィニティなしとは反対に、HTTPSなどのステートフルの通信に適したアフィニティです。

ステートフルとは、システムが現在の状態を表すデータなどを保持しており、その内容を処理に反映させる方式。 同じ入力に対する出力が常に同じとは限らず、内部の状態次第で変わることがある。 例えば、対話型のシステムで直前のやり取りの内容を覚えておき、最終的な処理結果にその内容が反映されるような方式をステートフルであるという

ステートフルとは – IT用語辞典

初回の接続時に送信元IPアドレスと接続先ノードのマッピングをNLBクラスターが記憶します。後続の通信は、そのIPアドレスからは特定ノードが応答する仕組みです。

送信元と宛先ノードのマッピングは送信元IPアドレスであるため、クライアントからプロキシ経由でNLBクラスターにアクセスする経路である場合、全ての通信が一つの特定ノードに収束されます。

これは、クライアントのIPアドレスは異なっていても、送信元IPアドレスはプロキシになることから、NLBクラスターからすると全て同じ送信元IPアドレスからの通信となります。結果、単一のノードに負荷が集中するので注意が必要です。

Windows NLB

ネットワーク

このモードでは、クラスCネットワークからのIPトラフィックに対して、一つのノードが応答するアフィニティ設定です。

どういったケースで使うかというと、ステートフルの通信かつ、クライアントが負荷分散されたプロキシサーバーアレイ経由でアクセスしにきた場合に有用とされています。

各プロキシサーバーのIPアドレスは異なるが、同一のクラスCネットワーク上のモノであれば、同一のノードにトラフィックが送信されるため、TCP/IPの通信に不整合が発生することはありません。

Windows NLBの通信モード

次に、Windows NLBの通信モードについて学びましょう。クライアント⇔NLBクラスター間の通信には、「ユニキャスト」「マルチキャスト」の二つの通信モードがあります。

既存のスイッチ/ルーターの環境によりますので、ネットワーク管理者と相談しながら、どちらの通信モードが適切であるかを検討しましょう。

ユニキャストモードとは?

ユニキャストモードでは、ユニキャスト型MACアドレスがNLBクラスターの仮想アダプターに割り当てられ、各ノードはそのユニキャスト型MACアドレスを共有します。

NLBクラスターの仮想IPアドレス:172.16.1.152
NLBクラスターのユニキャスト型MACアドレス:02-bf-[AC-10-01-98]
先頭の[02-bf-]はユニキャストモード固有の値
以降の[AC-10-01-98]は仮想IPアドレス172.16.1.152を16進数化したもの

少し話が逸れて、L2スイッチでは物理ポートとその先に接続されている機器のMACアドレスの対応関係をまとめたMACアドレステーブルを使って通信の効率化を図ります。

L2スイッチなどの通信機器では、通信機器のポートと、そのポートに接続される相手の通信機器のMACアドレスのマッピング情報を「MACアドレステーブル」に保存している。

MACアドレステーブル – Wikipedia

EthernetフレームがL2スイッチを通過する時、L2スイッチはEthernetフレームのヘッダ部分を参照して、送信元MACアドレスと接続ポートをMACアドレステーブルに学習していきます。

Windows NLB

L2スイッチへの通信の宛先MACアドレスがMACアドレステーブルを参照しても見つからない場合、全てのポートに対してEthernetフレームを送信する「フラッディング」が発生させます。

スイッチングハブにおいて、すべての接続したノード(ポート)へパケットが転送されること。ブロードキャストフレームのほか、フォワードデータベースに記述のないフレームなどがフラッディングされる。

フラッディング – weblio

Windows NLB

ユニキャストモードでは、クライアント⇔NLBクラスター間の通信における全ての通信で、あえてフラッディングを発生させます。

ステートフルな通信のため、適切なサーバーが応答できるよう都度フラッディングを発生させているわけです。

しかし、ここで一つの疑問が浮かび上がります。「NLBクラスターの仮想MACアドレスがMACアドレステーブルに登録されたら二回目以降の通信でフラッディング発生されないじゃん」、と。

そこで、フラッディングを発生させるために本来の仮想MACアドレスである「02-bf-AC-10-01-98」を登録させないよう、各ノードはダミーの送信元MACアドレスをEthernetフレームに乗せて通信します。

Windows NLB

これにより、「02-bf-AC-10-01-98」はMACアドレステーブルに登録されていないことから、後続の通信もフラッディングが発生する仕組みです。

通信の都度フラッディングが発生することから、NLBクラスター以外のホストにも通信が発生するるため、ネットワークパフォーマンス低下が懸念されますが、NW機器の設定を変更する必要なく手軽に構成出来るのが特徴です。

メリット:NW機器の設定変更なしで構成が可能

デメリット:フラッディング発生によるネットワークパフォーマンス低下

マルチキャストモードとは?

マルチキャストモードでは、仮想のマルチキャスト型MACアドレスを全てのノードで共有しつつ、各ノードに元々割り当てられているMACアドレスを維持します。

NLBクラスターの仮想IPアドレス:172.16.1.152
NLBクラスターのマルチキャスト型MACアドレス:03-bf-[AC-10-01-98]
先頭の[03-bf-]はマルチキャストモード固有の値
以降の[AC-10-01-98]は仮想IPアドレス172.16.1.152を16進数化したもの

マルチキャストモードではI/G bitが1のマルチキャスト型MACアドレス宛への通信になるため、L2スイッチから全てのポートに接続されている機器にEthernetフレームを送信します。

一見すると、ユニキャストモードのフラッディングと一緒の挙動をしているように思えますが、宛先MACアドレスがマルチキャスト型であることがポイントです。

先頭オクテットのビット0x02がグローバルアドレスとローカルアドレスを識別するビットで、GLビットと呼ばれる。OFFであればグローバルアドレス、ONであればローカルアドレスであることを示している。また、先頭オクテットのビット0x01がユニキャストとマルチキャストを識別するビットで、IGビットと呼ばれる。

マルチキャストモードを構成するにあたって重要なのがNW機器の設定です。

クライアントからパケットを受け取ったL3スイッチは、ユニキャストIPアドレス(NLBクラスターの仮想IP)のARPに対して返ってくるアドレスがマルチキャストMACアドレス(03-bf-AC-10-01-98)であるため、要求と応答に矛盾が発生します。

Windows NLB

一部のL3スイッチではこのような矛盾を許容しないことがあり、その場合はARPテーブルに静的エントリを追加してあげる必要があります。

IPアドレス MACアドレス
172.16.1.152 03-bf-AC-10-01-98

静的エントリにおいても設定を許容しないルーターの場合は、残念ながらユニキャストモードを選択いただく必要があります。

さて、静的エントリを追加しても宛先MACアドレスがマルチキャスト型であるため、NWパフォーマンス低下はユニキャストと変わらず発生する状況です。

そこで、L2スイッチのMACアドレステーブルに、マルチキャスト型MACアドレスとPortsのマッピングを静的に登録してあげることで、L2スイッチから送信されるEthernetフレームの範囲をNLBクラスターに限定することが出来ます。これもL2スイッチの仕様によっては対応不可の場合があります。

メリット:スイッチ側のフィルタリングによって通信を最適化できる

デメリット:スイッチ/ルータに静的な設定が必要、IP/MACアドレスが変更されるとネットワーク機器側のメンテナンスが必要になる

おわりに

いかがでしたでしょうか?Windows NLBの構成パターンについて何となくイメージ掴めましたでしょうか?

本記事では、Windows NLBの構成するにあたっての前提知識のご紹介ですが、次回は実際にWindows Server 2016を使って負荷分散を構成していきたいと思います。

それでは、よいWindows Server ライフをっ♪

スポンサーリンク