Elasticsearch之集群,本地搭建集群

概述

  在Elasticsearch中,一个节点就是es对象,而一个集群(cluster)是由一个或者多个节点构成,它们具有相同的集群名字,相互协同工作,分享数据和负载的能力,如果有新的节点加入或者被删除掉,集群会自动感知到并且还能够平衡数据。

  若构建高可用和扩展的系统,可扩展的方式:纵向扩展(买更好的机器),横向扩展(买更多的机器,推荐),这样如果单点挂掉其它的也可用,也就证实了集群的高可用特性。

集群中加节点

  广播形式(一直ping)  特点:不可控

    在本地单独的目录复制elasticsearch,再启动bin目录的bat文件

1 http://127.0.0.1:9200/_cluster/health

  可以看出节点数为2并且状态为green

    单播形式(理想模式,可控性比较高)

    流程图:

    

主节点的选取:

  在集群中节点发生改变,各个节点就会协商谁成为主节点。在配置文件设置主节点

discovery.zen.minimum_master_nodes: 2

  如果节点总节点数为3,一般配置3/2 + 1   防止脑裂 

防止脑裂

脑裂通常是在重负载中出现,就是集群中其它的节点与主节点失去通信称脑裂,这样就得设置节点总数,比如说现在节点总数为5个

防止脑裂的方法

1 discovery.zen.minimum_master_nodes: 3  # 3 = 5/2 +1

  如图所示: 集群主节点为node1,由于网络负载等问题,原来集群被分成两个,分别由node1/2和node3/4/5但是我们设置参数最小节点要超过3才能组成新的集群,所以只能node3/4/5才能组成新的集群,node1/2只能网络负载恢复之后,寻求node3/4/5才能加入该集群中,此时我们还需设置node_master参数,方便新的集群选取主节点。

错误识别

主节点被确定之后,内部的ping机制来识别其它的节点是否还存活,是否处于健康,在ping的时候我们也可以进行参数设置

1 discovery.zen.fd.ping_interval: 1  # 每个节点隔1s发送一个ping请求
2 discovery.zen.fd.ping_timeout: 30 # 最多等待30s
3 discovery_zen.fd.ping_retries: 3    # 最多尝试3次 如果没回应此节点被认为失联

本地搭建总节点数为3的单播集群

  配置单播发现

节点1的配置

1 cluster.name: my_escluster  # 集群名字
2 node.name: node1              # 节点1
3 network.host: 127.0.0.1      # ip
4 http.port: 9200                   # 本地监听端口9200
5 transport.tcp.port: 9300      # 集群监听端口9300    
6 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9302", "127.0.0.1:9304"]    # 允许的ip:端口组成集群

节点2的配置

1 cluster.name: my_escluster
2 node.name: node2
3 network.host: 127.0.0.1
4 http.port: 9202
5 transport.tcp.port: 9302
6 node.master: true     #可以权限成为主节点
7 node.data: true         #读写磁盘
8 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9302", "127.0.0.1:9304"]

节点3的配置

1 cluster.name: my_escluster
2 node.name: node3
3 network.host: 127.0.0.1
4 http.port: 9204
5 transport.tcp.port: 9304
6 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300", "127.0.0.1:9302", "127.0.0.1:9304"]

搭建成功

  在上图中可以发现,此集群中有三个节点,并且处于green状态,再看节点信息,node1成为了主节点,因为我先启动的node1,总的分片数为6

再探集群      

   当打开一个单点的node1,此时没有数据和索引,name这个集群就为空集群

  集群健康信息查询

1 GET cluster/health  # 在kibana的Dev Tools中查询
2 http://127.0.0.1:9200/_cluster/health?pretty    # 浏览器中输入

  返回结果如下

 1 {
 2   "cluster_name" : "my_escluster",
 3   "status" : "green",
 4   "timed_out" : false,
 5   "number_of_nodes" : 1,
 6   "number_of_data_nodes" : 1,
 7   "active_primary_shards" : 3,
 8   "active_shards" : 3,
 9   "relocating_shards" : 0,
10   "initializing_shards" : 0,
11   "unassigned_shards" : 0,
12   "delayed_unassigned_shards" : 0,
13   "number_of_pending_tasks" : 0,
14   "number_of_in_flight_fetch" : 0,
15   "task_max_waiting_in_queue_millis" : 0,
16   "active_shards_percent_as_number" : 100.0
17

  可以看到集群名称,健康状态,超时,节点,是否权限可存储等信息

健康状态

颜色 描述
green 所有主要分片和复制分片都可用
yellow 所有主要分片可用,但不是所有复制分片都可用
red 不是所有的主要分片都可用

一个分片是最小级别的工作单元,一个分片只是保存索引中所有数据的一部分

分片分为主分片和复制分片 主分片数量级固定,复制分片的数量可以进行调整

复制分片是主分片的一个副本,防止数据丢失

  此时添加索引

PUT blogs
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}

  分配3个分片,默认为5,一个复制分片,默认情况下(每个主分片都有一个复制分片)

  查看健康状态

{
  "cluster_name" : "my_escluster",
  "status" : "yellow",
  "timed_out" : false,
  "number_of_nodes" : 1,
  "number_of_data_nodes" : 1,
  "active_primary_shards" : 6,
  "active_shards" : 6,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 3,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 66.66666666666666
}

  此时状态为yellow,主分片正常,复制分片还没有全部可用,复制分片处于unassigned状态,还没有分配节点。如果保存在同一个节点上,那么节点挂掉,数据将丢失。

添加更多的节点  承担数据丢失的风险,此时三个复制分片已经被分配,保证数据的完整性

(存储在主分片中的数据,然后并发复制到对应的复制分片上了)

此时再查看下状态

{
  "cluster_name" : "my_escluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 2,
  "number_of_data_nodes" : 2,
  "active_primary_shards" : 6,
  "active_shards" : 12,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

继续扩展

  现在可以看到越来越多的节点获取到资源了 都进行了对资源的分配,通过命令查看信息

1 GET _cluster/state/master_node,nodes?pretty    # 返回所有节点
2 GET _cluster/state/master_node,node?pretty     # 返回当前主节点的信息
3 GET _nodes  # 返回所有节点列表

  主节点挂掉的情况

  此时node2节点成为主节点

1 node.master: false     # 该节点是否可以被选举为主节点,默认为true
2 node.data: true        # 该节点是否有存储权限,默认为true

  停用节点可以通过命令

PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.exclude._ip": "192.168.1.1"
  }
}

  如果被停用 该节点上的全部分片转移到其他的节点上 ,并且这个设置是暂时的,集群重启后不再有效。

猜你喜欢

转载自www.cnblogs.com/Alexephor/p/11411369.html