3. 跨集群搜索(CCS)架构原理:网关节点、远程集群、跨集群查询执行流程

跨集群搜索(Cross-Cluster Search, CCS)是 Elasticsearch 联邦查询的核心能力,允许用户在一个协调集群上发起搜索请求,透明地跨多个远程集群检索数据。理解其架构原理,是后续进行边界参数调优的基础。

3.1 核心角色:网关节点与远程集群

CCS 架构中涉及两类集群与一个关键节点角色:

角色 说明 关键职责
协调集群 接收客户端搜索请求的集群,也称为“本地集群”或“查询集群”。 解析请求、分发子查询到远程集群、合并结果、返回最终响应。
远程集群 被查询的数据所在集群,通过 cluster.remote 配置注册到协调集群。 接收来自协调集群的子查询,执行搜索,返回结果片段。
网关节点 协调集群中负责与远程集群通信的节点,通常是协调集群中的 协调节点 或 数据节点。 建立并维护 TCP 传输连接(Transport Connection),转发查询请求,接收结果。
关键概念: 网关节点并非一个独立的节点角色,而是指在 CCS 流程中承担“网关”功能的节点。默认情况下,协调集群中的任意节点都可以作为网关节点,但可以通过 cluster.remote.connect 设置进行控制。

3.2 跨集群查询执行流程

一个完整的 CCS 查询请求,从客户端发起至结果返回,经历以下四个阶段:

  1. 请求接收与解析(协调集群)
    • 客户端向协调集群发送搜索请求,请求中通过 cluster_name:index_name 语法指定远程索引(例如 remote_cluster:logs-2024)。
    • 协调集群的接收节点解析请求,识别出需要跨集群查询的索引。
  2. 子查询分发(网关节点 → 远程集群)
    • 协调集群中的网关节点根据远程集群的注册信息,通过 传输层(Transport Layer) 建立 TCP 连接。
    • 网关节点将子查询请求(包含查询 DSL、分片信息、超时设置等)发送到远程集群的 任意一个节点(通常是远程集群的协调节点或数据节点)。
  3. 远程集群执行与结果返回
    • 远程集群接收到子查询后,在其本地执行完整的搜索流程:解析、分片路由、查询执行、聚合、评分。
    • 远程集群将 部分结果(例如每个分片的 Top N 文档、聚合桶)通过传输连接返回给协调集群的网关节点。
  4. 结果合并与响应(协调集群)
    • 协调集群的网关节点收集所有远程集群返回的结果片段。
    • 协调集群执行全局合并:重新排序(全局评分)、合并聚合桶、应用 from/size 分页。
    • 最终将合并后的完整结果返回给客户端。
性能关键点: 阶段 2 和阶段 4 是 CCS 性能瓶颈的主要来源。网络延迟、远程集群负载、结果集大小(size 参数)直接影响查询响应时间。

3.3 跨集群搜索架构流程图

下图展示了 CCS 查询请求的完整执行路径,包括网关节点在协调集群与远程集群之间的桥梁作用:

跨集群搜索(CCS)查询执行流程 客户端 搜索请求 协调集群(本地集群) 接收请求 · 解析索引 · 识别远程集群 内部路由 网关节点 建立传输连接 · 转发子查询 传输层 TCP 连接 远程集群 本地执行查询 · 返回部分结果 返回结果片段 协调集群(结果合并) 全局排序 · 合并聚合 · 返回客户端 说明: 网关节点是协调集群中负责与远程集群通信的节点。

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 控制,超时后返回已收集的结果。 超时时间设置过短可能导致频繁的部分结果返回。