ElasticSearch跨集群搜索

Java基础

浏览数:186

2019-9-7

ElasticSearch跨集群搜索

水平扩展痛点

当水平扩展时,节点数不能无限增加。

因为当集群的meta信息(节点,索引,集群状态)过多,会导致更新压力变大。

单个Active Master会成为性能瓶颈,导致整个集群无法正常工作。

跨集群搜索Cross Cluster Search

早期版本是通过Tribe Node实现多集群访问需求,但存在一定问题,现已经被Deprecated。

5.3版本引入跨集群搜索功能。

它允许任何节点扮演federated节点,以轻量的方式,将搜索请求进行代理。不需要以Client Node的形式加入到其他集群。

实现跨集群搜索

  1. 启动多个集群

    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
  2. 在每个集群上执行以下命令,配置信息

    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"
              ]
            }
          }
        }
      }
    }
  3. 创建一些测试数据

    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}'
  4. 查询

    GET /users,cluster1:users,cluster2:users/_search
    {
      "query": {
        "range": {
          "age": {
            "gte": 20,
            "lte": 40
          }
        }
      }
    }

跨集群搜索工作原理

  • 最小化网络往返

    最小化网络往返默认情况下,Elasticsearch会减少远程群集之间的网络往返次数。这减少了网络延迟对搜索速度的影响。但是,Elasticsearch无法减少大型搜索请求的网络往返,例如包括滚动或内部命中的搜索请求。

  • 不要最小化网络往返
    对于包含滚动或内部命中的搜索请求,Elasticsearch会向每个远程群集发送多个传出和进入请求。您还可以通过将搜索API的ccs_minimize_roundtrips参数设置为false来选择此选项。虽然通常较慢,但这种方法可能适用于低延迟的网络。

最小化网络往返工作原理

  1. 您将跨群集搜索请求发送到本地群集。该集群中的协调节点接收并解析该请求。

  2. 协调节点向每个群集发送单个搜索请求,包括其自己的群集。每个群集独立执行搜索请求。

  3. 每个远程集群将其搜索结果发送回协调节点

  4. 从每个群集收集结果后,协调节点将在跨群集搜索响应中返回最终结果。

不要最小化网络往返

  1. 您将跨群集搜索请求发送到本地群集。该集群中的协调节点接收并解析该请求。

  2. 协调节点向每个远程集群发送搜索分片API请求。

  3. 每个远程集群将其响应发送回协调节点。此响应包含有关将在其上执行跨群集搜索请求的索引和分片的信息。

  4. 协调节点向每个分片发送搜索请求,包括其自己的群集中的分片。每个分片都独立执行搜索请求。

  5. 每个分片都将其搜索结果发送回协调节点。

  6. 从每个群集收集结果后,协调节点将在跨群集搜索响应中返回最终结果。

附录

作者:小鸡