文档首页/ 云搜索服务 CSS/ 最佳实践/ 数据搜索与分析/ 通过CCS实现Elasticsearch多集群联合检索
更新时间:2026-07-07 GMT+08:00
分享

通过CCS实现Elasticsearch多集群联合检索

通过Elasticsearch的跨集群搜索CCS(Cross-Cluster Search)功能,实现多个CSS集群之间的联合检索,无需复制数据即可直接查询远程集群索引,适用于多地域数据统一查询和灾备切换等场景。

应用场景

当您的业务数据分布在不同区域的多个Elasticsearch集群中时,例如集团总部需要统一查询各分支机构的日志数据,传统方式需要将所有数据物理迁移到同一集群,迁移成本高且影响业务连续性。通过CSS服务的跨集群搜索功能,在本地集群中配置远程集群连接,即可直接对远程集群的索引执行搜索操作,无需复制数据,实现多集群联合检索。

典型应用场景:

  • 多地域数据联合查询:业务数据分布在不同区域的Elasticsearch集群,需通过统一入口进行联合检索,无需将数据物理迁移到同一集群。
  • 集群合并查询:多个业务集群的索引数据需要汇总展示,但不希望做物理数据迁移。
  • 多租户数据隔离:不同租户使用独立集群,管理面需跨集群统一检索。
  • 灾备切换查询:主集群故障时,通过跨集群搜索快速切换到备集群查询数据。

方案架构

图1 业务流程图

跨集群搜索的核心业务流程如下:

  1. 配置网络连通:配置本地集群和远程集群之间的网络连通,确保本地集群可通过Transport端口(9300)访问远程集群。
  2. 配置远程集群连接:在本地集群中配置一个或多个远程集群的连接信息(Transport地址)。
  3. 执行跨集群搜索:客户端向本地集群发送搜索请求,请求中通过“远程集群名称:索引名称”语法指定远程集群的索引。
  4. 协调与汇总:本地集群作为协调节点,将搜索请求转发到远程集群执行,汇总各集群返回的结果后返回给客户端。

方案优势

  • 零数据复制查询:CCS方案无需复制数据,通过Transport连接直接查询远程集群,数据实时可见。
  • 弹性扩展能力:读集群和写集群可独立横向扩展,支持跨地域部署。
  • 查询语法统一:使用标准的Elasticsearch搜索语法,通过“远程集群名称:索引名称”格式即可指定远程索引,学习成本低。

性能影响

  • 本地集群影响:本地集群作为协调节点,查询过程中会占用CPU和内存资源用于结果汇总。当并发查询量较大时,建议适当扩容本地集群节点。
  • 网络延迟影响:跨集群搜索的查询延迟取决于本地集群与远程集群之间的网络延迟。同区域场景下延迟可忽略不计,跨区域场景建议开启transport.compress压缩传输数据以减少网络开销。

约束限制

  • 本地集群必须能够通过Transport端口(9300)访问远程集群。CSS服务默认不直接暴露9300端口,需通过配置VPC对等连接和集群路由放通9300端口。
  • 跨集群搜索仅支持查询操作,不支持向远程集群写入数据。
  • 不同集群的索引Mapping结构需保持一致,否则可能导致查询结果异常。
  • Elasticsearch集群的镜像版本号需大于或等于x.x.x_25.3.0_x.x.x,否则不支持配置集群路由。
  • 建议本地集群和远程集群的版本保持一致,避免因版本差异导致不兼容。

资源和成本规划

表1 资源和成本规划

集群资源

自定义远程集群名称

索引名称

费用说明

本地集群:CSS Elasticsearch

-

logs-2026

按需计费

远程集群1:CSS Elasticsearch

cluster_remote1

logs-202601

按需计费

远程集群2:CSS Elasticsearch

cluster_remote2

logs-202602

按需计费

前提条件

  • 已准备好本地集群和远程集群,且集群版本保持一致。
  • 确认本地集群和远程集群均处于“可用”状态。
  • 已获取远程集群的访问地址。

步骤一:打通本地集群和远程集群网络

确保本地集群能够通过Transport端口(9300)访问远程集群。根据集群所在的VPC情况,选择对应的网络配置方式。

  • 同VPC场景

    集群在同一VPC内,直接使用内网IP通信,无需额外配置。请跳过本步骤。

  • 跨VPC场景

    集群在不同VPC内,需依次完成以下操作:建立VPC对等连接、配置集群路由。操作指导请参见配置集群路由

步骤二:为本地集群配置远程集群连接

在本地集群中配置远程集群的连接信息,使本地集群能够识别和访问远程集群。

  1. 登录云搜索服务管理控制台
  2. 在左侧导航栏,选择“集群管理 > Elasticsearch”
  3. 在集群列表,选择本地集群,单击操作列的“Kibana”,登录Kibana。
  4. 在Kibana左侧导航栏选择“Dev Tools”,进入操作页面。
  5. 执行以下命令,在本地集群配置远程集群的连接信息。
    PUT _cluster/settings
    {
      "persistent": {
        "cluster": {
          "remote": {
            "<远程集群1名称>": {
              "seeds": [
                "<远程集群1节点1内网IP>:9300",
                "<远程集群1节点2内网IP>:9300",
                "<远程集群1节点3内网IP>:9300"
              ],
              "skip_unavailable": true
            },
            "<远程集群2名称>": {
              "seeds": [
                "<远程集群2节点1内网IP>:9300",
                "<远程集群2节点2内网IP>:9300",
                "<远程集群2节点3内网IP>:9300"
              ],
              "skip_unavailable": true
            }
          }
        }
      }
    }
    表2 远程集群连接参数说明

    参数

    说明

    <远程集群名称>

    自定义远程集群的名称,用于后续跨集群搜索时指定集群。例如“cluster_remote1”“cluster_remote2”

    seeds

    远程集群的Transport地址列表,格式为“<IP地址>:9300”。建议填写远程集群所有节点的地址,提高连接可靠性。

    skip_unavailable

    当远程集群不可用时,是否跳过该集群继续执行搜索。

    • true:跳过不可用的远程集群,搜索请求仅返回可用集群的结果,不会因单个远程集群故障导致整个请求失败。
    • false:不跳过,当任一远程集群不可用时,整个搜索请求将失败并返回错误。

    建议设置为“true”

  6. 执行以下命令,验证本地集群与远程集群的连接状况。
    GET _remote/info

    返回结果中远程集群的“connected”“true”,表示连接成功。

步骤三:准备测试数据

在各集群中创建索引并写入测试数据,用于后续验证跨集群搜索效果。如果集群中已有业务数据,可跳过本步骤,直接使用已有索引搜索。

各集群的索引Mapping结构需保持一致,否则跨集群搜索时可能导致查询结果异常。

  1. 在本地集群的Kibana中执行以下命令,创建索引并写入测试数据。
    # 创建索引
    PUT logs-2026
    {
      "mappings": {
        "properties": {
          "message": { "type": "text" }
        }
      }
    }
    
    # 写入数据
    POST logs-2026/_doc
    {"message": "info: local node healthy"}
  2. 在远程集群cluster_remote1的Kibana中执行以下命令,创建索引并写入测试数据。
    # 创建索引
    PUT logs-202601
    {
      "mappings": {
        "properties": {
          "message": { "type": "text" }
        }
      }
    }
    
    # 写入数据
    POST logs-202601/_doc
    {"message": "info: remote1 node healthy"}
  3. 在远程集群cluster_remote2的Kibana中执行以下命令,创建索引并写入测试数据。
    # 创建索引
    PUT logs-202602
    {
      "mappings": {
        "properties": {
          "message": { "type": "text" }
        }
      }
    }
    
    # 写入数据
    POST logs-202602/_doc
    {"message": "info: remote2 node healthy"}

步骤四:执行跨集群搜索

通过“远程集群名称:索引名称”语法,在本地集群中对远程集群的索引执行搜索操作。

  1. 单集群搜索。

    在本地集群的Kibana中执行以下命令,搜索远程集群cluster_remote1的logs-2026索引中包含“info”的信息。

    GET /cluster_remote1:logs-202601/_search
    {
      "query": {
        "match": {
          "message": "info"
        }
      }
    }

    预期结果:返回1条文档,“message”“info: remote1 node healthy”

  2. 多集群联合搜索。

    在本地集群的Kibana中执行以下命令,同时搜索本地集群和两个远程集群的logs-2026索引中包含“info”的信息。本地集群的索引直接使用索引名称,远程集群的索引需使用“远程集群名称:索引名称”格式。

    GET /logs-2026,cluster_remote1:logs-202601,cluster_remote2:logs-202602/_search
    {
      "query": {
        "match": {
          "message": "info"
        }
      }
    }

    预期结果:返回3条文档,分别来自本地集群、远程集群cluster_remote1和远程集群cluster_remote2,且“_index”字段分别显示“logs-2026”“cluster_remote1:logs-202601”“cluster_remote2:logs-202602”,确认跨集群搜索已成功聚合三个集群的数据。

常见问题:配置远程集群连接后“_remote/info”显示“connected: false”怎么办?

可能原因和解决方法:

  • 安全组未放行9300端口:检查本地集群和远程集群的安全组规则,确保9300端口已放行。
  • VPC对等连接未配置或配置错误:跨VPC场景下,检查VPC对等连接和路由配置是否正确。
  • 未配置集群路由或回程路由:确保本地集群和远程集群均已配置对方的路由信息。本地集群需添加远程集群所在网段的路由,远程集群也需添加本地集群所在网段的路由(回程路由)。
  • VPC网段冲突:检查本地集群和远程集群所在的VPC网段是否冲突,如果冲突需要重新规划网络。

相关文档

相关文档