Elasticsearch 如何实现跨集群复制(CCR)?
Elasticsearch 跨集群复制(Cross-Cluster Replication, CCR)是一种基于 Leader-Follower 模型的单向数据复制机制,允许一个集群中的索引数据持续同步到另一个集群。Leader 索引负责写入,Follower 索引只读并持续拉取更新。CCR 从 6.5 版本开始提供,属于白金版付费功能,广泛用于灾备恢复、数据本地化和集中报表场景。
CCR 的前提条件
在配置 CCR 之前,必须满足以下条件:
- 许可要求:CCR 是白金版(Platinum)付费功能,需要商业许可证,可申请 30 天试用体验
- 版本兼容:Follower 集群的 Elasticsearch 版本必须等于或高于 Leader 集群的版本
- 软删除必须启用:Leader 索引必须开启软删除(
index.soft_deletes.enabled: true),7.0.0 及以上版本默认开启 - 远程集群已注册:双方集群必须互相注册为远程集群
- 权限配置:本地集群用户需要
manage_ccr集群权限,Follower 索引需要monitor、read、write及manage_follow_index索引权限
CCR 的工作原理
CCR 采用主动-被动模型,数据流严格从 Leader 流向 Follower:
- Leader 索引:接收所有写入操作,生成 translog 和 segment
- Follower 索引:只读状态,主动从 Leader 拉取数据变更
- 复制分两阶段:
- 阶段一(Remote Recovery):复制 Leader 的已有 segment 到 Follower,这是网络密集型操作
- 阶段二(操作记录同步):持续复制内存缓冲区和 translog 中的新增操作记录
Follower 通过轮询 Leader 的 translog 获取变更,使用序列号(Sequence Number)标记同步位点,确保数据顺序性和一致性。如果 Follower 落后过多,Leader 会保留历史操作记录直到 Follower 追上,这也正是软删除必须启用的重要原因。
实战:配置跨集群复制
步骤 1:注册远程集群
在 Follower 集群上注册 Leader 集群:
bash# 在 Follower 集群执行 PUT /_cluster/settings { "persistent": { "cluster": { "remote": { "leader-cluster": { "seeds": ["leader-node1:9300", "leader-node2:9300"] } } } } }
验证远程集群连接:
bashGET /_remote/info
返回结果中应能看到 leader-cluster 的连接状态为已连接。
步骤 2:创建 Follower 索引
在 Follower 集群上创建跟随者索引,指定 Leader 集群和索引:
bash# 在 Follower 集群执行 PUT /my-follower-index/_ccr/follow { "remote_cluster": "leader-cluster", "leader_index": "my-leader-index" }
创建后,Follower 索引进入只读状态,自动开始从 Leader 拉取数据。首次同步会执行完整的 Remote Recovery,后续只同步增量变更。
步骤 3:验证复制状态
检查 Follower 索引的复制进度:
bashGET /my-follower-index/_ccr/stats
关键字段说明:
leader_global_checkpoint:Leader 当前的全局检查点follower_global_checkpoint:Follower 已追到的检查点operations_indexed:已索引的操作数- 两者差值即为复制延迟量
步骤 4:暂停与恢复复制
bash# 暂停复制 POST /my-follower-index/_ccr/pause_follow # 恢复复制 POST /my-follower-index/_ccr/resume_follow
步骤 5:终止复制
如需将 Follower 索引转为可写入的普通索引:
bash# 先暂停复制 POST /my-follower-index/_ccr/pause_follow # 关闭索引 POST /my-follower-index/_close # 终止跟随关系 POST /my-follower-index/_ccr/unfollow # 重新打开索引(现在可以写入了) POST /my-follower-index/_open
终止后,该索引变为普通索引,不再与 Leader 保持同步。
性能调优参数
CCR 提供了多个调优参数控制复制行为:
| 参数 | 默认值 | 说明 |
|---|---|---|
ccr.indices.recovery.max_bytes_per_sec | 40mb | 每节点出入站远程流量上限 |
ccr.indices.recovery.max_concurrent_file_chunks | 5 | 并行复制文件数,最大 10 |
ccr.indices.recovery.chunk_size | 1mb | 单次请求的文件块大小 |
ccr.indices.recovery.recovery_activity_timeout | 60s | Leader 等待 Follower 请求的超时 |
在跨地域部署中,建议根据网络带宽适当调低 max_bytes_per_sec,避免 CCR 流量挤占业务带宽。
CCR 的典型应用场景
灾备恢复:生产集群作为 Leader,异地集群作为 Follower。主集群故障时,可将 Follower 索引转为普通索引接管业务。
数据本地化:将中心集群的数据复制到边缘集群,减少跨区域访问延迟。例如总部数据同步到各区域机房供本地查询。
集中报表:多个业务集群作为 Leader,将数据统一复制到中央报表集群,避免直接查询生产库。
连锁复制:A 集群复制到 B,B 再复制到 C,实现多级数据分发。但需注意每一级都会增加延迟。
CCR 与 CCS 的区别
- CCR(跨集群复制):数据物理复制,Follower 持有完整数据副本,可离线查询
- CCS(跨集群搜索):不复制数据,实时转发搜索请求到远程集群并汇总结果,依赖网络可用性
两者常配合使用:CCR 保证数据本地可用,CCS 实现全局搜索覆盖。
常见问题与排查
复制延迟过高:检查网络带宽和 max_bytes_per_sec 配置,确认 Leader 集群写入压力是否过大。使用 _ccr/stats 监控 checkpoint 差值。
Follower 无法连接 Leader:确认 9300 端口开放,检查 seeds 地址是否正确,通过 _remote/info 验证连接状态。
软删除未启用:如果 Leader 索引创建时未启用软删除,CCR 将无法工作。需要重新创建索引并启用 index.soft_deletes.enabled。
Follower 索引写入报错:这是正常行为,Follower 索引为只读。需要写入时必须先终止跟随关系。
小结
CCR 通过 Leader-Follower 模型实现跨集群数据复制,核心流程是注册远程集群、创建 Follower 索引、监控同步状态。关键要点:CCR 是白金版功能,Follower 版本不能低于 Leader,软删除必须开启,Follower 索引只读。掌握这些前提和配置步骤,就能在生产环境中可靠地实现跨集群数据同步与灾备。