Elasticsearch集群

目录

一、集群原理

1.1 单节点 

1.2 集群健康

1.3 分片

1.4 新增节点 

1.5 水平扩容-启动第三个节点 

1.6 应对故障 

二、集群概念

2.1 主节点

2.2 候选主节点

2.3 数据节点

2.4 客户端节点

2.5 脑裂现象

2.5.1 脑裂现象成因

2.5.2 脑裂现象解决方案 

三、集群搭建

3.1 集群结构

3.2 集群配置

3.2.1 master配置

3.2.2 data配置


一、集群原理

  • elasticsearch是天生支持集群的,不需要依赖其它服务发现和注册组件,因为它内置了一个名字叫ZenDiscovery的模块,是elasticsearch自己实现的一套用于节点发现和选主等功能的组件,所以elasticsearch做起集群来非常简单,不需要太多额外的配置和安装额外的第三方组件。

1.1 单节点 

Elasticsearch集群_第1张图片 

  • 一个运行中的Elasticsearch实例称为一个节点,而集群是由一个或者多个拥有相同cluster.name配置的节点组成。它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分配所有的数据。
  • 当一个节点被选举为主节点时,它将负责管理集群范围内所有的变更,例如增加、删除索引,或者增加删除节点等。而主节点并不需要涉及到文档级别的变更和搜索等操作。所以当集群只拥有一个主节点的情况下,即使流量的增加它也不会成为瓶颈。
  • 作为用户,我们可以将请求发送到集群中任何节点,包括主节点。每个节点都知道文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并最终将结果返回给客户端。Elasticsearch对于这一切的管理都是透明的。

1.2 集群健康

  • Elasticsearch的集群监控信息中包含了许多的统计数据,其中最为重要的一项就是集群健康,它在status字段中展示为 green、yellow、red。单节点集群,集群健康默认yellow。
  1. green:所有的主分片和副本分片都是正常运行。
  2. yellow:所有的主分片都是正常运行,但不是所有的副本分片都正常运行。
  3. red:有主分片没有正常运行。
GET /_cluster/health

1.3 分片

  • 一个分片是一个底层的工作单位,它不仅保存了全部数据中的一部分数据。我们的文档被存储和索引到分片内,但是应用程序是直接与索引而不是与分片进行交互。分片就认为是一个数据区。
  • 一个分片可以使主分片或者副本分片。索引内任意一个文档都归属于一个主分片,所有主分片的数目决定着索引能够保存的最大数据量。
  • 在索引建立的时候就已经确定了主分片数,但是副本分片数可以随时修改。
  • 单节点集群内创建名为 blogs 的索引。索引默认情况下会被分配5个主分片。我们分配3个主分片和一份副本(每个主分片拥有一个副本分片)
PUT /blogs{
    "settings" : {
        "number_of_shards" : 3,
        "number_of_replicas" : 1
    }
}

Elasticsearch集群_第2张图片

此时集群是正常运行的,健康状态为yellow,表示全部主分片正常运行(集群可以正常服务所有请求),但是副本分片没有全部处于正常运行状态。在同一个节点上既保存原始数据有保存副本数据是没有意义的,因为一旦节点宕机,我们也将丢失该节点所有数据。 

1.4 新增节点 

  • 在同一台机器上启动第二个节点,只要它和第一个节点拥有同样的cluster.name配置,它就会自动发现并加入集群。在不同机器上启动,为了加入集群,需要配置一个可连接到的单播主机列表。

Elasticsearch集群_第3张图片 

  • 此时集群健康状态为green,表示所有分片(3个主分片和3个副本分片)都正常运行。 

1.5 水平扩容-启动第三个节点 

Elasticsearch集群_第4张图片 

  • Node1 和 Node2 上各有一个分片被迁移到新增 Node3,现在每个节点都拥有2个分片。这表示每个节点的硬件资源(CPU、RAM、I/O)将被更少的分片分享,每个分片的性能将会得到提升。 
  • 运行中的集群是可以动态调整副本分片数目的,我们可以按需伸缩集群。
  • 将blogs索引副本数修改为2
PUT /blogs/_settings
{
    "number_of_replicas" : 2
}

 Elasticsearch集群_第5张图片

  • blogs索引现在拥有9个分片,3个主分片和6个副本分片。这意味着如果我们将集群扩展到9个节点,每个节点上一个分片,相比原来3个节点,集群搜索性能可以提升3倍。 

1.6 应对故障 

Elasticsearch集群_第6张图片 

  • 关闭主节点,而集群必须拥有一个节点老保证正常工作,所以发生的第一件事情就是选举一个新的主节点:Node2。
  • 关闭Node1的同时也失去主分片1和2,并且在缺失主分片的时候索引也不能正常工作。如果此时检查集群健康状况,健康状况为red(不是所有的主分片都正常运行)。
  • 其它节点上存在着这两个主分片的完整副本,所以新的主节点立即将这些分片在Node2和Node3上对应的副本分片提升为主分片,这时集群健康状况将为yellow,这个提升主分片的过程是瞬时间发生的。
  • 集群健康状况为yellow的原因是我们设置了副本数为2,现在只有一份副本。即使我们同样关闭了Node2,程序依然可以保持在不丢失数据的情况下运行,因为Node3为每一个分片还保留着一份副本。
  • 如果我们重启Node1,集群可以将缺失的副本分片再次进行分配,如果Node1依然拥有着之前的分片,它将尝试去重用它们,同时又从主分片复制发生了修改的数据文件。

二、集群概念

2.1 主节点

  • 主节点复制创建索引、删除索引,分配分片、追踪集群中的节点状态等工作。Elasticsearch中主节点的工作量相对较轻,用户的请求可以发往集群中任何一个节点,由该节点复制分发和返回结果,而不需要经过主节点转发。主节点是由候选主节点通过ZenDiscovery机制选举出来的,所以想成为主节点,首先成为候选主节点。

2.2 候选主节点

  • 在Elasticsearch集群初始化或者主节点宕机的情况下,由候选主节点选举其中一个作为主节点。
  • 指定候选主节点的配置。
node.master:true

2.3 数据节点

  • 数据节点负责数据的存储和相关操作,比如CURD、搜索、聚合。所以数据节点对机器配置要求比较高。首先需要有足够的磁盘空间来存储数据,其次数据操作对系统CPU、Memory和IO的性能消耗很大。随着集群的扩大,需要增加更多的数据节点来提高可用性。
  • 指定数据节点配置。
node.data:true
  • Elasticsearch是运行一个节点既做主节点也做数据节点的,但是数据节点的负载比较重,所以需要考虑将二者分离开,设置专用的候选主节点和数据节点,避免因数据节点负载重导致主节点不影响。

2.4 客户端节点

  • 客户端节点就是既不做候选主节点也不做数据节点的节点,只负责请求的分发、汇总等。但是这样的工作,任何一个节点都可以完成,因为在Elasticsearch中一个集群内的节点都可以执行任何请求,其会负责将请求转发给对应的节点进行处理。所以单独增加这样的节点更多是为了负载均衡。
  • 指定客户端节点配置。
node.master:false
mode.data:false

2.5 脑裂现象

  • 当主节点负载压力过大,或者集群环境中的网络问题,导致其它节点与主节点通讯的时候,主节点没来得及响应,某些节点就认为主节点宕机,重新选择新的主节点,最后集群中就出现了两个主节点的情况,我们称之为“脑裂现象”。

2.5.1 脑裂现象成因

  • 网络问题:集群间网络延迟导致一些节点访问不到master,认为master宕机从而选择新的master,并对master上的分片和副本标红,分配新的主分片。
  • 节点负载:主节点的角色既为master又为data,访问较大时可能导致master停止响应造成大面积延迟,此时其它节点得不到master的响应,重新选择master。
  • 内存回收:data节点上进程占用内存较大,引发JVM的大规模内存回收,造成master失去响应。

2.5.2 脑裂现象解决方案 

  • 角色分离:即master节点与data节点分离,限制角色。
  • 减少误判:配置主节点响应时间长一点。
discovery.zen.ping_timeout:5
  • 选举触发:定义形成集群,有主节点资格并相互连接的节点最小数目(候选主节点数/2)+1。
discovery.zen.minimum_master_nodes:1

三、集群搭建

3.1 集群结构

  • 以三台物理机为例。搭建6个ES节点(3个data节点,3个master ),每台物理机一个data和一个master,3个master目的是(n/2)+1=2要求,这样挂掉一台master后,n=2,满足参数,其它两个master都认为master挂掉后开始重新选举,防止脑裂现象。

Elasticsearch集群_第7张图片 

3.2 集群配置

3.2.1 master配置

# 集群的名称,同一个集群每个节点都必须设置成相同的
cluster.name:my-es
# 节点名称
node.name:es-master-01
# 候选主节点
node.master:true
# 数据节点
node.data:false

network.host:0.0.0.0
http.host:0.0.0.0
http.port:9201
transport.tcp.port:9301
# es7不需要
# discovery.zen.minimum_master_nodes:2
discovery.zen.ping_timeout:10
# 设置集群中master的初始列表,可以通过这些节点来自动发现其它新加入集群的节点,es7新增配置
discovery.seed_host:["ip:9301","ip:9302","ip:9302"]
# 集群初始时的候选主节点,es7新增配置
cluster.initial_master_nodes:["ip"]

3.2.2 data配置

# 集群的名称,同一个集群每个节点都必须设置成相同的
cluster.name:my-es
# 节点名称
node.name:es-master-01
# 候选主节点
node.master:false
# 数据节点
node.data:true

network.host:0.0.0.0
http.host:0.0.0.0
http.port:9201
transport.tcp.port:9301
# es7不需要
# discovery.zen.minimum_master_nodes:2
discovery.zen.ping_timeout:10
# 设置集群中master的初始列表,可以通过这些节点来自动发现其它新加入集群的节点,es7新增配置
discovery.seed_host:["ip:9301","ip:9302","ip:9302"]
# 集群初始时的候选主节点,es7新增配置
cluster.initial_master_nodes:["ip"]

你可能感兴趣的:(elasticsearch,大数据)