如何在两台机器间同步ES8的prod与staging环境数据/索引?
ES8 生产环境到测试环境数据同步最优方案
针对两台配置一致的ES8集群(prod生产、staging测试),根据不同的同步需求,推荐以下几种最优方案:
1. 全量同步:Snapshot and Restore(快照恢复)
官方原生支持的全量同步方案,适合一次性同步或定期更新测试数据集的场景,数据一致性最高,对prod集群性能影响极小。
操作步骤:
- 配置prod集群快照仓库:选择可被两个集群访问的存储(如NFS共享目录、对象存储),执行API创建仓库:
PUT _snapshot/prod_backup_repo { "type": "fs", "settings": { "location": "/path/to/shared/backup", "compress": true, "max_snapshot_bytes_per_sec": "50mb" } } - 创建prod索引快照:对需要同步的索引生成快照(支持指定单个或多个索引):
PUT _snapshot/prod_backup_repo/prod_full_snapshot_20240520 { "indices": "prod_index_1,prod_index_2", "ignore_unavailable": true, "include_global_state": false } - 在staging集群恢复快照:先配置相同的快照仓库(确保存储路径可访问),再执行恢复:
(注:POST _snapshot/prod_backup_repo/prod_full_snapshot_20240520/_restore { "indices": "prod_index_1,prod_index_2", "rename_pattern": "prod_(.+)", "rename_replacement": "staging_$1", "include_global_state": false }rename_pattern可将prod索引重命名为staging前缀,避免冲突)
优势:
- 官方原生工具,兼容性强,数据一致性有保障
- 快照为增量模式,后续快照仅存储变化数据,节省存储
- 对prod集群性能影响低(快照为后台异步操作)
注意事项:
- 确保staging与prod的ES版本兼容(ES8系列内版本尽量完全一致)
- 快照存储需具备两个集群的读写权限
- 恢复前可暂停staging集群的写入操作,避免数据冲突
2. 增量/实时同步:Cross-Cluster Replication(CCR)
适合需要持续保持staging与prod数据近实时同步的场景,无需手动触发,自动同步增量数据。
操作步骤:
- 配置跨集群信任与连接:在staging集群的
elasticsearch.yml中添加prod集群的远程连接配置:
或通过API动态配置:cluster.remote.prod_cluster.seeds: ["prod-server-ip:9300"] cluster.remote.prod_cluster.skip_unavailable: truePUT _cluster/settings { "persistent": { "cluster.remote.prod_cluster.seeds": ["prod-server-ip:9300"] } } - 在staging创建follower索引:指向prod的leader索引,开启实时同步:
PUT _ccr/follow/staging_index_1 { "remote_cluster": "prod_cluster", "leader_index": "prod_index_1", "max_read_request_operation_count": 1024, "max_outstanding_read_requests": 16 }
优势:
- 近实时同步增量数据,staging数据始终与prod保持一致
- 自动处理索引结构变更、分片调整等操作
- 无需手动干预,适合持续测试场景
注意事项:
- 两个集群需网络互通(9300端口开放)
- prod集群需配置权限允许staging的访问(可通过角色控制)
- follower索引默认只读,若测试需要写入,需先暂停follow或克隆索引后操作
3. 轻量自定义同步:Logstash/elasticdump
适合小数据量索引同步,或需要对数据进行自定义处理(字段过滤、格式修改)的场景。
Logstash配置示例:
input { elasticsearch { hosts => ["prod-server-ip:9200"] index => "prod_index" query => '{"query": {"match_all": {}}}' scroll => "5m" size => 1000 } } # 可选:添加filter进行数据处理 # filter { # mutate { remove_field => ["sensitive_field"] } # } output { elasticsearch { hosts => ["staging-server-ip:9200"] index => "staging_index" } }
elasticdump命令示例:
# 同步数据 elasticdump --input=http://prod-server-ip:9200/prod_index --output=http://staging-server-ip:9200/staging_index # 同步索引映射 elasticdump --input=http://prod-server-ip:9200/prod_index/_mapping --output=http://staging-server-ip:9200/staging_index/_mapping
优势:
- 灵活度高,可自定义同步逻辑与数据处理规则
- 工具轻量化,部署简单
- 适合小数据量或需要修改数据后同步的场景
注意事项:
- 大数据量时性能低于快照与CCR,会对prod集群产生一定查询压力
- 需控制同步并发量,避免影响prod业务
方案选择总结
- 一次性全量同步/定期更新:优先选择Snapshot and Restore,性能与一致性最优
- 持续近实时同步:选择CCR,实现自动化同步,减少运维成本
- 小数据量/自定义需求:选择Logstash或elasticdump,灵活满足个性化需求
内容的提问来源于stack exchange,提问作者Remco
相关产品推荐
相关产品推荐

