基本的な3ノードクラスタ設定のためのステップバイステップガイド
高可用性と水平スケーラビリティを実現するためには、回復力のあるElasticsearchクラスタを構築することが、検索および分析インフラストラクチャの基本となります。3ノードクラスタは、単一ノードの障害が発生してもサービスの中断なく対応できる冗長性を提供し、優れた出発点となります。この包括的なガイドでは、開発環境や小規模な本番環境に最適な、基本的な3ノードElasticsearchクラスタのインストール、設定、および検証プロセスを順を追って説明します。
このチュートリアルを終える頃には、Elasticsearchのコアとなる分散機能を活用し、データを安全に分散およびレプリケートできる、機能的なクラスタが完成しているでしょう。
前提条件
設定を開始する前に、以下のものが準備されていることを確認してください。
- 3つの独立したサーバー/VM: それぞれが1つのノードをホストします。このガイドでは、3つの個別のマシンまたはDockerコンテナが準備できていることを前提とします。
- Java Development Kit (JDK): Elasticsearchは、すべてのノードに互換性のあるJDKがインストールされている必要があります(例:Elasticsearchのバージョンに応じてJDK 17)。
- ネットワーク接続: 3つのノードすべてが必要なポート(デフォルトHTTPポート: 9200、デフォルトトランスポートポート: 9300)で互いに通信できることを確認してください。
- 同一のElasticsearchインストール: Elasticsearchの同じバージョンを3つのノードすべてにダウンロードして展開してください。
ステップ1: 各ノードの elasticsearch.yml を設定する
Elasticsearchインストールの config/ ディレクトリにある設定ファイル elasticsearch.yml は、クラスタ内で各ノードがどのように動作するかを定義するために重要です。ノードごとに固有の設定を調整する必要があります。
ここでは、暗黙的に3つの役割を定義します。1つのマスター候補ノードと、3つのデータ候補ノードです。3ノードクラスタの場合、すべてのノードにマスター、データ、およびインジェストの役割を持たせることが一般的です。
すべてのノードに共通の設定
これらの設定は、3つの設定ファイルすべてで同一であることを確認してください。
# クラスタ名: すべてのノードで同じである必要があります
cluster.name: my-three-node-cluster
# ディスカバリ設定(初期参加に不可欠)
# ディスカバリをブートストラップするために、既知のノードのシードリストを使用します
discovery.seed_hosts: ["node1_ip:9300", "node2_ip:9300", "node3_ip:9300"]
# クォーラム(N/2 + 1)に必要です。3ノードの場合、2票が必要です。
cluster.initial_master_nodes: ["node1_name", "node2_name", "node3_name"]
# ネットワーク設定(正しいIPにバインドしていることを確認してください)
network.host: 0.0.0.0 # またはホストの特定のプライベートIP
# HTTPポート(外部アクセス)
http.port: 9200
# トランスポートポート(クラスタ内部通信)
transport.port: 9300
ノードごとの固有の設定
各ノードには一意の node.name が必要であり、同じマシンで実行している場合やストレージを共有している場合は、path.data も一意になる可能性があります。
ノード1の設定 (node1_ip)
# ノード1の一意の識別子
node.name: node-1
# パスが異なる場合
# path.data: /var/lib/elasticsearch/data_node1
ノード2の設定 (node2_ip)
# ノード2の一意の識別子
node.name: node-2
ノード3の設定 (node3_ip)
# ノード3の一意の識別子
node.name: node-3
cluster.initial_master_nodesに関する重要事項: この設定は、クラスタが初めて起動する際にのみ使用されます。クラスタが形成されると、Elasticsearchは内部でマスター選出を管理します。完全に停止したクラスタを再起動する必要がある場合は、これらの名前が初期設定と一致していることを確認する必要があります。
ステップ2: ロールの設定(オプションですが推奨)
デフォルトの設定ではノードはすべての役割(マスター、データ、インジェスト、コーディネーティング)を担うことができますが、大規模なデプロイメントでは役割を分離します。堅牢な3ノードセットアップのために、すべてのノードがマスターになる資格があることを確認します。
3つの elasticsearch.yml ファイルすべてに、以下のロール設定を追加してください。
# この初期設定では、すべての標準ロールをすべてのノードで有効にする
node.roles: [ master, data, ingest, remote_cluster_client ]
回復力のためのクォーラムの処理
3つのノードがあれば、クラスタはクォーラム(3ノード中2ノードが稼働)を維持しながら、1つのノードの損失に耐えることができます。これは、ステップ1で提供された cluster.initial_master_nodes リストによって管理されます。
ステップ3: クラスタノードの起動
各ノードでElasticsearchを順次起動します。現代のElasticsearchは順序付けられていない起動もよく処理しますが、一般的には cluster.initial_master_nodes で最初にリストされたノードから起動するのが最も安全です。
ノード1、ノード2、およびノード3で:
Elasticsearchのインストールディレクトリに移動し、以下を実行します。
# フォアグラウンドで実行する場合(デバッグに便利)
bin/elasticsearch
# バックグラウンドで実行する場合(本番環境では推奨)
bin/elasticsearch -d
各ノードのログ(logs/elasticsearch.log)を監視し、特にクラスタに正常に参加したことを示すメッセージを確認してください。
ステップ4: クラスタ状態の検証
すべてのノードが起動したら、いずれかのノードのHTTPポート(デフォルト9200)からアクセスできる _cat/health APIを使用して、クラスタの状態を確認します。
ノードに到達できるマシン(例:curl を使用)からアクセスします。
状態の確認:
curl -X GET "http://node1_ip:9200/_cat/health?v"
期待される出力スニペット:
| epoch | timestamp | cluster | status | node.total | node.data | shards | pri | relo | init | unassigned | unpersisted |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1701331200 | 12:00:00 | my-three-node-cluster | green | 3 | 3 | 0 | 0 | 0 | 0 | 0 | 0 |
status が green で node.total が 3 であれば、クラスタは正常に起動・実行されています。
ノードメンバーシップの検証
すべてのノードがお互いを認識していることを確認するには、ノードリストを確認します。
curl -X GET "http://node1_ip:9200/_cat/nodes?v"
node-1、node-2、node-3 に対応する3つの個別のエントリが表示されるはずです。それぞれにIPアドレスと役割(マスター候補の場合は m、データの場合は d)が表示されます。
ステップ5: レプリケーション付きテストインデックスの作成
クラスタのデータ分散およびレプリケーション処理能力を検証するには、少なくとも1つのレプリカを指定してインデックスを作成する必要があります。
3ノードクラスタでは、number_of_replicas を 1 に設定することで、各プライマリシャードが異なるノードに分散されたコピー(レプリカ)を1つ持つことが保証され、即時的な耐障害性が提供されます。
インデックス作成コマンド:
```bash
curl -X PUT "http://node1_ip:9200/test_data_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"number_of_shards": 3