ElasticSearch 跨集群搜索
水平扩展痛点
当水平扩展时,节点数不能无限增加。
因为当集群的 meta 信息(节点,索引,集群状态)过多,会导致更新压力变大。
单个 Active Master 会成为性能瓶颈,导致整个集群无法正常工作。
跨集群搜索 Cross Cluster Search
早期版本是通过 Tribe Node 实现多集群访问需求,但存在一定问题,现已经被 Deprecated。
5.3 版本引入跨集群搜索功能。
它允许任何节点扮演 federated 节点,以轻量的方式,将搜索请求进行代理。不需要以 Client Node 的形式加入到其他集群。
实现跨集群搜索
-
启动多个集群
bin/elasticsearch -E node.name=cluster0node -E cluster.name=cluster0 -E path.data=cluster0_data -E discovery.type=single-node -E http.port=9200 -E transport.port=9300 bin/elasticsearch -E node.name=cluster1node -E cluster.name=cluster1 -E path.data=cluster1_data -E discovery.type=single-node -E http.port=9201 -E transport.port=9301 bin/elasticsearch -E node.name=cluster2node -E cluster.name=cluster2 -E path.data=cluster2_data -E discovery.type=single-node -E http.port=9202 -E transport.port=9302
-
在每个集群上执行以下命令,配置信息
PUT _cluster/settings { "persistent": { "cluster": { "remote": { "cluster0": { "seeds": ["127.0.0.1:9300"], "transport.ping_schedule": "30s" }, "cluster1": { "seeds": ["127.0.0.1:9301"], "transport.compress": true, "skip_unavailable": true }, "cluster2": { "seeds": ["127.0.0.1:9302"] } } } } }
-
创建一些测试数据
curl -XPOST "http://localhost:9200/users/_doc" -H 'Content-Type: application/json' -d'{"name":"user1","age":10}' curl -XPOST "http://localhost:9201/users/_doc" -H 'Content-Type: application/json' -d'{"name":"user2","age":20}' curl -XPOST "http://localhost:9202/users/_doc" -H 'Content-Type: application/json' -d'{"name":"user3","age":30}'
-
查询
GET /users,cluster1:users,cluster2:users/_search { "query": { "range": { "age": { "gte": 20, "lte": 40 } } } }
跨集群搜索工作原理
- 最小化网络往返
最小化网络往返默认情况下,Elasticsearch 会减少远程群集之间的网络往返次数。这减少了网络延迟对搜索速度的影响。但是,Elasticsearch 无法减少大型搜索请求的网络往返,例如包括滚动或内部命中的搜索请求。
- 不要最小化网络往返
对于包含滚动或内部命中的搜索请求,Elasticsearch 会向每个远程群集发送多个传出和进入请求。您还可以通过将搜索 API 的 ccs_minimize_roundtrips 参数设置为 false 来选择此选项。虽然通常较慢,但这种方法可能适用于低延迟的网络。
最小化网络往返工作原理
- 您将跨群集搜索请求发送到本地群集。该集群中的协调节点接收并解析该请求。
- 协调节点向每个群集发送单个搜索请求,包括其自己的群集。每个群集独立执行搜索请求。
- 每个远程集群将其搜索结果发送回协调节点
- 从每个群集收集结果后,协调节点将在跨群集搜索响应中返回最终结果。
不要最小化网络往返
- 您将跨群集搜索请求发送到本地群集。该集群中的协调节点接收并解析该请求。
- 协调节点向每个远程集群发送搜索分片 API 请求。
- 每个远程集群将其响应发送回协调节点。此响应包含有关将在其上执行跨群集搜索请求的索引和分片的信息。
- 协调节点向每个分片发送搜索请求,包括其自己的群集中的分片。每个分片都独立执行搜索请求。
- 每个分片都将其搜索结果发送回协调节点。
- 从每个群集收集结果后,协调节点将在跨群集搜索响应中返回最终结果。
附录
- 阿凡卢博客
- 官方文档