ES之跨集群检索 Cross cluster search

486 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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
  }
}

总结

Elasticsearch 提供的跨集群搜索功能十分强大,大家可以多多尝试,实践一波,本篇文章以 ES中 7.2版本搭建。

相关阅读

ES 官方文档