数据备份策略
- 定期全量备份
- 使用 Elasticsearch 的快照(Snapshot)功能,定期(如每天凌晨业务低峰期)对整个集群进行全量快照备份。
- 配置一个专用的存储库(如 Amazon S3、NFS 等)来存储这些快照。例如,对于 Amazon S3 存储库,可按照如下步骤配置:
- 安装
repository - s3
插件(在每个节点上执行):bin/elasticsearch - plugin install repository - s3
。
- 在
elasticsearch.yml
文件中配置存储库:
path.repo: ["s3://your - bucket - name/your - repo - name"]
PUT _snapshot/your - repo - name/your - snapshot - name
{
"indices": "*",
"ignore_unavailable": true,
"include_global_state": false
}
- 增量备份
- 利用 Elasticsearch 的增量备份特性,在两次全量备份之间进行增量备份。增量备份会记录自上次全量或增量备份以来的所有更改。
- 每次增量备份时,Elasticsearch 会根据 SequenceIDs 来确定哪些数据发生了变化。例如,使用
PUT _snapshot/your - repo - name/your - incremental - snapshot - name
命令,并在请求体中指定 incremental: true
。
恢复流程
- 全量恢复
- 当需要进行全量恢复时,首先确保目标集群环境与原集群相似(如节点数量、配置等)。
- 从存储库中恢复最新的全量快照。通过 API 执行恢复操作:
POST _snapshot/your - repo - name/your - snapshot - name/_restore
- 恢复过程中,Elasticsearch 会根据快照中的数据和元数据重建索引。可以通过监控 API(如
GET _cat/restore?v
)查看恢复进度。
- 增量恢复
- 如果已经进行了全量恢复,后续可基于增量备份进行恢复。
- 执行增量恢复时,同样使用 API:
POST _snapshot/your - repo - name/your - incremental - snapshot - name/_restore
- Elasticsearch 会根据 SequenceIDs 将增量备份中的数据合并到已恢复的全量数据上,完成更快速的恢复。
故障场景应对
- 节点故障
- Elasticsearch 本身具备一定的容错能力,通过副本机制,当某个节点发生故障时,其他节点上的副本可以继续提供服务。
- 在恢复节点时,首先排查节点故障原因(如硬件故障、网络问题等)并修复。
- 重新启动故障节点后,Elasticsearch 会自动根据 SequenceIDs 同步缺失的数据,将该节点的数据恢复到与集群其他节点一致的状态。
- 集群脑裂
- 配置合适的
discovery.zen.minimum_master_nodes
参数,一般设置为 (master_eligible_nodes / 2)+1
,以防止脑裂。
- 如果发生脑裂,通常较小的“脑”会自动关闭(因为无法满足最小主节点数要求)。对于较大的“脑”,需要手动检查并确保数据一致性。可以通过比较各个节点的 SequenceIDs,找出差异并进行修复。例如,使用 Elasticsearch 的
_cat/indices?v&s=index,health
命令查看索引状态,对于不一致的索引,可从备份中恢复数据。
- 数据损坏
- 当检测到数据损坏(如通过 Elasticsearch 的
_cluster/health
命令发现某些索引状态异常)时,首先确定损坏的范围。
- 如果是部分索引损坏,可从备份中恢复该索引。对于全量数据损坏,可执行全量恢复操作。在恢复过程中,Elasticsearch 会利用 SequenceIDs 确保恢复的数据与备份时的数据一致。同时,可启用 Elasticsearch 的数据校验机制(如
index.codec
设置为 best_compression
时自带一定的数据校验),在写入和读取数据时检测数据完整性。