ElasticSearch跨集群搜索

2

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. 您将跨群集搜索请求发送到本地群集。该集群中的协调节点接收并解析该请求。

    clipboard.png

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

    clipboard.png

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

    clipboard.png

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

    clipboard.png

不要最小化网络往返

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

    clipboard.png

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

    clipboard.png

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

    clipboard.png

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

    clipboard.png

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

    clipboard.png

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

    clipboard.png

附录


如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

载入中...