持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
跨集群检索,英文为 Cross cluster search, 顾名思义就是多个 ES 集群之间可以进行某种规定进行一起检索。比如有个ES 集群为 A,一个集群为B,那么当搜索某个词时,可以达到两个集群一起搜索效果。
1. 跨集群检索解决的问题
-
水平扩展的痛点
-
单集群时,水平扩展时,节点不能无限增加。当集群的meta信息(节点,索引,状态过多),会导致更新压力变大,单个active master 会性能瓶颈
-
早期使用 tribe node 可以实现多集群访问需求,问题很多,5.3后废弃
2. Cross cluster search
- 允许任何节点扮演 federated 节点,以轻量的方式,将搜索请求进行代理
- 不需要于client node 的形式加入其他集群
3.跨集群搜索的实践
- 搭建环境
- 配置跨集群所需条件
- 验证跨集群搜索功能
3.1 环境准备
- 启动 3 个集群
bin/elasticsearch -E node.name=node1 -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=node2 -E cluster.name=cluster2 -E path.data=cluster2_data
-E discovery.type=single-node -E http.port=9202 -E transport.port=9302
bin/elasticsearch -E node.name=node3 -E cluster.name=cluster3 -E path.data=cluster3_data
-E discovery.type=single-node -E http.port=9203 -E transport.port=9303
3.2 跨集群配置
配置 3个集群之间可进行通信。
curl -XPUT "http://localhost:9200/_cluster/settings" -H 'Content-Type: application/json' -d'
{
"persistent": {
"cluster": {
"remote":{
"cluster1":{
"seeds": ["127.0.0.1:9300"],
"transport.ping_schedule": "30s"
},
"cluster2":{
"seeds": ["127.0.0.1:9301"],
"transport.ping_schedule": "30s"
},
"cluster3":{
"seeds": ["127.0.0.1:9302"],
"transport.ping_schedule": "30s"
}
}
}
}
}'
3.3 跨集群搜索准备
- 测试数据添加
curl -XPOST "http://localhost:9200/users/_doc" -H 'Content-Type: application/json' -d'
{
"name":"user1",
"age": 10
}'
- 进行跨集群搜索验证
- 搜索各个集群年龄在 12 到 20 的数据:
curl -XGET "http://localhost:9200/users,cluster2:users,cluster3:users/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"range": {
"age": {
"gte": 12,
"lte": 20
}
}
}
}'
注: cluster2:users ,指定 集群名称:索引名 结果:
{
"took" : 9,
"timed_out" : false,
"num_reduce_phases" : 4,
"_shards" : {
"total" : 3,
"successful" : 3,
"skipped" : 0,
"failed" : 0
},
"_clusters" : {
"total" : 3,
"successful" : 3,
"skipped" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "cluster3:users",
"_type" : "_doc",
"_id" : "EhvosXIB7WK0hbqIrASF",
"_score" : 1.0,
"_source" : {
"name" : "user3",
"age" : 18
}
},
{
"_index" : "cluster2:users",
"_type" : "_doc",
"_id" : "9-fosXIB2XuCDAm_O7Jb",
"_score" : 1.0,
"_source" : {
"name" : "user2",
"age" : 15
}
}
]
}
}
4. 扩展
-
默认情况下,当有个集群不可用时,跨集群查询会失败。
-
可以设置跳过失败的集群,当集群失败,直接不查失败的集群
PUT _cluster/settings
{
"persistent": {
"cluster.remote.cluster_two.skip_unavailable": true
}
}
-
各个集群都安装在不同的服务器,跨集群搜索是会有网络延迟的。会造成慢查询。es 提供两个参数
总结
Elasticsearch 提供的跨集群搜索功能十分强大,大家可以多多尝试,实践一波,本篇文章以 ES中 7.2版本搭建。