Elasticsearch の耐障害性: レプリカ + スナップショット + CCR
症状
目標: レプリカシャード、専用 master/data ノード、スナップショットバックアップ (SLM)、クラスタ間レプリケーション (CCR) により、Elasticsearch の耐障害性を構築する。
1. ロールを分離する: 専用 master ノードと data ノード
クラスタの安定性のため、投票権を持つ master 適格ノード (できれば 3 つ、奇数の過半数) をデータワークロードから分離する。elasticsearch.yml の node.roles でロールを割り当て、ディスカバリ用に seed hosts を定義する。3 つの master がスプリットブレインを防ぐ。
Elasticsearch
# elasticsearch.yml on master nodes:
# node.roles: [ master ]
# on data nodes:
# node.roles: [ data, ingest ]
# discovery.seed_hosts: [ m1, m2, m3 ]
# cluster.initial_master_nodes: [ m1, m2, m3 ]2. インデックスのレプリカ数を設定する
number_of_replicas は各プライマリシャードについて保持されるコピー数である。data ノードを 1 つ失ってもデータが利用可能であるよう、少なくとも 1 にする。稼働中のインデックスで動的に変更でき、レプリカ数は data ノード数より少なくなければならない。
Elasticsearch
PUT /orders/_settings
{
"index": { "number_of_replicas": 1 }
}
# default via template (composable template; the old _template API is legacy):
# PUT _index_template/order-tpl { "index_patterns": ["order*"], "template": { "settings": { "number_of_replicas": 1 } } }3. スナップショットリポジトリを定義する
バックアップはリポジトリに取得される: 共有ファイルシステム (fs) または S3/GCS/Azure プラグイン。クラスタが削除されてもデータを復旧できるよう、リポジトリはクラスタ外の永続的なストレージに置く必要がある。
Elasticsearch
PUT /_snapshot/backup_repo
{
"type": "fs",
"settings": { "location": "/mnt/es_backups", "compress": true }
}4. SLM で自動スナップショットをスケジュールする
Snapshot Lifecycle Management (SLM) は定期的にスナップショットを取得し、保持ポリシーを適用する。cron 式で頻度、対象インデックス、保持するスナップショット数を定義する。
Elasticsearch
PUT /_slm/policy/daily_backup
{
"schedule": "0 30 1 * * ?",
"name": "<daily-{now/d}>",
"repository": "backup_repo",
"config": { "indices": ["*"] },
"retention": { "expire_after": "30d", "min_count": 5, "max_count": 50 }
}5. スナップショットとリストアを検証する
SLM ポリシーを手動で実行して動作を確認する。スナップショットの状態は SUCCESS になるべきである。テストされていないバックアップはバックアップではないため、リストアテストを定期的に行う。
Elasticsearch
POST /_slm/policy/daily_backup/_execute
GET /_snapshot/backup_repo/_all
# restore:
POST /_snapshot/backup_repo/<snapshot_name>/_restore6. Cross-Cluster Replication (CCR) で遠隔 DR を構築する
リージョン間の災害復旧では、2 つ目のクラスタ (follower) がリモートのプライマリクラスタ (leader) 内のインデックスに追従する。まずリモートクラスタを定義し、次に follower インデックスを leader に接続する。leader 上の変更は自動的に流れる。CCR は Platinum (商用) 機能である。
Elasticsearch
# define the remote cluster on the follower cluster:
PUT /_cluster/settings
{ "persistent": { "cluster": { "remote": { "primary": { "seeds": ["leader1:9300"] } } } } }
# create the follower index:
PUT /orders-follower/_ccr/follow
{ "remote_cluster": "primary", "leader_index": "orders" }