
3.9 Elasticsearch-跨集群搜索(CCS)与跨集群复制(CCR)
1. 功能定位
- CCS(Cross-Cluster Search):把查询请求同时发往本地与远程集群,结果聚合后统一返回,解决“数据分散、查询入口要统一”的问题。
- CCR(Cross-Cluster Replication):把 Leader 集群的索引近实时地拖回到 Follower 集群本地,解决“数据单点、灾备/就近读”的问题。
二者常被组合成“写集中、读分散”的多活架构:CCR 负责把数据推送到边缘,CCS 负责在边缘就能一次性查到全局数据。
2. CCS 原理解剖
- 协调节点收到用户请求后,解析出
cluster:index列表。 - 如果
ccs_minimize_roundtrips=true,先向各远程集群发送 can-match 探针,只把真正可能命中的分片加入二次请求,减少跨机房 RTT。 - 各集群本地执行后,将 TopN 的 docID 与排序值 返回协调节点;协调节点做全局归并,再拉取原始
_source(只在必要时第三次往返)。 - 聚合、高亮、Suggest 等操作在协调节点内存中完成,最终一次性返回客户端。
版本限制:本地集群版本必须 ≥ 远程集群,且功能集需完全交集,否则行为未定义。
3. CCR 原理解剖
- 角色:Leader Index(写入口) ↔ Follower Index(只读副本,可手动提升为 Leader)。
- 同步粒度:以 translog 的 sequence number 为基准,Follower 集群周期性拉取增量操作并重放。
- 一致性模型:最终一致,延迟通常秒级;支持断点续传,网络闪断不丢位点。
- 前置条件:
– Leader 索引需index.soft_deletes.enabled=true(8.x 默认开启)。
– 两集群 transport 层互通(9300 端口),并通过cluster.remote.{name}.proxy_address注册。
4. 快速配置示例
以下示例基于 8.x 单节点 Docker 环境,安全功能已关闭。
4.1 拉起两套集群
leader/docker-compose.yml
services:
es-leader:
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
environment:
- cluster.name=leader-cluster
- discovery.type=single-node
- xpack.security.enabled=false
ports: ["9200:9200"]
follower/docker-compose.yml 把 cluster.name 改成 follower-cluster,ports: ["9201:9200"]。
4.2 在 Follower 侧注册远程集群
curl -XPUT http://localhost:9201/_cluster/settings -H 'Content-Type: application/json' -d'
{
"persistent": {
"cluster.remote.leader-cluster": {
"mode": "sniff",
"seeds": ["es-leader:9300"]
}
}
}'
4.3 启动 CCR
# 先确保 Leader 索引已开启 soft_deletes
curl -XPUT http://localhost:9200/orders
# 再在 Follower 侧创建 Follower 索引
curl -XPUT http://localhost:9201/orders_follower/_ccr/follow?pretty -H 'Content-Type: application/json' -d'
{
"remote_cluster": "leader-cluster",
"leader_index": "orders"
}'
返回 "follow_index_created": true 表示同步已生效;继续往 Leader 写数据,可在 Follower 实时查到。
4.4 执行 CCS
curl -XGET http://localhost:9201/leader-cluster:orders,orders_follower/_search?pretty -H 'Content-Type: application/json' -d'
{
"query": { "match_all": {} },
"sort": [{ "timestamp": { "order": "desc" } }]
}'
一次请求即可拿到两个集群的最新订单。
5. 生产级要点
| 维度 | CCS 建议 | CCR 建议 |
|---|---|---|
| 网络 | 专线 / PrivateLink,开启 TLS 并做双向认证;ping.interval 与 connect.timeout 根据 RTT 调优。 | 同上,传输层复用 9300,确保带宽 ≥ 峰值索引速率 × 2。 |
| 安全 | Remote Cluster 使用 API Key 或 PKI 认证;搜索侧通过 DLS/FLS 限制字段级权限。 | Follower 集群对 Leader 只授予 monitor 与 read_ccr 权限,最小化暴露面。 |
| 性能 | 对滚动日志场景,把 ccs_minimize_roundtrips 设为 true 可节省 30–50% 跨机房 RT;对聚合量大场景可关闭,避免二次往返拉取 _source。 | Follower 拉取线程数 max_outstanding_read_requests 默认 12,可随网络延迟线性上调;写-heavy 场景建议 单独冷/热分层,Leader 热层 SSD,Follower 冷层 HDD + ILM。 |
| 监控 | 协调节点 ccs_total_roundtrips、 ccs_remote_failures;搜索延迟突增时优先检查跨域 DNS 与 MTU。 | 使用 GET _ccr/stats 观察 leader_global_checkpoint 与 follower_global_checkpoint 差值;差值持续 >5 min 需排查带宽或 GC。 |
| 灾备演练 | —— | 定期做 提升演练:POST orders_follower/_ccr/pause_follow → POST orders_follower/_ccr/unfollow → POST orders_follower/_settings 把 index.blocks.write=false,确认业务侧写入口可秒级切换。 |
6. 常见坑位速查
- 模板不一致:CCR 不会同步索引模板与 Ingest Pipeline,需提前在 Follower 侧建好,否则字段类型差异导致写入拒绝。
- 同义词文件缺失:Leader 使用了自定义同义词,Follower 侧若缺少同名文件,搜索侧分词结果将不一致。
- 滚动升级顺序:先升级 Follower,再升级 Leader;反之会造成版本不兼容,CCR 任务自动暂停。
- 大索引初始快照超时:首次全量阶段可在 Leader 侧调大
indices.snapshot.max_concurrent_operations,或先用手动 snapshot 导入基线,再启用 CCR 追增量。
7. 一句话总结
CCS 让你“像查一个集群一样查所有集群”,CCR 让你“把一个集群的数据安全快速地搬到另一个集群”;两者配合,Elasticsearch 才真正具备了跨地域、多活、读写分离的企业级能力。
更多技术文章见公众号: 大城市小农民

被折叠的 条评论
为什么被折叠?



