NLB皆さんこんにちは、Miyaです。Serverの役割の一つである「ネットワーク負荷分散(NLB)」です。Serverのライセンスさえあれば無料で使えることから、簡易なアプリケーションの負荷分散として利用しているお客さんが多い印象です。NLBは構成が簡単でありますが、ある程度の専門知識を必要とするため、ここでは構成するための知識を補うことを目的とし、構成方法は次回の記事で取り上げていきたいと思います。NLBとは?ロードバランサー(LB)はよく耳にお聞きするかと思います。クライアントからのリクエストを配下のノード(サーバー)に分配することで、負荷分散を実現するソリューションです。これらのソリューションを実現する機器は高機能な制御が可能である反面、お値段は決して安くはありません。NLBは、2台以上で構成されたサーバー群(=NLBクラスター)に送信されるIPトラフィック負荷を分散アルゴリズムに従って複数のホストに分散させることが出来ます。NLBはNLBクラスターの障害を検知し、IPトラフィックを自動的に稼働中のノードへ再配分する機能も備えているため、無料かつ簡単にサービスの拡張性と可用性が狙えるサービスです。NLBを構成するにあたって、各オプションによってどのような負荷分散が行われるのかを理解しておく必要があります。不適切な設定だと、上手くセッション維持が出来なくなるので、アプリケーションの特性に適した負荷分散の設定を投入しましょう。NLBを構成して負荷分散する場合、NLBクラスター内の各ノードのIPアドレスに接続するのではなく、NLBクラスターに割り当てられる仮想ネットワークアダプタの仮想IPアドレスを指定して、アプリケーションに接続する方式に切り替わります。NLBクラスターは、クライアントからIPトラフィックを受け取ると、それを受け入れるかどうかを判断、通信を行います。トラフィックの受け入れ先ノードを決定する時、ポート規則とアフィニティと呼ばれるオプションを構成することで、さまざまな分散アルゴリズムを実現することが出来ます。NLBは、NLBクラスター内のノードの障害を検知できると表現しましたが、単純にハートビートで死活監視をしているだけです。NLBクラスターは、下記の流れに従って死活監視を行い、障害を検知すると、NLBクラスターから該当ノードを除外します。これにより、クライアントが障害ノードに接続することを阻止するわけです。障害ノードがNLBクラスターから削除された後に復旧した場合、そのノードは自動的にクラスタに再参加します。Update適用後に再起動した場合、自動的にNLBクラスターから除外され、再起動プロセス完了後、自動的にNLBクラスターに再参加を試むため、管理者による作業を必要としません。便利な機能なように思えますが、所詮はハートビートによる死活監視であるため、アプリケーションの障害を検知することはできません。NLBは継続して障害ノードにIPトラフィックを送信する動作となります。アプリケーションの障害を検知するには、イベントログなどを監視・通報するための別システムが必要になります。Managerがそれに該当します。管理パックを使ったアプリケーションの障害検知は出来ますが、使い勝手の悪さと、ユーザーに優しくない管理コンソールが理由であまり人気がありませんね...。NLBを構成するためには、アプリケーションに適した負荷分散を構成する必要があります。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などのステートフルの通信に適したアフィニティです。ステートフルとは、システムが現在の状態を表すデータなどを保持しており、その内容を処理に反映させる方式。同じ入力に対する出力が常に同じとは限らず、内部の状態次第で変わることがある。初回の接続時に送信元IPアドレスと接続先ノードのマッピングをNLBクラスターが記憶します。後続の通信は、そのIPアドレスからは特定ノードが応答する仕組みです。送信元と宛先ノードのマッピングは送信元IPアドレスであるため、クライアントからプロキシ経由でNLBクラスターにアクセスする経路である場合、全ての通信が一つの特定ノードに収束されます。これは、クライアントのIPアドレスは異なっていても、送信元IPアドレスはプロキシになることから、NLBクラスターからすると全て同じ送信元IPアドレスからの通信となります。結果、単一のノードに負荷が集中するので注意が必要です。ネットワークこのモードでは、クラスCネットワークからのIPトラフィックに対して、一つのノードが応答するアフィニティ設定です。いったケースで使うかというと、ステートフルの通信かつ、クライアントが負荷分散されたプロキシサーバーアレイ経由でアクセスしにきた場合に有用とされています。各プロキシサーバーのIPアドレスは異なるが、同一のクラスCネットワーク上のモノであれば、同一のノードにトラフィックが送信されるため、TCP/IPの通信に不整合が発生することはありません。NLBの通信モードについて学びましょう。クライアント⇔NLBクラスター間の通信には、「ユニキャスト」と「マルチキャスト」の二つの通信モードがあります。既存のスイッチ/ルーターの環境によりますので、ネットワーク管理者と相談しながら、どちらの通信モードが適切であるかを検討しましょう。ユニキャストモードとは?ユニキャストモードでは、ユニキャスト型MACアドレスがNLBクラスターの仮想アダプターに割り当てられ、各ノードはそのユニキャスト型MACアドレスを共有します。以降の[AC-10-01-98]は仮想IPアドレス172.16.1.152を16進数化したもの少し話が逸れて、L2スイッチでは物理ポートとその先に接続されている機器のMACアドレスの対応関係をまとめたMACアドレステーブルを使って通信の効率化を図ります。L2スイッチなどの通信機器では、通信機器のポートと、そのポートに接続される相手の通信機器のMACアドレスのマッピング情報を「MACアドレステーブル」に保存している。WikipediaEthernetフレームがL2スイッチを通過する時、L2スイッチはEthernetフレームのヘッダ部分を参照して、送信元MACアドレスと接続ポートをMACアドレステーブルに学習していきます。L2スイッチへの通信の宛先MACアドレスがMACアドレステーブルを参照しても見つからない場合、全てのポートに対してEthernetフレームを送信する「フラッディング」が発生させます。スイッチングハブにおいて、すべての接続したノード(ポート)へパケットが転送されること。ブロードキャストフレームのほか、フォワードデータベースに記述のないフレームなどがフラッディングされる。weblioユニキャストモードでは、クライアント⇔NLBクラスター間の通信における全ての通信で、あえてフラッディングを発生させます。ステートフルな通信のため、適切なサーバーが応答できるよう都度フラッディングを発生させているわけです。ここで一つの疑問が浮かび上がります。「NLBクラスターの仮想MACアドレスがMACアドレステーブルに登録されたら二回目以降の通信でフラッディング発生されないじゃん」、と。そこで、フラッディングを発生させるために本来の仮想MACアドレスである「02-bf-AC-10-01-98」を登録させないよう、各ノードはダミーの送信元MACアドレスをEthernetフレームに乗せて通信します。これにより、「02-bf-AC-10-01-98」はMACアドレステーブルに登録されていないことから、後続の通信もフラッディングが発生する仕組みです。通信の都度フラッディングが発生することから、NLBクラスター以外のホストにも通信が発生するるため、ネットワークパフォーマンス低下が懸念されますが、NW機器の設定を変更する必要なく手軽に構成出来るのが特徴です。メリット:NW機器の設定変更なしで構成が可能デメリット:フラッディング発生によるネットワークパフォーマンス低下マルチキャストモードとは?マルチキャストモードでは、仮想のマルチキャスト型MACアドレスを全てのノードで共有しつつ、各ノードに元々割り当てられているMACアドレスを維持します。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)であるため、要求と応答に矛盾が発生します。一部のL3スイッチではこのような矛盾を許容しないことがあり、その場合はARPテーブルに静的エントリを追加してあげる必要があります。03-bf-AC-10-01-98静的エントリにおいても設定を許容しないルーターの場合は、残念ながらユニキャストモードを選択いただく必要があります。静的エントリを追加しても宛先MACアドレスがマルチキャスト型であるため、NWパフォーマンス低下はユニキャストと変わらず発生する状況です。そこで、L2スイッチのMACアドレステーブルに、マルチキャスト型MACアドレスとPortsのマッピングを静的に登録してあげることで、L2スイッチから送信されるEthernetフレームの範囲をNLBクラスターに限定することが出来ます。これもL2スイッチの仕様によっては対応不可の場合があります。2016を使って負荷分散を構成していきたいと思います。2019.02.11皆さんこんにちは、Miyaです。ProPlusをIISで更新管理する方法についてご紹介したいと思います。Business(WhfB)のご紹介と、実際に構成した際のメモ書きになります。NLBの概要部分や各設定値についてご紹介しました。ユニキャスト/マルチキャストについては、前回の記事をご参照ください。コメントをキャンセルメールアドレスが公開されることはありません。date*日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)プロフィールこんにちは、Miya(@miya_microsoft)です。高校~大学では情報科学部としてプログラミングを学び、SEとして某Sierに入社しました。Microsoftプロダクトをメインに設計から構築までを担当しております。本ブログは筆者の業務範囲の中で得た学びをより深めることと、その情報が皆さまのお役に立てればという思いから設立しました。キャンセル投稿を送信できませんでした。メールアドレスを確認してください。メール送信チェックに失敗しました。このブログではメールでの投稿共有はできません。