NSX Controller クラスタはスケールアウト型の分散システムで、各コントローラ ノードには、そのノードが実装できるタスクの種類を定義した一連のロールが割り当てられます。高い回復性とパフォーマンスを実現するため、コントローラ仮想マシンは 3 つの異なるホストにデプロイする必要があります。

複数の NSX Controller クラスタ ノードにワークロードを分散するため、シャーディングが使用されます。シャーディングとは、NSX Controllerのワークロードを複数のシャードに分割して、NSX Controllerの各インスタンスの負荷が同等になるようにすることです。

これは、指定したエンティティ(論理スイッチ、論理ルーティング、その他のサービスなど)に対して、特定のコントローラ ノードがどのようにマスターとして動作するかを示しています。あるロールについて、特定の NSX Controller インスタンスがマスターに選ばれると、その NSX Controllerは、論理スイッチと分散論理ルーターを、クラスタ内にある使用可能なすべての NSX Controller インスタンスに振り分けます。

「シャード」に表示されている番号付きのボックスは、マスターがワークロードを分割する際に使用するシャードを表しています。論理スイッチのマスターは、論理スイッチを複数のシャードに分割し、それらのシャードを異なる NSX Controller インスタンスに割り当てます。分散論理ルーターのマスターも、分散論理ルーターを複数のシャードに分割し、それらのシャードを異なる NSX Controller インスタンスに割り当てます。

これらのシャードは、クラスタ内の異なる NSX Controller インスタンスに割り当てられます。どの NSX Controller インスタンスをどのシャードに割り当てるかはロールのマスターが決定します。ある要求がルーターのシャード 3 に届くと、そのシャードは 3 番目の NSX Controller インスタンスに接続するように指示されます。ある要求が論理スイッチのシャード 2 に届くと、その要求は 2 番目の NSX Controller インスタンスによって処理されます。

クラスタ内のいずれかの NSX Controller インスタンスで障害が発生すると、ロールのマスターが、使用可能な残りのクラスタにシャードを再分散します。コントローラ ノードのうちの 1 つは、各ロールのマスターとして選出されます。マスターには、シャードを個々のコントローラ ノードに割り当て、ノードの障害が発生した際に他のノードにシャードを再び割り当てるという責務があります。また、マスターはクラスタ ノードの障害を ESXi ホストに通知します。

各ロールのマスターを選出する際は、クラスタ内にある全ノード(アクティブと非アクティブを含む)の過半数票が必要です。これが、コントローラ クラスタのデプロイで常にノード数を奇数にしなければならない最大の理由です。

ZooKeeper

ZooKeeper は、NSX Controller クラスタのメカニズムを支えるクライアント/サーバ アーキテクチャです。コントローラ クラスタは、Zookeeper を使用して検出および作成されます。クラスタが作成される際、ZooKeeper がすべてのノードを管理します。ZooKeeper ノードは、コントローラ クラスタを形成するための選出プロセスに進みます。クラスタ内には、ZooKeeper マスター ノードが 1 台必要です。これは、ノード間選出によって行われます。

コントローラ ノードが新規作成されると、NSX Manager は、ノード情報(ノード IP アドレスと ID を含む)を現在のクラスタに伝達します。このようにして、各ノードはクラスタリングに使用できる合計ノード数を把握します。ZooKeeper マスターの選出では、各ノードが一票を投じてマスター ノードを選出します。1 つのノードがあるマジョリティ投票するまで、もう一度選択がトリガされます。たとえば、3 ノード設定のクラスタでマスター ノードになるには、2 票以上が必要です。

注: ZooKeeper マスターが選出されないという事態を避けるため、クラスタ内のノードは 3 台にする必要があります。
  • 最初のコントローラのデプロイ時は、このコントローラがマスターになります。そのため、コントローラをデプロイする際は、最初のノードのデプロイが完了してから他のノードを追加します。
  • 2 番目のコントローラを追加した時点では、ノード数が偶数になるため、特殊な状態と言えます。
  • 3 番目のノードを追加すると、クラスタは安定した状態になります。

ZooKeeper で一度に許容できる障害は 1 つのみです。つまり、あるコントローラ ノードが停止したら、他の障害が発生する前にそのノードをリカバリする必要があります。そうしないと、クラスタ破損する可能性があります。

中央制御プレーン (CCP) のドメイン マネージャ

これは、ZooKeeper の上位にあるレイヤーで、ZooKeeper の初期設定をすべてのノードに提供します。ドメイン マネージャは、クラスタ内のすべてのノードの設定を更新した後、ZooKeeper プロセスを開始するリモート プロシージャ コールを呼び出します。

ドメイン マネージャには、すべてのドメインを開始する責務があります。クラスタに参加するため、CCP ドメインは、他のマシン上にある CCP ドメインと通信します。クラスタの初期化をサポートする CCP ドメインのコンポーネントは zk-cluster-bootstrap です。

コントローラと他のコンポーネントとの関係

コントローラ クラスタは、論理スイッチ、分散論理ルーター、VTEP に関する情報を管理し、ESXi ホストに提供します。

論理スイッチが作成されると、クラスタ内のコントローラ ノードは、その論理スイッチのマスターオーナー)となるノードを決定します。これは、分散論理ルーターが追加される際にも当てはまります。

論理スイッチまたは分散論理ルーターに対する所有権が確立すると、ノードはその所有権を、対象のスイッチまたはルーターのトランスポート ゾーンに属する ESXi ホストに送信します。所有権を決定し、所有権情報をホストに伝達する処理全体を「シャーディング」と呼びます。所有権とは、対象の論理スイッチまたは分散論理ルーターについて、ノードが NSX 関連のすべての操作に責任を持つことを意味します。他のノードは、その論理スイッチに対する操作を一切実行しません。

論理スイッチと分散論理ルーターの情報は、1 台の所有者から提供される必要があるため、複数のノードが所有者として選出されてコントローラ クラスタが破損状態になると、ネットワーク内の各ホストは、その論理スイッチまたは分散論理ルーターに関して異なる情報を持つことになる可能性があります。このような事態になると、ネットワーク障害が発生します。ネットワーク制御とデータ プレーンでは、情報は 1 つしか許可されないためです。

あるコントローラ ノードが停止すると、クラスタ内の残りのノードがシャーディングを再実行して、論理スイッチと論理ルーティングの所有権を決定します。