跨集群复制CCR(Cross-Cluster Replication)支持将Leader集群的索引数据近实时复制到Follower集群,实现异地容灾、读写分离和就近访问。本文介绍ES常见容灾方案的对比分析和CCR的工作原理,帮助选择适合的容灾方案。
方案选型
Elasticsearch(ES)异地容灾主要有以下方案:
OSS快照备份与恢复:通过将索引数据备份到阿里云对象存储OSS,实现数据持久化保存。首次快照为全量备份,后续为增量备份。通过跨集群OSS仓库,可将快照数据恢复到目标ES实例。详情请参见设置跨集群OSS仓库。
Logstash:通过配置管道(Pipeline),从源端ES集群读取数据,经过处理后写入目标集群。适用于版本跨度较大的数据迁移和需要数据过滤转换的场景。详情请参见快速入门。
Reindex:通过ES内置的Reindex API,将全量或符合条件的数据从一个索引复制到另一个索引,支持跨集群操作。适用于数据量较小的一次性迁移场景。详情请参见通过Reindex API迁移数据。
跨集群复制(CCR):将Leader集群的可写索引,以异步、增量的方式自动复制到一个或多个Follower集群。支持近实时同步,适用于对RPO和RTO要求较高的容灾场景。
方案对比
方案 | 适用场景 | RPO | RTO | 主要限制 |
OSS快照 | 大规模数据(GB~PB级别)的定期备份与恢复 | 小时级到天级(取决于快照间隔) | 数小时(取决于数据量和分片恢复时间) | 无法实现持续同步;恢复期间可能需要停止服务 |
Logstash | 对实时性要求不高的数据迁移;需要数据过滤转换的场景;版本跨度较大的迁移 | 秒级到分钟级(取决于同步频率) | 数小时(取决于数据量和实例性能) | 批量同步,无法实时;不支持同步delete操作 |
Reindex | 数据量较小的一次性索引迁移 | 不适用(一次性操作) | 分钟级到数小时(取决于数据量) | 无法持续同步;大规模数据迁移效率低 |
CCR | 异地容灾、读写分离、就近访问 | 近零(秒级) | 秒级到分钟级 | Follower索引只读;需要相同的mapping和分片数 |
对于RPO和实时性要求高的异地容灾场景,CCR是最佳选择:
CCR实现秒级数据同步,数据丢失最小化。
主集群故障时,业务流量切换到Follower集群即可恢复服务,无需等待快照恢复。
虽然初始部署成本较高,但长期来看避免了数据丢失导致的业务损失,性价比更高。
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 |
使用限制
两个集群的管控部署模式均需为云原生新管控(v3)。如果集群为v1或v2架构,需先完成架构升级,请参见实例架构升级。
如何识别ES集群架构版本:登录ES控制台,在实例基本信息页面查看管控部署模式:云原生新管控(v3)或者基础管控(v2)。
两个集群的版本均需为7.10.0及以上,且Follower集群版本不低于Leader集群版本。
Follower索引为只读状态,不支持写入操作。如需写入,需对目标索引执行以下操作,恢复索引的可读写状态:
暂停跟随任务:
POST /<index>/_ccr/pause_follow关闭索引:
POST /<index>/_close解除跟随关系:
POST /<index>/_ccr/unfollow重新打开索引,使其可读写:
POST /<index>/_open
Leader集群索引的mapping和分片数必须与Follower集群索引一致,Follower集群的分片数不能更改。