# 通过CCS实现Elasticsearch多集群联合检索
通过Elasticsearch的跨集群搜索CCS（Cross-Cluster Search）功能，实现多个CSS集群之间的联合检索，无需复制数据即可直接查询远程集群索引，适用于多地域数据统一查询和灾备切换等场景。
#### 应用场景
当您的业务数据分布在不同区域的多个Elasticsearch集群中时，例如集团总部需要统一查询各分支机构的日志数据，传统方式需要将所有数据物理迁移到同一集群，迁移成本高且影响业务连续性。通过CSS服务的跨集群搜索功能，在本地集群中配置远程集群连接，即可直接对远程集群的索引执行搜索操作，无需复制数据，实现多集群联合检索。
典型应用场景：
- 多地域数据联合查询：业务数据分布在不同区域的Elasticsearch集群，需通过统一入口进行联合检索，无需将数据物理迁移到同一集群。
- 集群合并查询：多个业务集群的索引数据需要汇总展示，但不希望做物理数据迁移。
- 多租户数据隔离：不同租户使用独立集群，管理面需跨集群统一检索。
- 灾备切换查询：主集群故障时，通过跨集群搜索快速切换到备集群查询数据。
 
#### 方案架构
图1业务流程图   
![](https://support.huaweicloud.com/bestpractice-css/figure/zh-cn_image_0000002661200953.png "点击放大")
跨集群搜索的核心业务流程如下：
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对等连接、配置集群路由。操作指导请参见[配置集群路由](https://support.huaweicloud.com/usermanual-css/css_01_0279.html)。
  
 
#### 步骤二：为本地集群配置远程集群连接
在本地集群中配置远程集群的连接信息，使本地集群能够识别和访问远程集群。
1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
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"，表示连接成功。
   
 
#### 步骤三：准备测试数据
在各集群中创建索引并写入测试数据，用于后续验证跨集群搜索效果。如果集群中已有业务数据，可跳过本步骤，直接使用已有索引搜索。
![](https://support.huaweicloud.com/bestpractice-css/public_sys-resources/caution_3.0-zh-cn.png)
各集群的索引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网段是否冲突，如果冲突需要重新规划网络。
 
#### 相关文档
- [配置集群路由](https://support.huaweicloud.com/usermanual-css/css_01_0279.html) ：了解Elasticsearch集群路由的详细配置方法。
- [VPC对等连接](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0046655036.html)：了解VPC对等连接的创建方法。
- [Cross-Cluster Search](https://www.elastic.co/guide/en/elasticsearch/reference/7.10/cross-cluster-configuring.html)：了解Elasticsearch跨集群搜索的官方说明。
 
