--- title: "使用极限网关实现 ES 跨集群搜索" date: 2024-08-13 lastmod: 2024-08-13 description: "本文介绍了使用极限网关实现 Elasticsearch 跨集群搜索的方案,解决了集群间证书加密和网络不通的问题。通过配置网关,可合并多个集群的搜索结果,并支持通配符查询、聚合查询及索引展示等功能。" tags: ["Gateway", "跨集群搜索"] summary: "使用 ES 的小伙伴,有没有在用跨集群搜索的? 熟悉 ES 的小伙伴都知道,ES 本身就能实现跨集群搜索,那为啥还要聊这个?试想一下,如果集群都上线投产了,才出现跨集群搜索需求,那么可能出现两种情况: 两个集群都使用了证书加密传输,要实现互联,需要重新设置证书,还要重启集群; 两个集群之间可能网络不能互通; 到了这里,我们的 极限网关 就派的上用场了。在以上场景中,只要网关能顺利连接到各个集群就行了。 话不多说,我们来 demo 一下。 数据准备 # 集群 A,含有 test 和 test-2 索引,数据很简单。 集群 B,含有 test-follower 和 test-3 索引,其中 test-follower 索引是集群 A 的 复制索引。 网关配置 # 网关配置使用专门的 merge_cross_search_results 配置。 做个简单的演示,只需修改这三个变量。 LR_ELASTICSEARCH_ENDPOINT1 : 代表集群 A ; LR_ELASTICSEARCH_ENDPOINT2 : 代表集群 B ; LR_ELASTICSEARCH_ENDPOINT3 : 代表默认集群,可以复用集群 A 或 B ; 集群 A 和 B 是我们要做跨集群搜索的,搜索请求会在这两个集群执行,然后合并结果。 非搜索请求会发送到这个 LR_ELASTICSEARCH_ENDPOINT3 指定的集群,但是 _cat/indices?" --- 使用 ES 的小伙伴,有没有在用跨集群搜索的? 熟悉 ES 的小伙伴都知道,ES 本身就能实现跨集群搜索,那为啥还要聊这个?试想一下,如果集群都上线投产了,才出现跨集群搜索需求,那么可能出现两种情况: 1. 两个集群都使用了证书加密传输,要实现互联,需要重新设置证书,还要重启集群; 2. 两个集群之间可能网络不能互通; 到了这里,我们的 [极限网关](/products/gateway/) 就派的上用场了。在以上场景中,只要网关能顺利连接到各个集群就行了。 话不多说,我们来 demo 一下。 ## 数据准备 集群 A,含有 test 和 test-2 索引,数据很简单。 {{% load-img "/img/blog/2024/infini-gateway-cross-cluster-search/1.png" "" %}} 集群 B,含有 test-follower 和 test-3 索引,其中 test-follower 索引是集群 A 的[复制索引](https://docs.infinilabs.com/easysearch/main/docs/references/management/ccr_api/)。 {{% load-img "/img/blog/2024/infini-gateway-cross-cluster-search/2.png" "" %}} ## 网关配置 网关配置使用专门的 [merge_cross_search_results](https://github.com/infinilabs/testing/blob/main/setup/gateway/cases/transform/merge_cross_search_results/gateway.yml) 配置。 {{% load-img "/img/blog/2024/infini-gateway-cross-cluster-search/3.png" "" %}} 做个简单的演示,只需修改这三个变量。 - LR_ELASTICSEARCH_ENDPOINT1 : 代表集群 A ; - LR_ELASTICSEARCH_ENDPOINT2 : 代表集群 B ; - LR_ELASTICSEARCH_ENDPOINT3 : 代表默认集群,可以复用集群 A 或 B ; 集群 A 和 B 是我们要做跨集群搜索的,搜索请求会在这两个集群执行,然后合并结果。 非搜索请求会发送到这个 LR_ELASTICSEARCH_ENDPOINT3 指定的集群,但是 \_cat/indices?format=json 会显示集群 A 和 B 的索引。 ## 跨集群搜索 ### 测试一 通配符 test\* 查询集群 A 和 B ,所有数据,注意查询语法,必须包含冒号。 {{% load-img "/img/blog/2024/infini-gateway-cross-cluster-search/4.png" "" %}} 结果包含了集群 A 的索引:test 和 test-2 ,以及集群 B 的索引:test-follower 和 test-3 。 ### 测试二 通配符 test\* 查询集群 A 和 B ,包含关键字 cluster 的内容。 {{% load-img "/img/blog/2024/infini-gateway-cross-cluster-search/5.png" "" %}} ### 测试三 通配符 test\* 查询集群 A 和 B ,进行聚合查询。 {{% load-img "/img/blog/2024/infini-gateway-cross-cluster-search/6.png" "" %}} ### 测试四 通配符 test\* 查询集群 A 和 B ,进行带查询条件的聚合查询。 {{% load-img "/img/blog/2024/infini-gateway-cross-cluster-search/7.png" "" %}} ### 测试五 显示集群 A 和 B 的所有索引。 {{% load-img "/img/blog/2024/infini-gateway-cross-cluster-search/8.png" "" %}} ## 最后 这次的分享就到这里了,相信大家也看到了极限网关是非常灵活的。欢迎与我一起交流 ES 的各种问题和解决方案。 {{% load-img "/img/blog/banner/about_yangf.png" "" %}}