4. 跨集群复制(CCR)与CCS的区别与联系:主动-被动复制 vs 实时联邦查询
在Elasticsearch多集群架构中,跨集群复制(CCR,Cross-Cluster Replication)与跨集群搜索(CCS,Cross-Cluster Search)是解决数据分布与访问问题的两种核心机制。虽然它们都涉及多个集群之间的数据交互,但在设计目标、数据流向、一致性模型和适用场景上存在本质差异。本章将从架构原理、核心区别、联系与选型策略三个维度进行深度剖析。
核心认知:CCR是数据层的主动-被动复制,保证数据在集群间最终一致;CCS是查询层的实时联邦聚合,不复制数据,只转发查询请求并合并结果。
4.1 跨集群复制(CCR):主动-被动复制
CCR基于Elasticsearch的主从复制模型,在远程集群(Leader)和本地集群(Follower)之间建立单向数据同步通道。Leader集群负责写入,Follower集群被动接收并应用来自Leader的变更操作(如索引、更新、删除)。
4.1.1 核心架构与流程
- Leader索引:位于远程集群,接受所有写请求,产生操作日志(Translog)。
- Follower索引:位于本地集群,通过CCR插件从Leader拉取操作日志并重放到本地分片。
- 同步机制:基于拉取(Pull)模式,Follower定期轮询Leader的Translog偏移量,获取增量变更。
- 一致性:最终一致性,存在秒级至分钟级的复制延迟(取决于网络、负载和索引速率)。
适用场景:异地容灾、数据中心级故障转移、就近读取(将数据复制到离用户更近的集群)、合规性数据隔离(主集群写,只读副本用于分析)。
4.1.2 CCR关键参数
| 参数 | 默认值 | 说明 |
|---|---|---|
ccr.max_read_request_operation_count |
5120 | 单次拉取请求最大操作数,影响同步吞吐 |
ccr.indices.recovery.max_bytes_per_sec |
40mb | 初始同步与恢复时的带宽限制 |
ccr.following_index_buffer_size |
512mb | Follower索引的写入缓冲区大小,影响写入性能 |
ccr.poll_timeout |
1m | Follower轮询Leader的最大等待时间 |
4.2 跨集群搜索(CCS):实时联邦查询
CCS是一种查询层联邦技术,允许在本地集群(查询协调节点)上发起搜索请求,自动将请求分发到一个或多个远程集群,然后合并各集群返回的结果,最终返回给客户端。CCS不复制任何数据,远程集群的索引数据始终保持在原始位置。
4.2.1 核心架构与流程
- 查询协调节点:本地集群中的节点,负责解析远程集群别名、分发查询子请求、合并结果。
- 远程集群:通过
cluster.remote配置注册,每个远程集群有一个逻辑名称(如cluster_a)。 - 查询执行:协调节点将查询请求发送到远程集群的所有相关分片,远程集群独立执行查询并返回结果片段。
- 结果合并:协调节点对来自多个集群的命中结果(Hits)进行全局排序、聚合计算,然后返回给客户端。
性能风险:CCS的查询延迟取决于最慢的远程集群。如果某个远程集群响应缓慢或不可用,整个查询可能超时或失败。建议使用
ccs_minimize_roundtrips参数优化网络往返次数。
4.2.2 CCS关键参数
| 参数 | 默认值 | 说明 |
|---|---|---|
search.ccs.minimize_roundtrips |
true | 是否最小化协调节点与远程集群的网络往返 |
cluster.remote.connect |
true | 是否允许本地集群连接到远程集群 |
cluster.remote.connections_per_cluster |
3 | 每个远程集群的TCP连接数 |
cluster.remote.node.attr |
— | 通过节点属性过滤远程集群中的网关节点 |
4.3 CCR与CCS的核心区别
下表从多个维度对比两种机制的本质差异:
| 对比维度 | CCR(跨集群复制) | CCS(跨集群搜索) |
|---|---|---|
| 数据流向 | Leader → Follower(单向复制) | 查询请求 → 远程集群 → 结果返回(无数据移动) |
| 数据冗余 | 是,数据在Follower集群存在完整副本 | 否,数据仅存储在原始集群 |
| 写入能力 | 仅Leader可写,Follower只读 | 所有集群独立写入,查询时联邦读取 |
| 一致性模型 | 最终一致性(复制延迟) | 读写分离,查询时读取各集群最新已提交数据 |
| 查询延迟 | 低(本地查询Follower副本) | 较高(依赖网络和远程集群响应) |
| 网络开销 | 持续后台复制流量 | 按需查询流量 |
| 故障隔离 | Follower集群可独立提供服务 | 远程集群故障导致查询失败或部分结果 |
| 典型场景 | 灾备、数据本地化、读写分离 | 多集群统一搜索、跨地域数据聚合 |
4.4 CCR与CCS的联系与协同
尽管CCR和CCS在架构上不同,但在实际生产环境中,它们经常组合使用以构建高可用、低延迟的全球分布式搜索系统。例如:
- CCR提供数据冗余:将核心索引从主数据中心复制到多个边缘集群,确保数据在本地可用。
- CCS提供全局视图:在边缘集群上使用CCS查询所有远程集群(包括主集群和其他边缘集群),实现跨地域的实时搜索。
- 读写分离模式:主集群通过CCR将数据推送到只读副本集群,查询流量全部路由到副本集群,主集群专注于写入;副本集群之间通过CCS实现联邦查询。
最佳实践:对于延迟敏感的查询,优先使用CCR将数据复制到本地集群;对于数据新鲜度要求高且数据量较小的场景,使用CCS直接查询远程集群。两者结合可实现“本地读取+全局搜索”的混合架构。
4.5 架构对比示意图
下图展示了CCR与CCS在数据流和查询流上的核心差异:
4.6 选型决策矩阵
在实际架构设计中,可根据以下条件选择CCR、CCS或两者组合:
| 业务需求 | 推荐方案 | 理由 |
|---|---|---|
| 需要低延迟本地查询 | CCR | 数据在本地集群有副本,查询无需跨网络 |
| 需要实时查看所有集群最新数据 | CCS | 直接查询远程集群,无复制延迟 |
| 主集群故障切换需求 | CCR + 手动/自动切换 | Follower集群可提升为Leader,继续提供服务 |
| 跨地域数据聚合搜索 | CCS | 无需复制所有数据,节省存储和带宽 |
| 写密集型+读密集型分离 | CCR(写主读从) | 主集群专注写入,副本集群处理查询 |
| 多数据中心统一视图 | CCS + 部分CCR | 核心数据通过CCR复制,边缘数据通过CCS查询 |
4.7 组合架构示例
下图展示了一个典型的混合架构:主数据中心通过CCR将数据复制到两个边缘数据中心,同时边缘数据中心之间通过CCS实现联邦查询,提供全局搜索能力。
架构要点:在此组合架构中,边缘数据中心通过CCR获得主集群的数据副本,保证本地查询的低延迟;同时通过CCS查询其他边缘数据中心的数据,实现全局搜索。主集群故障时,可将某个边缘集群提升为新的Leader,保证业务连续性。