クラスターにノードを追加および削除する

Elasticsearchのインスタンスを起動すると、ノードが起動します。Elasticsearchのクラスターは、同じcluster.name属性を持つノードのグループです。ノードがクラスターに参加したり離れたりすると、クラスターは自動的に再編成され、利用可能なノードにデータを均等に分配します。

単一のElasticsearchインスタンスを実行している場合、ノードのクラスターは1つです。すべてのプライマリシャードは単一のノードに存在します。レプリカシャードは割り当てられないため、クラスターの状態は黄色のままです。クラスターは完全に機能していますが、障害が発生した場合にデータ損失のリスクがあります。

ノードが1つと3つのプライマリシャードを持つクラスター

ノードをクラスターに追加して、その容量と信頼性を向上させます。デフォルトでは、ノードはデータノードであり、クラスターを制御するマスターノードに選出される資格があります。また、特定の目的、たとえばインジェストリクエストを処理するために新しいノードを構成することもできます。詳細については、ノードを参照してください。

クラスターにノードを追加すると、自動的にレプリカシャードが割り当てられます。すべてのプライマリシャードとレプリカシャードがアクティブになると、クラスターの状態は緑に変わります。

3つのノードを持つクラスター

既存のクラスターにノードを登録する

ローカルマシンで追加のノードを登録して、複数のノードを持つElasticsearchクラスターの動作を実験できます。

複数のマシンで実行されているクラスターにノードを追加するには、新しいノードがクラスターの残りを発見できるように、discovery.seed_hostsを設定する必要があります。

Elasticsearchが初めて起動すると、セキュリティの自動構成プロセスがHTTPレイヤーを0.0.0.0にバインドしますが、トランスポートレイヤーはlocalhostにのみバインドします。この意図された動作により、追加の構成なしでデフォルトでセキュリティが有効な単一ノードクラスターを起動できます。

新しいノードを登録する前に、localhost以外のアドレスにバインドするなどの追加のアクションや、ブートストラップチェックを満たすことが通常必要です。 その間に、自動生成された登録トークンが期限切れになる可能性があるため、登録トークンは自動的に生成されません。

さらに、追加の構成なしでクラスターに参加できるのは、同じホスト上のノードのみです。別のホストのノードをクラスターに参加させたい場合は、transport.host0.0.0.0の提案された値のコメントを解除するなど)または他のホストが到達できるインターフェースにバインドされたIPアドレスを設定する必要があります。詳細については、トランスポート設定を参照してください。

クラスターに新しいノードを登録するには、クラスター内の既存のノードでelasticsearch-create-enrollment-tokenツールを使用して登録トークンを作成します。次に、--enrollment-tokenパラメータを使用して新しいノードを起動し、既存のクラスターに参加させます。

  • 1. Elasticsearchが実行されている別のターミナルで、Elasticsearchをインストールしたディレクトリに移動し、elasticsearch-create-enrollment-tokenツールを実行して新しいノードのための登録トークンを生成します。
    1. bin\elasticsearch-create-enrollment-token -s node
    登録トークンをコピーし、新しいノードをElasticsearchクラスターに登録するために使用します。
  • 2. 新しいノードのインストールディレクトリから、Elasticsearchを起動し、--enrollment-tokenパラメータで登録トークンを渡します。
    1. bin\elasticsearch --enrollment-token <enrollment-token>
    Elasticsearchは次のディレクトリに証明書とキーを自動的に生成します:
    1. config\certs
  • 3. 登録したい新しいノードについて前の手順を繰り返します。

発見とシャード割り当てに関する詳細は、発見とクラスター形成およびクラスターレベルのシャード割り当てとルーティング設定を参照してください。

マスター選出可能なノード

ノードが追加または削除されると、Elasticsearchはクラスターの投票構成を自動的に更新し、最適な障害耐性レベルを維持します。投票構成は、マスター選出可能なノードのセットであり、新しいマスターを選出したり新しいクラスター状態をコミットしたりする際に、その応答がカウントされます。

クラスター内には小さく固定された数のマスター選出可能なノードを持つことが推奨されており、マスター選出不可能なノードを追加および削除することでクラスターをスケールアップおよびスケールダウンします。ただし、クラスターにマスター選出可能なノードを追加または削除することが望ましい場合もあります。

マスター選出可能なノードを追加する

クラスターにノードを追加したい場合は、新しいノードを既存のクラスターを見つけるように構成し、起動するだけです。Elasticsearchは、適切であれば新しいノードを投票構成に追加します。

マスター選出時や既存の形成されたクラスターに参加する際、ノードはマスターに参加リクエストを送信し、正式にクラスターに追加されます。

マスター選出可能なノードを削除する

マスター選出可能なノードを削除する際は、一度に多くのノードを削除しないことが重要です。たとえば、現在7つのマスター選出可能なノードがあり、これを3つに減らしたい場合、4つのノードを一度に停止することはできません。そうすると、残りのノードは3つだけになり、投票構成の半分未満となり、クラスターはこれ以上のアクションを取ることができなくなります。

より正確には、マスター選出可能なノードの半分以上を同時にシャットダウンすると、クラスターは通常利用できなくなります。この場合、削除したノードを再起動することでクラスターをオンラインに戻すことができます。

クラスターにマスター選出可能なノードが少なくとも3つある限り、一般的なルールとして、ノードを1つずつ削除し、クラスターが自動的に調整して投票構成を新しいノードのセットに適応させるための十分な時間を与えるのが最善です。

マスター選出可能なノードが2つしか残っていない場合、どちらのノードも安全に削除することはできません。なぜなら、両方のノードが信頼性を持って進行するために必要だからです。これらのノードの1つを削除するには、まずElasticsearchにそのノードが投票構成の一部でないことを通知し、投票権を他のノードに与える必要があります。次に、除外されたノードをオフラインにしても、他のノードの進行を妨げることはありません。投票構成除外リストに追加されたノードは通常通り機能しますが、Elasticsearchはそのノードを投票構成から削除しようとしますので、その投票はもはや必要ありません。重要なことに、Elasticsearchは投票除外リストのノードを自動的に投票構成に戻すことはありません。除外されたノードが投票構成から正常に自動再構成された場合、そのノードをシャットダウンしてもクラスターのマスターの可用性に影響を与えません。ノードは、投票構成除外 APIを使用して投票構成除外リストに追加できます。たとえば:

Python

  1. resp = client.cluster.post_voting_config_exclusions(
  2. node_names="node_name",
  3. )
  4. print(resp)
  5. resp1 = client.cluster.post_voting_config_exclusions(
  6. node_names="node_name",
  7. timeout="1m",
  8. )
  9. print(resp1)

Js

  1. const response = await client.cluster.postVotingConfigExclusions({
  2. node_names: "node_name",
  3. });
  4. console.log(response);
  5. const response1 = await client.cluster.postVotingConfigExclusions({
  6. node_names: "node_name",
  7. timeout: "1m",
  8. });
  9. console.log(response1);

コンソール

  1. # 投票構成除外リストにノードを追加し、システムが自動再構成するのを待つ
  2. # ノードを投票構成から自動再構成するまで
  3. # デフォルトのタイムアウト30秒
  4. POST /_cluster/voting_config_exclusions?node_names=node_name
  5. # 投票構成除外リストにノードを追加し、待機する
  6. # 自動再構成まで1分
  7. POST /_cluster/voting_config_exclusions?node_names=node_name&timeout=1m

除外リストに追加すべきノードは、?node_namesクエリパラメータを使用して名前で指定するか、?node_idsクエリパラメータを使用して永続的なノードIDで指定します。投票構成除外APIへの呼び出しが失敗した場合、安全に再試行できます。成功した応答のみが、ノードが実際に投票構成から削除され、再度追加されないことを保証します。選出されたマスターノードが投票構成から除外されている場合、利用可能な場合は、投票構成にまだ残っている他のマスター選出可能なノードに権限を譲ります。

投票構成除外APIは、2ノードから1ノードのクラスターにスケールダウンする際に最も便利ですが、複数のマスター選出可能なノードを同時に削除するためにも使用できます。複数のノードを除外リストに追加すると、システムはこれらのノードを投票構成から自動的に再構成しようとし、クラスターを利用可能に保ちながら安全にシャットダウンできるようにします。上記の例では、7つのマスターノードのクラスターを3つのマスターノードに縮小する場合、4つのノードを除外リストに追加し、確認を待ってから同時にシャットダウンできます。

投票除外は、短期間にクラスターからマスター選出可能なノードの半分以上を削除する場合にのみ必要です。マスター選出不可能なノードを削除する場合や、マスター選出可能なノードの半分未満を削除する場合には必要ありません。

ノードの除外を追加すると、そのノードの投票構成除外リストにエントリが作成され、システムはそのノードを削除するために投票構成を自動的に再構成し、削除された後は投票構成に戻ることを防ぎます。除外の現在のリストはクラスター状態に保存され、次のように検査できます:

Python

  1. resp = client.cluster.state(
  2. filter_path="metadata.cluster_coordination.voting_config_exclusions",
  3. )
  4. print(resp)

Ruby

  1. response = client.cluster.state(
  2. filter_path: 'metadata.cluster_coordination.voting_config_exclusions'
  3. )
  4. puts response

Js

  1. const response = await client.cluster.state({
  2. filter_path: "metadata.cluster_coordination.voting_config_exclusions",
  3. });
  4. console.log(response);

コンソール

  1. GET /_cluster/state?filter_path=metadata.cluster_coordination.voting_config_exclusions

このリストは、cluster.max_voting_config_exclusions設定によってサイズが制限されており、デフォルトは10です。発見とクラスター形成設定を参照してください。投票構成除外は永続的で数が制限されているため、クリーンアップする必要があります。通常、除外はクラスターのメンテナンスを行う際に追加され、メンテナンスが完了したら除外をクリーンアップする必要があります。クラスターは通常の運用中に投票構成除外を持つべきではありません。

ノードが投票構成から除外されている場合、永久にシャットダウンされるため、その除外はシャットダウンされ、クラスターから削除された後に削除できます。除外は、誤って作成された場合や一時的に必要な場合にも?wait_for_removal=falseを指定することでクリアできます。

Python

  1. resp = client.cluster.delete_voting_config_exclusions()
  2. print(resp)
  3. resp1 = client.cluster.delete_voting_config_exclusions(
  4. wait_for_removal=False,
  5. )
  6. print(resp1)

Js

  1. const response = await client.cluster.deleteVotingConfigExclusions();
  2. console.log(response);
  3. const response1 = await client.cluster.deleteVotingConfigExclusions({
  4. wait_for_removal: "false",
  5. });
  6. console.log(response1);

コンソール

  1. # 投票構成除外を持つすべてのノードがクラスターから削除されるのを待つ
  2. # その後、すべての除外を削除し、将来的に任意のノードが投票構成に戻ることを許可する。
  3. # 投票構成に戻ることができるようにする。
  4. DELETE /_cluster/voting_config_exclusions
  5. # すぐにすべての投票構成除外を削除し、任意のノードが
  6. # 将来的に投票構成に戻ることを許可する。
  7. DELETE /_cluster/voting_config_exclusions?wait_for_removal=false