ES 远端集群配置与跨集群搜索

ES 中可以配置远程集群实现跨集群的搜索,极大的提高了 ES 集群的水平扩展性,跨集群搜索也是 ES 认证考试中经常考的知识点。本篇文章简单总结下 ES 远端集群的配置和跨集群搜索作为备忘,也希望对需要的同学有所帮助。

一. 配置远端集群

为了实现跨集群搜索首先需在当前集群中配置远端集群,我们可以通过下面三种方式配置:

1. 配置文件设置

首先可以在 ElasticSearch 的 yml 配置文件中设置,ES 启动时就会建立与远端集群的链接,配置如下:

cluster:
    remote:
        cluster_one: 
            seeds: 127.0.0.1:9300
            transport.ping_schedule: 30s 
        cluster_two:
            seeds: 127.0.0.1:9301
            transport.compress: true 
            skip_unavailable: true 

配置说明

  • cluster_one:自定义的集群名称
  • seeds:集群的节点列表,可以配置多个
  • transport.ping_schedule: 设置发送 ping 请求检测连接状态的时间间隔
  • skip_unavailable:跨集群搜索是否跳过不可用集群

2. ES 请求设置

除了配置文件外,还可以通过 ES 请求的方式设置远程集群,这也是比较推荐的一种方式,API 如下:

1. CURL 请求

curl -XPUT "http://localhost:9202/_cluster/settings" -H 'Content-Type: application/json' -d'
{"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"]}}}}}

2. ES DSL 命令

PUT _cluster/settings
{
  "persistent": {
    "cluster": {
      "remote": {
        "cluster_one": {
          "seeds": [
            "127.0.0.1:9300"
          ],
          "transport.ping_schedule": "60s"
        },
        "cluster_two": {
          "mode": "sniff",
          "seeds": [
            "127.0.0.1:9301"
          ],
          "transport.compress": false
        },
        "cluster_three": {
          "mode": "proxy",
          "proxy_address": "127.0.0.1:9302",
          "transport.compress": true
        }
      }
    }
  }
}

3. Kibana Management 添加

除了上面两种方式外,我们还可以在 Kibana 管理界面 Management -> Remote clusters 中进行配置,步骤如图所示:
ES 远端集群配置与跨集群搜索_第1张图片

上面图中已经有两个配置了,我在添加一个新的集群如下:
ES 远端集群配置与跨集群搜索_第2张图片

现在三个远端集群就配置好了,如图

ES 远端集群配置与跨集群搜索_第3张图片

配置完成后可以通过下面的 API 查询:


GET _remote/info

{
  "cluster1" : {
    "seeds" : [
      "127.0.0.1:9301"
    ],
    "connected" : true,
    "num_nodes_connected" : 1,
    "max_connections_per_cluster" : 3,
    "initial_connect_timeout" : "30s",
    "skip_unavailable" : true
  },
  "cluster0" : {
    "seeds" : [
      "127.0.0.1:9300"
    ],
    "connected" : true,
    "num_nodes_connected" : 1,
    "max_connections_per_cluster" : 3,
    "initial_connect_timeout" : "30s",
    "skip_unavailable" : false
  },
  "cluster2" : {
    "seeds" : [
      "127.0.0.1:9301"
    ],
    "connected" : true,
    "num_nodes_connected" : 1,
    "max_connections_per_cluster" : 3,
    "initial_connect_timeout" : "30s",
    "skip_unavailable" : true
  }
}

4. 删除远端集群

如果某个远端集群不再需要了,可以通过 Kibana 界面或者下面的命令进行删除:

PUT _cluster/settings
{
  "persistent": {
    "cluster": {
      "remote": {
        "cluster_two": { 
          "seeds": null,
          "skip_unavailable": null,
          "transport": {
            "compress": null
          }
        }
      }
    }
  }
}

二. 跨集群搜索

远端集群配置完成后就可以进行跨集群搜索了,API 非常简单,就是在 Search 请求中指定对应的集群和索引即可。

1. 搜索本地集群

直接指定索引名默认搜索的就是 local 集群。

GET /twitter/_search
{
  "query": {
    "match": {
      "user": "kimchy"
    }
  }
}

2. 在指定单个集群中搜索

对于远端集群需要采用 集群名称:索引名的方式指定。

# 在 cluster_one 远端集群中搜索
GET /cluster_one:twitter/_search
{
  "query": {
    "match": {
      "user": "kimchy"
    }
  }
}

3. 在多个集群中实现跨集群搜索

# 在 local、clustr_one、cluster_two 三个集群中搜索
GET /twitter,cluster_one:twitter,cluster_two:twitter/_search
{
  "query": {
    "match": {
      "user": "kimchy"
    }
  }
}

三. ES 跨集群搜索过程

ES 跨集群搜索模式主要有 Minimize network roundtripsDon’t minimize network roundtrips两种方式。两者主要区别在于执行搜索时发送请求的数量:

Minimize network roundtrips 模式

Coordinating 节点收到跨集群请求后,会在每个要搜索的集群中选择一个节点,然后发送搜索请求,收到搜索结果后聚合返回。

过程如下:

【1】接收客户端请求

ES 远端集群配置与跨集群搜索_第4张图片

【2】请求集群

ES 远端集群配置与跨集群搜索_第5张图片

【3】接收各个集群的查询结构

ES 远端集群配置与跨集群搜索_第6张图片

【4】聚合后返回查询结果

ES 远端集群配置与跨集群搜索_第7张图片

Don’t minimize network roundtrips

该模式下,Coordinating 节点收到跨集群请求后, 首先会向各个集群发送一个查询分片的请求,查询各个集群中可用于数据查询的分片信息,然后在向各个分片发送搜索请求,最后将查询结果聚合返回。

具体过程如下:

【1】客户端接收请求

ES 远端集群配置与跨集群搜索_第8张图片

【2】查询各集群分片

ES 远端集群配置与跨集群搜索_第9张图片

接收分片查询结果
ES 远端集群配置与跨集群搜索_第10张图片

【3】向各个分片发送查询请求

ES 远端集群配置与跨集群搜索_第11张图片

【4】接收各个分片的请求结果

ES 远端集群配置与跨集群搜索_第12张图片

【5】聚合结果并返回

ES 远端集群配置与跨集群搜索_第13张图片


老铁都看到这了来一波点赞、评论、关注三连可好

我是 AhriJ邹同学,前后端、小程序、DevOps 都搞的炸栈工程师。博客持续更新,如果觉得写的不错,欢迎来一波老铁三连,不好的话也欢迎指正,互相学习,共同进步。

你可能感兴趣的:(ELK)