Elasticsearchクラスターのセットアップ:ステップバイステップ設定ガイド
堅牢なElasticsearchクラスターをセットアップすることは、その強力な分散検索および分析機能を活用するための基礎となるステップです。小規模なプロジェクトから大規模なエンタープライズソリューションまで、デプロイメントの規模に関わらず、最適なパフォーマンス、スケーラビリティ、信頼性を確保するためには、コアな設定原則を理解することが不可欠です。このガイドでは、Elasticsearchクラスターの設定に関する包括的なステップバイステップのウォークスルーを提供し、初期インストールからノード設定の微調整まで、重要な側面をカバーします。
適切なクラスター設定は、Elasticsearchインスタンスがスムーズに動作することを保証するだけでなく、増大するデータ量とクエリ負荷に対応できるよう準備を整えます。不適切な設定は、パフォーマンスのボトルネック、データの一貫性の欠如、さらにはクラスターの不安定性につながる可能性があります。このガイドに従うことで、特定のニーズに合わせて、回復力があり効率的なElasticsearch環境を構築するための知識を得ることができます。
前提条件
設定に取り掛かる前に、以下の項目が準備されていることを確認してください。
- Java Development Kit (JDK): Elasticsearchには互換性のあるJDKが必要です。Elasticsearch 7.x以降のバージョンでは、JDK 11以降が必要です。Javaのインストールを確認してください。
bash java -version - システムリソース: Elasticsearchノードに十分なRAM、CPU、ディスクスペースを割り当ててください。正確な要件は、データ量とクエリの複雑さに依存します。
- ネットワークアクセス: ノードが設定されたトランスポートポート(デフォルトは9300)で互いに通信できることを確認してください。
インストール
このガイドは設定に焦点を当てていますが、セットアップの成功は正しいインストールから始まります。Elasticsearchは、パッケージマネージャー(apt、yum)、アーカイブのダウンロード、またはDockerを使用してインストールできます。特定のオペレーティングシステムまたはデプロイ方法に関する詳細なインストール手順については、公式Elasticsearchドキュメントを参照してください。
コア設定ファイル
Elasticsearchの主要な設定ファイルはelasticsearch.ymlで、通常、Elasticsearchインストールのconfig/ディレクトリにあります。このファイル内の主要な設定が、クラスターの動作を決定します。
クラスターセットアップ:主要な設定ディレクティブ
1. クラスター名 (cluster.name)
この設定は、クラスターを一意に識別します。同じクラスター内のすべてのノードは、同じcluster.nameを共有する必要があります。設定しない場合、デフォルトはelasticsearchです。
- 重要性: ノードが正しいクラスターを発見し、参加するために不可欠です。同じネットワーク内の異なるクラスターは、異なる名前を持つべきです。
- 例 (
elasticsearch.yml):
yaml cluster.name: my-production-cluster
2. ノードロール (node.roles)
Elasticsearchノードには、リソース割り当てとパフォーマンスを最適化するために特定のロールを割り当てることができます。一般的なロールには、master、data、ingest、mlがあります。小規模なクラスターの場合、単一のノードが複数のロールを持つことができます。
- マスター候補ノード: インデックスの作成/削除、ノードの追跡、シャードの割り当てなど、クラスター全体の操作を担当します。プロダクション環境では、安定性のために専用のマスターノードを持つことが推奨されます。
yaml node.roles: [ master ] - データノード: データを保存し、インデックス作成や検索などのデータ関連操作を実行します。パフォーマンスには専用のデータノードが不可欠です。
yaml node.roles: [ data ] - インジェストノード: インデックス作成前にドキュメントを前処理するために使用されます(例:インジェストパイプラインの使用)。
yaml node.roles: [ ingest ] - 機械学習ノード: 異常検出やその他のタスクのために機械学習機能を実行します。
yaml node.roles: [ ml ] - 調整専用ノード (Coordinating-only node): 検索および一括リクエストを処理しますが、データを保存したり、マスター選出に参加したりしません。データノードやマスターノードからの重いクエリ負荷をオフロードするのに役立ちます。
yaml node.roles: [ ] # 特定のロールがない場合、マスター/データノードでない限り、デフォルトで調整専用を意味します。
ベストプラクティス: プロダクション環境では、フォールトトレランスとパフォーマンス向上のため、ノードを特定のロール(例:マスターノードとデータノードを分離)に専念させます。小規模なセットアップでは、ノードは役割を組み合わせることができます。
3. ネットワーク設定 (network.host, http.port, transport.port)
これらの設定は、Elasticsearchノードがどのように通信するかを制御します。
network.host: ノードがバインドするIPアドレスまたはホスト名です。マルチノードクラスターの場合、他のノードから到達可能なIPアドレスに設定します。0.0.0.0を使用すると、利用可能なすべてのネットワークインターフェースにバインドします。
yaml network.host: 192.168.1.100 # または network.host: _site_ # または network.host: 0.0.0.0http.port: HTTP REST API用のポート(デフォルト: 9200)。
yaml http.port: 9200transport.port: ノード間通信用のポート(デフォルト: 9300)。
yaml transport.port: 9300
警告: ファイアウォールルールに注意し、ノードがtransport.portで通信できることを確認してください。
4. ディスカバリ設定 (discovery.seed_hosts, cluster.initial_master_nodes)
これらの設定は、ノードがクラスターを発見し、参加するために不可欠です。
discovery.seed_hosts: 新しいノードがクラスターを発見するために接続できる、クラスター内の他のノードのIPアドレスまたはホスト名のリストです。
```yaml
discovery.seed_hosts:- "host1:9300"
- "host2:9300"
- "192.168.1.101:9300"
```
cluster.initial_master_nodes: クラスターが初めて起動する際に、初期マスターノードになる資格のあるノード名のリストです。これはクラスターのブートストラップに不可欠です。クラスターが稼働すると、これらの設定は新しいノードの参加にはそれほど重要ではなくなりますが、クラスターの再起動シナリオでは依然として重要です。
```yaml
cluster.initial_master_nodes:- "node-1"
- "node-2"
- "node-3"
```
ヒント: クラウド環境や動的ネットワークでは、DNSやクラウドプロバイダーのディスカバリメカニズムの使用を検討してください。
マルチノードクラスターの構成
マルチノードクラスターをセットアップするには、各ノードのelasticsearch.ymlファイルを構成します。以下のことを確認してください。
- すべてのノードで
cluster.nameが同一であること。 - 各ノードがユニークな
node.name(例:node-1、node-2)を持つこと。 network.hostが他のノードから到達可能なIPアドレスに設定されていること。discovery.seed_hostsが、少なくとも過半数のマスター候補ノードのアドレスをリストしていること。cluster.initial_master_nodesが、初期ブートストラップ用にマスター候補として指定されたすべてのノードの名前を含んでいること。
node-1の例:
cluster.name: my-production-cluster
node.name: node-1
node.roles: [ master, data ]
network.host: 192.168.1.100
http.port: 9200
transport.port: 9300
discovery.seed_hosts:
- "192.168.1.100:9300"
- "192.168.1.101:9300"
- "192.168.1.102:9300"
cluster.initial_master_nodes:
- "node-1"
- "node-2"
- "node-3"
node-2の例(node.name: node-2で同様):
cluster.name: my-production-cluster
node.name: node-2
node.roles: [ master, data ]
network.host: 192.168.1.101
http.port: 9200
transport.port: 9300
discovery.seed_hosts:
- "192.168.1.100:9300"
- "192.168.1.101:9300"
- "192.168.1.102:9300"
cluster.initial_master_nodes:
- "node-1"
- "node-2"
- "node-3"
5. ヒープサイズ (jvm.options)
Elasticsearchは大量のメモリを使用します。Java仮想マシン(JVM)のヒープサイズは、jvm.optionsファイル(通常はconfig/ディレクトリ)で構成されます。ヒープのリサイズによるパフォーマンスの問題を避けるため、最小ヒープサイズと最大ヒープサイズを同じ値に設定することが推奨されます。
- ベストプラクティス: ヒープサイズは、システムの利用可能なRAMの50%以下に設定し、圧縮された通常オブジェクトポインタ(oops)の制限により、30-32GBを超えることは決してありません。
例 (jvm.options):
-Xms4g
-Xmx4g
これは、初期ヒープサイズと最大ヒープサイズの両方を4ギガバイトに設定します。
6. シャード割り当てとレプリケーション (cluster.routing.*)
これらの設定は、シャードがノード間でどのように分散およびレプリケートされるかを制御します。
cluster.routing.allocation.disk.watermark.low,high,flood_stage: ディスクの空き容量が不足しているディスクへのシャード割り当てを防ぐためのしきい値です。cluster.routing.allocation.enable: シャード割り当てを制御します(例:all、primaries、new_primaries、none)。
例:
cluster.routing.allocation.disk.watermark.low: "85%"
cluster.routing.allocation.disk.watermark.high: "90%"
cluster.routing.allocation.disk.watermark.flood_stage: "95%"
クラスターヘルスの確認
ノードが起動したら、クラスターヘルスAPIを使用してクラスターの健全性とステータスを確認できます。
curl -X GET "localhost:9200/_cluster/health?pretty"
主要な出力フィールド:
status:green(すべてのシャードが割り当て済み)、yellow(一部のレプリカが未割り当て)、red(一部のプライマリシャードが未割り当て)。number_of_nodes: クラスター内のノードの総数。number_of_data_nodes: データノードとして指定されたノードの数。active_shards,relocating_shards,initializing_shards,unassigned_shards。
ヒント: greenステータスを目指してください。yellowステータスは、データは安全ですが(プライマリシャードは割り当て済み)、高可用性のために十分なレプリカがない可能性があることを示します。redステータスは、データが危険にさらされており、直ちに対処が必要であることを意味します。
次のステップ
Elasticsearchクラスターのセットアップに成功したら、通常は次の手順に進みます。
- インデックス作成: データの保存方法と編成方法を定義します。
- マッピング: フィールドのデータ型を指定して、ドキュメントのスキーマを定義します。
- アナライザー: 効果的な全文検索のためにテキスト分析を構成します。
- セキュリティ: 認証と認可を実装します。
このガイドは、安定した高性能なElasticsearchクラスターのための不可欠な基盤を提供します。特定のワークロードに基づいた継続的な監視とチューニングが、長期的な成功の鍵となります。