高可用性Elasticsearchクラスターのセットアップガイド
Elasticsearchは、スケーラビリティと回復力を目的に設計された、強力な分散型検索・分析エンジンです。本番環境においては、継続的な運用と耐障害性の確保が最も重要となります。このガイドでは、堅牢な高可用性(HA)クラスターを構築するために、複数のElasticsearchノードを設定する際の基本的な手順を順を追って説明します。これらの手順に従うことで、ノード障害に耐え、データへのアクセスを維持し、アプリケーションの応答性とデータの安全性を確保できるクラスターのセットアップ方法を習得できます。
高可用性Elasticsearchクラスターのセットアップには、ノードの役割、ネットワーク構成、およびデータレプリケーション戦略の慎重な計画が必要です。目標は、ワークロードとデータを複数のマシンに冗長的に分散させ、単一障害点(SPOF)を排除することです。この記事では、要求の厳しい本番ユースケースに適した回復力のあるElasticsearchインフラストラクチャを構築するために役立つ、コアコンセプト、実際の設定手順、およびベストプラクティスについて解説します。
Elasticsearchにおける高可用性の理解
Elasticsearchにおける高可用性は、いくつかの重要なメカニズムを通じて実現されます。
- 分散アーキテクチャ: Elasticsearchは、データと操作を本質的に複数のノードに分散します。
- ノードロール: 異なるノードが異なる目的を果たすことができ、リソースの専門的な割り当てと障害の分離が可能になります。
- シャードのレプリケーション: 各インデックスはシャードに分割され、各プライマリシャードは、異なるノードに保存される1つ以上のレプリカシャードを持つことができます。
- マスターノードの選出: 堅牢な選出プロセスにより、クラスターの状態を管理するためのマスターノードが常に利用可能であることが保証されます。
- Zen Discovery (Zen2): このモジュールはノードの検出とマスターの選出を処理し、ノードが互いを見つけ、信頼性の高いクラスターを形成できるようにします。
必須のノードロール
HAセットアップにおいて、ノードロールを理解することは非常に重要です。HAのための主要なロールは次のとおりです。
- マスター選出可能ノード (Master-eligible nodes): これらのノードは、インデックスの作成/削除、ノードの追跡、シャードの割り当てなど、クラスターの状態管理を担当します。
dataロールも持たない限り、データストレージや検索/インデックスリクエストを直接処理しません。HAのためには、多数決を形成するために、奇数(通常3つ)の専用のマスター選出可能ノードを持つべきです。 - データノード (Data nodes): これらのノードは、インデックス化されたデータをシャードとして格納し、検索、集計、インデックス作成などのデータ関連操作を実行します。これらはクラスターの主力です。
- コーディネーティング専用ノード (Coordinating-only nodes): (オプション) これらのノードは、リクエストのルーティング、検索の削減フェーズの処理、バルクインデックス作成の管理に使用できます。データやクラスターの状態は保持しませんが、データノードやマスターノードから作業をオフロードできます。
シャードとレプリカ
Elasticsearchはデータをシャードに格納します。各インデックスは1つ以上のプライマリシャードで構成されます。高可用性を実現するには、各プライマリシャードに対して1つ以上のレプリカシャードを設定する必要があります。レプリカシャードはプライマリシャードのコピーです。プライマリシャードをホストしているノードに障害が発生した場合、別のノードにあるレプリカシャードが新しいプライマリとして昇格され、データ損失を防ぎ、継続的な運用を保証します。
HAクラスターセットアップの前提条件
設定に取り掛かる前に、環境が以下の基本的な要件を満たしていることを確認してください。
- Java Development Kit (JDK): Elasticsearchには互換性のあるJDK(通常はOpenJDK)が必要です。すべてのノードにインストールされていることを確認してください。
- システムリソース: 各ノード、特にデータノードには、十分なRAM(例:8~32GB)、CPUコア、および高速I/Oディスク容量(SSD推奨)を割り当ててください。
- ネットワーク構成: すべてのノードは、特定のポート(ノード間通信用のデフォルト9300、HTTP API用の9200)を介して相互に通信できる必要があります。ファイアウォールが適切に設定されていることを確認してください。
- オペレーティングシステム: 本番環境でのデプロイには、安定したLinuxディストリビューション(例:Ubuntu、CentOS、RHEL)が一般的に推奨されます。
HAクラスターセットアップのステップバイステップガイド
このセクションでは、マルチノードElasticsearchクラスターをインストールおよび設定するプロセスを概説します。
ステップ1:すべてのノードへのElasticsearchのインストール
クラスターの一部となる各サーバーにElasticsearchをインストールします。パッケージマネージャー(Debian/Ubuntuの場合はAPT、RHEL/CentOSの場合はYUM)を使用するか、アーカイブを直接ダウンロードできます。
例(APT経由のDebian/Ubuntu):
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install elasticsearch
インストール後、サービスを有効にして開始します(ただし、まず設定を行います)。
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
ステップ2:各ノードでのelasticsearch.ymlの設定
通常/etc/elasticsearch/に配置されているelasticsearch.ymlファイルは、クラスターの設定を定義する場所です。各ノードでこのファイルを編集し、適切な設定を行います。
すべてのノードに共通する設定
-
cluster.name: 同じクラスターに参加させたいすべてのノードで、これが同一である必要があります。
yaml cluster.name: my-ha-cluster -
node.name: 各ノードの一意の名前。識別に役立ちます。
yaml node.name: node-1 -
network.host: Elasticsearchを特定のネットワークインターフェイスにバインドします。すべての利用可能なインターフェイスにバインドするには0.0.0.0を使用するか、特定のIPアドレスを使用します。
yaml network.host: 0.0.0.0 # またはセキュリティ/マルチNICセットアップのための特定のIPアドレス # network.host: 192.168.1.101 -
http.port: HTTPクライアント通信用のポート(デフォルト9200)。
yaml http.port: 9200 -
transport.port: ノード間通信用のポート(デフォルト9300)。一貫している必要があります。
yaml transport.port: 9300
ディスカバリ設定(HAに不可欠)
これらの設定は、ノードが互いをどのように見つけ、クラスターを形成するかを伝えます。
-
discovery.seed_hosts: クラスター内のマスター選出可能ノードのアドレスのリスト。これは、ノードが初期のマスター選出可能ノードを検出する方法です。すべてのマスター選出可能ノードのIPアドレスまたはホスト名を提供します。
yaml discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"] -
cluster.initial_master_nodes: 真新しいクラスターを初めてブートストラップするときにのみ使用されます。このリストには、最初のマスター選出に参加するマスター選出可能ノードのnode.nameが含まれている必要があります。一度クラスターが形成されると、この設定は無視されます。
yaml cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]- 重要なヒント: クラスターが正常に形成された後、ノードが再起動した際に意図しない新しいクラスターの形成を防ぐために、
cluster.initial_master_nodesを削除またはコメントアウトしてください。
- 重要なヒント: クラスターが正常に形成された後、ノードが再起動した際に意図しない新しいクラスターの形成を防ぐために、
ノードロールの設定
各ノードのロールを指定します。一般的なHAセットアップには、3つの専用マスターノードと複数のデータノードが含まれます。
- マスター選出可能ノード(例:node-1、node-2、node-3):
yaml node.roles: [master] - データノード(例:node-4、node-5、node-6):
yaml node.roles: [data] - 混合ロールノード(大規模な本番HAには非推奨):
yaml node.roles: [master, data]- ベストプラクティス: 真の高可用性と本番での安定性のために、マスターロールとデータロールに別々のノードを割り当ててください。これにより、重要なマスタープロセスをリソース集約的なデータ操作から隔離できます。
ステップ3:JVMヒープサイズの設定
/etc/elasticsearch/jvm.optionsを編集して、JVMヒープサイズを設定します。経験則として、利用可能なRAMの50%を割り当てますが、30〜32GBを決して超えないようにしてください。たとえば、サーバーに16GBのRAMがある場合、8GBを割り当てます。
-Xms8g
-Xmx8g
ステップ4:システム設定
本番環境では、すべてのノードでvm.max_map_countとオープンファイル用のulimitを増やします。これらの行を/etc/sysctl.confに追加し、適用します(sudo sysctl -p)。
vm.max_map_count=262144
そして/etc/security/limits.conf(または/etc/security/limits.d/99-elasticsearch.conf)に以下を追加します。
elasticsearch - nofile 65536
elasticsearch - memlock unlimited
ステップ5:Elasticsearchサービスの開始
設定されたすべてのノードでElasticsearchサービスを開始します。マスター選出可能ノードを最初に起動することが推奨されることが多いですが、最新のディスカバリでは、discovery.seed_hostsが正しく設定されていれば、順序の重要性は低くなっています。
sudo systemctl start elasticsearch
サービスステータスとエラーログを確認します。
sudo systemctl status elasticsearch
sudo journalctl -f -u elasticsearch
ステップ6:クラスターのヘルスチェック
すべてのノードが稼働したら、Elasticsearch APIを使用してクラスターのヘルスを検証します。クラスター内のどのノードからでもクエリを実行できます。
curl -X GET "localhost:9200/_cat/health?v&pretty"
期待される出力:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1678886400 12:00:00 my-ha-cluster green 6 3 0 0 0 0 0 0 - 100.0%
status:green(すべてのプライマリシャードとレプリカシャードが割り当てられている)、またはyellow(すべてのプライマリシャードは割り当てられているが、一部のレプリカシャードがまだ割り当てられていない)である必要があります。redは深刻な問題を示しています。node.total: 起動したノードの総数と一致する必要があります。node.data: データノードの数と一致する必要があります。
ノードをチェックして、すべてがクラスターに参加していることを確認します。
curl -X GET "localhost:9200/_cat/nodes?v&pretty"
期待される出力(マスター3台、データ3台の例):
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.1.101 21 87 0 0.00 0.01 0.05 m * node-1
192.168.1.102 20 88 0 0.00 0.01 0.05 m - node-2
192.168.1.103 22 86 0 0.00 0.01 0.05 m - node-3
192.168.1.104 35 90 1 0.10 0.12 0.11 d - node-4
192.168.1.105 32 89 1 0.11 0.13 0.10 d - node-5
192.168.1.106 30 91 1 0.12 0.10 0.09 d - node-6
これは、node-1が選出されたマスター(master列の*)であり、他のノードがクラスターの一部であることを示しています。
ステップ7:インデックスのシャーディングとレプリケーションの設定
新しく作成されたインデックスの場合、Elasticsearchはデフォルトで1つのプライマリシャードと1つのレプリカ(index.number_of_shards: 1、index.number_of_replicas: 1)に設定されます。HAのためには、通常、少なくとも1つのレプリカが必要です。これは、データが少なくとも2つの異なるノードに存在することを意味します。これにより、1つのノードが故障した場合でも、別の場所にレプリカが利用可能になります。
インデックスを作成するときは、以下の設定を指定します。
```bash
curl -X PUT "localhost:9200/my_ha_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"number_of_shards": 3