DBAtlas · 数据库运维图谱

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 是为每个主分片保留的副本数;它至少应为 1,以便在丢失某个 data 节点时数据仍然可用。它可以在线上索引上动态更改;副本数必须小于 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 安排自动快照

快照生命周期管理(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>/_restore

6. 用跨集群复制(CCR)搭建远程 DR

为实现跨区域灾难恢复,第二个集群(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" }
在 DBAtlas 中打开 →