如何在生产环境与备份环境的两个Elasticsearch集群之间执行备份操作
跨Elasticsearch集群(7.6.2)每月备份方案
针对你这种生产集群A(5TB数据)和备份集群B(同版本7.6.2,各6节点)的每月备份需求,结合你的服务器配置,我推荐两种落地性极强的方案,细节如下:
方案一:官方快照(Snapshot)+ 共享存储(最适合周期性备份)
这是Elasticsearch官方推荐的标准备份方式,完全适配你每月一次的需求,步骤清晰可控:
1. 准备跨集群共享存储
因为两个集群都需要访问同一个快照仓库,优先选择NFS共享目录(本地服务器场景最稳定):
- 在任意一台节点(比如A集群的主节点)搭建NFS服务,创建一个至少6TB的共享目录(A集群5TB数据压缩后大概3-4TB,留足冗余)
- 给A、B集群所有节点挂载这个NFS目录,确保
elasticsearch用户对目录有读写权限(执行chown -R elasticsearch:elasticsearch /path/to/nfs/backup)
2. 注册快照仓库(A、B集群都要执行)
在Kibana Dev Tools或者curl执行以下命令,注册同一个共享仓库:
PUT _snapshot/monthly_prod_backup { "type": "fs", "settings": { "location": "/path/to/nfs/backup", "compress": true, "max_snapshot_bytes_per_sec": "200mb", "max_restore_bytes_per_sec": "200mb" } }
compress: true:必须开启,大幅节省存储空间- 带宽限制:根据你的服务器带宽调整,200mb/s既能保证备份速度,又不会过度占用生产集群IO
3. 每月创建A集群的快照
在业务低峰期(比如每月1号凌晨)执行快照命令:
PUT _snapshot/monthly_prod_backup/snapshot_202409 { "indices": "*,-.kibana*,-.security*,-.monitoring*", "wait_for_completion": false, "include_global_state": false }
indices:排除系统索引(不需要备份的话),*代表所有业务索引wait_for_completion: false:后台执行快照,避免终端阻塞include_global_state: false:不备份集群全局状态,避免恢复时覆盖B集群的配置
4. 恢复快照到B集群
快照完成后(可以用GET _snapshot/monthly_prod_backup/snapshot_202409查看状态),在B集群执行恢复命令:
POST _snapshot/monthly_prod_backup/snapshot_202409/_restore { "indices": "*,-.kibana*,-.security*,-.monitoring*", "ignore_unavailable": true, "include_global_state": false, "rename_pattern": "(.+)", "rename_replacement": "backup_$1" // 可选:给恢复的索引加前缀,区分B集群原有数据 }
5. 备份验证
恢复完成后,一定要验证数据完整性:
- 查看索引状态:
GET _cat/indices?v - 对比文档数:
GET _cat/count?v - 检查集群健康:
GET _cluster/health
方案二:跨集群复制(CCR)的周期性同步变种(适合需要增量备份的场景)
如果你除了每月全量备份,还需要中间的增量同步,可以用CCR:
- 在A集群将业务索引设置为领导者索引,B集群创建追随者索引
- 默认CCR是实时同步,你可以通过暂停同步任务,每月手动触发一次全量同步,或者用ILM(索引生命周期管理)在A集群索引归档后,自动同步到B集群
- 优点:增量同步节省时间,缺点:配置比快照复杂,适合有额外增量需求的场景
关键注意事项
- 版本兼容性:7.6.2的快照只能恢复到相同或更高的7.x版本,你的B集群版本符合要求,没问题
- 磁盘空间:B集群总磁盘36TB,完全容纳5TB备份数据;NFS共享目录要定期清理旧快照(比如保留最近3个月的)
- 性能影响:备份/恢复尽量在业务低峰期执行,通过
max_snapshot_bytes_per_sec限制带宽,避免影响生产A集群 - 自动化:可以用Linux Cron或者Elasticsearch Watcher编写定时任务,每月自动执行备份和恢复流程,减少人工操作
内容的提问来源于stack exchange,提问作者leon




