3. 跨集群搜索(CCS)架构原理:网关节点、远程集群、跨集群查询执行流程
跨集群搜索(Cross-Cluster Search, CCS)是 Elasticsearch 联邦查询的核心能力,允许用户在一个协调集群上发起搜索请求,透明地跨多个远程集群检索数据。理解其架构原理,是后续进行边界参数调优的基础。
3.1 核心角色:网关节点与远程集群
CCS 架构中涉及两类集群与一个关键节点角色:
| 角色 | 说明 | 关键职责 |
|---|---|---|
| 协调集群 | 接收客户端搜索请求的集群,也称为“本地集群”或“查询集群”。 | 解析请求、分发子查询到远程集群、合并结果、返回最终响应。 |
| 远程集群 | 被查询的数据所在集群,通过 cluster.remote 配置注册到协调集群。 |
接收来自协调集群的子查询,执行搜索,返回结果片段。 |
| 网关节点 | 协调集群中负责与远程集群通信的节点,通常是协调集群中的 协调节点 或 数据节点。 | 建立并维护 TCP 传输连接(Transport Connection),转发查询请求,接收结果。 |
关键概念: 网关节点并非一个独立的节点角色,而是指在 CCS 流程中承担“网关”功能的节点。默认情况下,协调集群中的任意节点都可以作为网关节点,但可以通过
cluster.remote.connect 设置进行控制。
3.2 跨集群查询执行流程
一个完整的 CCS 查询请求,从客户端发起至结果返回,经历以下四个阶段:
- 请求接收与解析(协调集群)
- 客户端向协调集群发送搜索请求,请求中通过
cluster_name:index_name语法指定远程索引(例如remote_cluster:logs-2024)。 - 协调集群的接收节点解析请求,识别出需要跨集群查询的索引。
- 客户端向协调集群发送搜索请求,请求中通过
- 子查询分发(网关节点 → 远程集群)
- 协调集群中的网关节点根据远程集群的注册信息,通过 传输层(Transport Layer) 建立 TCP 连接。
- 网关节点将子查询请求(包含查询 DSL、分片信息、超时设置等)发送到远程集群的 任意一个节点(通常是远程集群的协调节点或数据节点)。
- 远程集群执行与结果返回
- 远程集群接收到子查询后,在其本地执行完整的搜索流程:解析、分片路由、查询执行、聚合、评分。
- 远程集群将 部分结果(例如每个分片的 Top N 文档、聚合桶)通过传输连接返回给协调集群的网关节点。
- 结果合并与响应(协调集群)
- 协调集群的网关节点收集所有远程集群返回的结果片段。
- 协调集群执行全局合并:重新排序(全局评分)、合并聚合桶、应用
from/size分页。 - 最终将合并后的完整结果返回给客户端。
性能关键点: 阶段 2 和阶段 4 是 CCS 性能瓶颈的主要来源。网络延迟、远程集群负载、结果集大小(
size 参数)直接影响查询响应时间。
3.3 跨集群搜索架构流程图
下图展示了 CCS 查询请求的完整执行路径,包括网关节点在协调集群与远程集群之间的桥梁作用:
3.4 关键参数与边界行为
CCS 的执行效率受多个参数影响,以下是核心参数及其边界行为:
| 参数 | 默认值 | 作用域 | 边界行为说明 |
|---|---|---|---|
cluster.remote.connect |
true |
节点级别 | 设为 false 时,该节点不会作为网关节点,无法参与 CCS 通信。 |
cluster.remote.connections_per_cluster |
3 |
节点级别 | 每个网关节点到单个远程集群的最大 TCP 连接数。连接数不足时,查询排队;连接数过多时,增加资源开销。 |
search.ccs.minimize_roundtrips |
true |
请求级别 | 为 true 时,协调集群会等待所有远程集群返回结果后再合并;为 false 时,允许部分结果提前返回,适用于大结果集场景。 |
search.ccs.version_check |
true |
集群级别 | 启用时,协调集群会检查远程集群的版本兼容性。版本不匹配时,查询失败并返回错误。 |
边界陷阱: 当
search.ccs.minimize_roundtrips 为 false 且远程集群返回大量结果时,协调集群的内存压力会急剧上升,可能导致 OOM(内存溢出)。建议在调优时结合 size 和 terminate_after 参数进行限制。
3.5 网关节点选择策略
协调集群如何选择哪个节点作为网关节点?其策略如下:
- 默认策略: 协调集群的接收节点(即收到客户端请求的节点)会同时充当网关节点。如果该节点未启用
cluster.remote.connect,则请求失败。 - 自适应策略: 在 Elasticsearch 7.x 及以上版本,协调集群会优先选择与远程集群网络延迟较低的节点作为网关节点,以减少传输开销。
- 手动控制: 通过
cluster.remote.node.attr设置节点属性,可以强制指定某些节点作为网关节点,适用于网络拓扑隔离的场景。
最佳实践: 在跨数据中心部署中,建议在协调集群中专门设置一组节点(例如标记为
gateway: true)作为网关节点,并确保这些节点与远程集群之间的网络带宽充足、延迟稳定。
3.6 跨集群搜索的故障处理
当远程集群不可用时,CCS 的行为由 cluster.remote.connect 和 search.ccs.minimize_roundtrips 共同决定:
| 场景 | 行为 | 影响 |
|---|---|---|
| 远程集群完全不可达 | 查询失败,返回 connect_exception 错误。 |
整个 CCS 查询失败,除非使用 allow_partial_search_results 参数。 |
| 远程集群部分分片不可用 | 默认返回部分结果,并标记 _shards.failed。 |
结果可能不完整,但查询不会完全失败。 |
| 远程集群响应超时 | 受 search.default_search_timeout 控制,超时后返回已收集的结果。 |
超时时间设置过短可能导致频繁的部分结果返回。 |