ES 中可以配置远程集群实现跨集群的搜索,极大的提高了 ES 集群的水平扩展性,跨集群搜索也是 ES 认证考试中经常考的知识点。本篇文章简单总结下 ES 远端集群的配置和跨集群搜索作为备忘,也希望对需要的同学有所帮助。
为了实现跨集群搜索首先需在当前集群中配置远端集群,我们可以通过下面三种方式配置:
首先可以在 ElasticSearch 的 yml 配置文件中设置,ES 启动时就会建立与远端集群的链接,配置如下:
cluster:
remote:
cluster_one:
seeds: 127.0.0.1:9300
transport.ping_schedule: 30s
cluster_two:
seeds: 127.0.0.1:9301
transport.compress: true
skip_unavailable: true
cluster_one
:自定义的集群名称seeds
:集群的节点列表,可以配置多个transport.ping_schedule
: 设置发送 ping 请求检测连接状态的时间间隔skip_unavailable
:跨集群搜索是否跳过不可用集群除了配置文件外,还可以通过 ES 请求的方式设置远程集群,这也是比较推荐的一种方式,API 如下:
1. CURL 请求
curl -XPUT "http://localhost:9202/_cluster/settings" -H 'Content-Type: application/json' -d'
{"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"]}}}}}
2. ES DSL 命令
PUT _cluster/settings
{
"persistent": {
"cluster": {
"remote": {
"cluster_one": {
"seeds": [
"127.0.0.1:9300"
],
"transport.ping_schedule": "60s"
},
"cluster_two": {
"mode": "sniff",
"seeds": [
"127.0.0.1:9301"
],
"transport.compress": false
},
"cluster_three": {
"mode": "proxy",
"proxy_address": "127.0.0.1:9302",
"transport.compress": true
}
}
}
}
}
除了上面两种方式外,我们还可以在 Kibana 管理界面 Management -> Remote clusters
中进行配置,步骤如图所示:
现在三个远端集群就配置好了,如图
配置完成后可以通过下面的 API 查询:
GET _remote/info
{
"cluster1" : {
"seeds" : [
"127.0.0.1:9301"
],
"connected" : true,
"num_nodes_connected" : 1,
"max_connections_per_cluster" : 3,
"initial_connect_timeout" : "30s",
"skip_unavailable" : true
},
"cluster0" : {
"seeds" : [
"127.0.0.1:9300"
],
"connected" : true,
"num_nodes_connected" : 1,
"max_connections_per_cluster" : 3,
"initial_connect_timeout" : "30s",
"skip_unavailable" : false
},
"cluster2" : {
"seeds" : [
"127.0.0.1:9301"
],
"connected" : true,
"num_nodes_connected" : 1,
"max_connections_per_cluster" : 3,
"initial_connect_timeout" : "30s",
"skip_unavailable" : true
}
}
如果某个远端集群不再需要了,可以通过 Kibana 界面或者下面的命令进行删除:
PUT _cluster/settings
{
"persistent": {
"cluster": {
"remote": {
"cluster_two": {
"seeds": null,
"skip_unavailable": null,
"transport": {
"compress": null
}
}
}
}
}
}
远端集群配置完成后就可以进行跨集群搜索了,API 非常简单,就是在 Search 请求中指定对应的集群和索引即可。
1. 搜索本地集群
直接指定索引名默认搜索的就是 local 集群。
GET /twitter/_search
{
"query": {
"match": {
"user": "kimchy"
}
}
}
2. 在指定单个集群中搜索
对于远端集群需要采用 集群名称:索引名
的方式指定。
# 在 cluster_one 远端集群中搜索
GET /cluster_one:twitter/_search
{
"query": {
"match": {
"user": "kimchy"
}
}
}
3. 在多个集群中实现跨集群搜索
# 在 local、clustr_one、cluster_two 三个集群中搜索
GET /twitter,cluster_one:twitter,cluster_two:twitter/_search
{
"query": {
"match": {
"user": "kimchy"
}
}
}
ES 跨集群搜索模式主要有 Minimize network roundtrips
和 Don’t minimize network roundtrips
两种方式。两者主要区别在于执行搜索时发送请求的数量:
Coordinating 节点收到跨集群请求后,会在每个要搜索的集群中选择一个节点,然后发送搜索请求,收到搜索结果后聚合返回。
过程如下:
该模式下,Coordinating 节点收到跨集群请求后, 首先会向各个集群发送一个查询分片的请求,查询各个集群中可用于数据查询的分片信息,然后在向各个分片发送搜索请求,最后将查询结果聚合返回。
具体过程如下:
老铁都看到这了来一波点赞、评论、关注三连可好
我是 AhriJ邹同学,前后端、小程序、DevOps 都搞的炸栈工程师。博客持续更新,如果觉得写的不错,欢迎来一波老铁三连,不好的话也欢迎指正,互相学习,共同进步。