乐趣区

ElasticSearch跨集群搜索

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. 从每个群集收集结果后,协调节点将在跨群集搜索响应中返回最终结果。

附录

  • 阿凡卢博客
  • 官方文档
退出移动版