5月27日 23:50

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 索引需要 monitorreadwritemanage_follow_index 索引权限

CCR 的工作原理

CCR 采用主动-被动模型,数据流严格从 Leader 流向 Follower:

  1. Leader 索引:接收所有写入操作,生成 translog 和 segment
  2. Follower 索引:只读状态,主动从 Leader 拉取数据变更
  3. 复制分两阶段
    • 阶段一(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"] } } } } }

验证远程集群连接:

bash
GET /_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 索引的复制进度:

bash
GET /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_sec40mb每节点出入站远程流量上限
ccr.indices.recovery.max_concurrent_file_chunks5并行复制文件数,最大 10
ccr.indices.recovery.chunk_size1mb单次请求的文件块大小
ccr.indices.recovery.recovery_activity_timeout60sLeader 等待 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 索引只读。掌握这些前提和配置步骤,就能在生产环境中可靠地实现跨集群数据同步与灾备。

标签:ElasticSearch