通过CCS实现Elasticsearch多集群联合检索
通过Elasticsearch的跨集群搜索CCS(Cross-Cluster Search)功能,实现多个CSS集群之间的联合检索,无需复制数据即可直接查询远程集群索引,适用于多地域数据统一查询和灾备切换等场景。
应用场景
当您的业务数据分布在不同区域的多个Elasticsearch集群中时,例如集团总部需要统一查询各分支机构的日志数据,传统方式需要将所有数据物理迁移到同一集群,迁移成本高且影响业务连续性。通过CSS服务的跨集群搜索功能,在本地集群中配置远程集群连接,即可直接对远程集群的索引执行搜索操作,无需复制数据,实现多集群联合检索。
典型应用场景:
- 多地域数据联合查询:业务数据分布在不同区域的Elasticsearch集群,需通过统一入口进行联合检索,无需将数据物理迁移到同一集群。
- 集群合并查询:多个业务集群的索引数据需要汇总展示,但不希望做物理数据迁移。
- 多租户数据隔离:不同租户使用独立集群,管理面需跨集群统一检索。
- 灾备切换查询:主集群故障时,通过跨集群搜索快速切换到备集群查询数据。
方案架构
跨集群搜索的核心业务流程如下:
- 配置网络连通:配置本地集群和远程集群之间的网络连通,确保本地集群可通过Transport端口(9300)访问远程集群。
- 配置远程集群连接:在本地集群中配置一个或多个远程集群的连接信息(Transport地址)。
- 执行跨集群搜索:客户端向本地集群发送搜索请求,请求中通过“远程集群名称:索引名称”语法指定远程集群的索引。
- 协调与汇总:本地集群作为协调节点,将搜索请求转发到远程集群执行,汇总各集群返回的结果后返回给客户端。
方案优势
- 零数据复制查询:CCS方案无需复制数据,通过Transport连接直接查询远程集群,数据实时可见。
- 弹性扩展能力:读集群和写集群可独立横向扩展,支持跨地域部署。
- 查询语法统一:使用标准的Elasticsearch搜索语法,通过“远程集群名称:索引名称”格式即可指定远程索引,学习成本低。
性能影响
- 本地集群影响:本地集群作为协调节点,查询过程中会占用CPU和内存资源用于结果汇总。当并发查询量较大时,建议适当扩容本地集群节点。
- 网络延迟影响:跨集群搜索的查询延迟取决于本地集群与远程集群之间的网络延迟。同区域场景下延迟可忽略不计,跨区域场景建议开启transport.compress压缩传输数据以减少网络开销。
约束限制
- 本地集群必须能够通过Transport端口(9300)访问远程集群。CSS服务默认不直接暴露9300端口,需通过配置VPC对等连接和集群路由放通9300端口。
- 跨集群搜索仅支持查询操作,不支持向远程集群写入数据。
- 不同集群的索引Mapping结构需保持一致,否则可能导致查询结果异常。
- Elasticsearch集群的镜像版本号需大于或等于x.x.x_25.3.0_x.x.x,否则不支持配置集群路由。
- 建议本地集群和远程集群的版本保持一致,避免因版本差异导致不兼容。
资源和成本规划
| 集群资源 | 自定义远程集群名称 | 索引名称 | 费用说明 |
|---|---|---|---|
| 本地集群:CSS Elasticsearch | - | logs-2026 | 按需计费 |
| 远程集群1:CSS Elasticsearch | cluster_remote1 | logs-202601 | 按需计费 |
| 远程集群2:CSS Elasticsearch | cluster_remote2 | logs-202602 | 按需计费 |
前提条件
- 已准备好本地集群和远程集群,且集群版本保持一致。
- 确认本地集群和远程集群均处于“可用”状态。
- 已获取远程集群的访问地址。
步骤一:打通本地集群和远程集群网络
确保本地集群能够通过Transport端口(9300)访问远程集群。根据集群所在的VPC情况,选择对应的网络配置方式。
- 同VPC场景
- 跨VPC场景
集群在不同VPC内,需依次完成以下操作:建立VPC对等连接、配置集群路由。操作指导请参见配置集群路由。
步骤二:为本地集群配置远程集群连接
在本地集群中配置远程集群的连接信息,使本地集群能够识别和访问远程集群。
- 登录云搜索服务管理控制台。
- 在左侧导航栏,选择“集群管理 > Elasticsearch”。
- 在集群列表,选择本地集群,单击操作列的“Kibana”,登录Kibana。
- 在Kibana左侧导航栏选择“Dev Tools”,进入操作页面。
- 执行以下命令,在本地集群配置远程集群的连接信息。
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”。
- 执行以下命令,验证本地集群与远程集群的连接状况。
GET _remote/info
返回结果中远程集群的“connected”为“true”,表示连接成功。
步骤三:准备测试数据
在各集群中创建索引并写入测试数据,用于后续验证跨集群搜索效果。如果集群中已有业务数据,可跳过本步骤,直接使用已有索引搜索。
各集群的索引Mapping结构需保持一致,否则跨集群搜索时可能导致查询结果异常。
- 在本地集群的Kibana中执行以下命令,创建索引并写入测试数据。
# 创建索引 PUT logs-2026 { "mappings": { "properties": { "message": { "type": "text" } } } } # 写入数据 POST logs-2026/_doc {"message": "info: local node healthy"}
- 在远程集群cluster_remote1的Kibana中执行以下命令,创建索引并写入测试数据。
# 创建索引 PUT logs-202601 { "mappings": { "properties": { "message": { "type": "text" } } } } # 写入数据 POST logs-202601/_doc {"message": "info: remote1 node healthy"}
- 在远程集群cluster_remote2的Kibana中执行以下命令,创建索引并写入测试数据。
# 创建索引 PUT logs-202602 { "mappings": { "properties": { "message": { "type": "text" } } } } # 写入数据 POST logs-202602/_doc {"message": "info: remote2 node healthy"}
步骤四:执行跨集群搜索
通过“远程集群名称:索引名称”语法,在本地集群中对远程集群的索引执行搜索操作。
- 单集群搜索。
在本地集群的Kibana中执行以下命令,搜索远程集群cluster_remote1的logs-2026索引中包含“info”的信息。
GET /cluster_remote1:logs-202601/_search { "query": { "match": { "message": "info" } } }预期结果:返回1条文档,“message”为“info: remote1 node healthy”。
- 多集群联合搜索。
在本地集群的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网段是否冲突,如果冲突需要重新规划网络。
相关文档
- 配置集群路由 :了解Elasticsearch集群路由的详细配置方法。
- VPC对等连接:了解VPC对等连接的创建方法。
- Cross-Cluster Search:了解Elasticsearch跨集群搜索的官方说明。