クラスタ状態の公開

選出されたマスターノードは、クラスタ内でクラスタ状態を変更できる唯一のノードです。選出されたマスターノードは、一度に1バッチのクラスタ状態の更新を処理し、必要な変更を計算し、更新されたクラスタ状態をクラスタ内の他のすべてのノードに公開します。各公開は、選出されたマスターが更新されたクラスタ状態をクラスタ内のすべてのノードにブロードキャストすることから始まります。各ノードは確認応答を返しますが、まだ新しく受信した状態を適用しません。選出されたマスターが十分な数のマスター候補ノードから確認応答を収集すると、新しいクラスタ状態はコミットされたと見なされ、マスターはノードに現在コミットされた状態を適用するよう指示する別のメッセージをブロードキャストします。各ノードはこのメッセージを受信し、更新された状態を適用し、その後、マスターに対して2回目の確認応答を送信します。

選出されたマスターは、各クラスタ状態の更新がすべてのノードに完全に公開されるまでの限られた時間を許可します。この時間は、cluster.publish.timeout 設定によって定義され、デフォルトは 30s で、公開が開始された時点から測定されます。この時間が新しいクラスタ状態がコミットされる前に達した場合、クラスタ状態の変更は拒否され、選出されたマスターは自分が失敗したと見なします。マスターは退任し、新しいマスターノードの選出を試み始めます。

新しいクラスタ状態が cluster.publish.timeout が経過する前にコミットされた場合、選出されたマスターノードは変更が成功したと見なします。タイムアウトが経過するまで、またはクラスタ内の各ノードが更新された状態を適用したという確認応答を受け取るまで待機し、その後、次のクラスタ状態の更新を処理して公開し始めます。いくつかの確認応答が受信されていない場合(つまり、一部のノードが現在の更新を適用したことをまだ確認していない場合)、これらのノードは遅延していると見なされ、選出されたマスターの最新の状態に対してクラスタ状態が遅れていることになります。選出されたマスターは、遅延しているノードが追いつくのをさらに cluster.follower_lag.timeout の時間待ちます。デフォルトは 90s です。この時間内にノードがクラスタ状態の更新を正常に適用できなかった場合、そのノードは失敗したと見なされ、選出されたマスターはそれをクラスタから削除します。

クラスタ状態の更新は通常、前のクラスタ状態に対する差分として公開され、クラスタ状態の更新を公開するために必要な時間とネットワーク帯域幅を削減します。たとえば、クラスタ状態のインデックスのサブセットのマッピングを更新する場合、これらのインデックスの更新のみをクラスタ内のノードに公開する必要があります。ノードが前のクラスタ状態を欠いている場合(たとえば、クラスタに再参加する場合)、選出されたマスターはそのノードに完全なクラスタ状態を公開し、将来の更新を差分として受信できるようにします。

Elasticsearchはピアツーピアベースのシステムであり、ノードは直接互いに通信します。高スループットAPI(インデックス、削除、検索)は通常、選出されたマスターノードと相互作用しません。選出されたマスターノードの責任は、ノードがクラスタに参加または離脱する際にシャードを再割り当てすることを含む、グローバルなクラスタ状態を維持することです。クラスタ状態が変更されるたびに、新しい状態は上記のようにクラスタ内のすべてのノードに公開されます。

クラスタ状態の更新のパフォーマンス特性は、各マスター候補ノードのストレージの速度、およびクラスタ内のすべてのノード間のネットワーク接続の信頼性とレイテンシーの関数です。したがって、クラスタ内のノードに利用可能なストレージとネットワーキングが、パフォーマンス目標を満たすのに十分であることを確認する必要があります。