跨集群复制CCR(Cross-Cluster Replication)支持将Leader集群的索引数据近实时复制到Follower集群,实现异地容灾、读写分离和就近访问。本文介绍ES常见容灾方案的对比分析和CCR的工作原理,帮助选择适合的容灾方案。
CCR工作原理
基本架构
CCR采用主动-被动(Active-Passive)架构。Leader集群负责接收所有写操作,Follower集群为只读状态,仅从Leader集群复制数据。
Leader集群:源端集群,承担所有写操作。
Follower集群:目标端集群,只读状态,通过CCR从Leader集群同步数据。
数据复制流程
CCR的数据复制分为两个阶段:
初始化阶段
Follower集群向Leader发起初始化请求,Leader将索引的所有Lucene segment文件传输到Follower索引,类似于快照恢复机制。
增量同步阶段
Follower索引的分片定期(默认每秒)向Leader发起拉取请求,获取自上次同步点之后的最新操作。具体过程如下:
定位拉取起点:Follower本地维护一个
remote_checkpoint,表示已成功应用到本地的最新操作位置,对应Leader Translog(事务日志)中的global_checkpoint。从Leader Translog读取操作:Leader根据Follower提供的
from_seq_no定位Translog中的起始位置,读取后续所有操作(index、update、delete),返回操作列表。Follower本地重放:Follower在本地按顺序重放这些操作,更新
remote_checkpoint。如果重放失败(如版本冲突),会暂停同步并记录错误。持续轮询:Follower以固定间隔持续拉取新操作,通常延迟小于1秒。
Translog的核心作用
Translog(事务日志)是CCR增量同步的数据来源,在ES中承担以下作用:
防止数据丢失:ES默认每秒refresh一次,将内存缓冲区数据生成新的Lucene可搜索段,但这些段尚未同步到磁盘。Translog记录了所有写操作,可在节点崩溃后通过重放恢复数据。
保障副本一致性:写操作先写入Translog,再转发给副本分片。只有主副分片都确认写入后,才返回成功。
支持CCR增量同步:CCR通过ES内部的Translog API读取操作日志,获取指定序列号之后的所有变更,实现近实时数据复制。
Translog按分片隔离存储,每个分片拥有独立的Translog目录,存储路径为indices/{index_uuid}/{shard_id}/translog/。Translog文件(.tlog)以二进制格式存储,采用Generation机制滚动管理:每次flush或文件达到大小上限(默认512MB)时,创建新一代文件。
阿里云ES集群的CCR网络方案
阿里云ES实例部署在独立的管控VPC内,而非用户VPC中。即使两个集群在同一地域或已通过CEN打通跨地域VPC,也无法直接实现集群间的私网互通。需要借助NLB和PrivateLink打通管控VPC网络。
根据两个集群是否在同一地域,选择对应的操作文档:
场景 | 说明 | 操作文档 |
同地域 | Leader和Follower集群在同一地域,通过NLB+PrivateLink打通管控VPC | |
跨地域 | Leader和Follower集群在不同地域,需先通过CEN打通用户VPC,再通过NLB+PrivateLink打通管控VPC |