讲解Elasticsearch中master候选节点以及ES集群脑裂

一、脑裂分析

在ES中什么是脑裂:

因为ES中master是集群中非常重要的一个角色,主宰了集群状态的维护,以及shard的分配,而如果在一个集群有两个或者多个master的话,会导致一条数据多个master同时进行分配写入数据,导致数据破坏。因此在一个集群必须只有一个master。master是脑,一个脑袋无法裂开,所以叫避免脑裂。

脑裂的产生原由:

如果因为网络的故障,导致一个集群被划分成了两片,每片都有多个node,其中不能跟master节点通讯的node自行选举成一个新的master,那么集群中就出现了两个master了。

二、重要参数:discovery.zen.minimum_master_nodes

discovery.zen.minimum_master_nodes 参数对于集群的可靠性来说,是非常重要的。这个设置可以预防脑裂问题,也就是一个集群中存在两个master。

配置文件中的注释如下:

cat /etc/elasticsearch/elasticsearch.yml
# Prevent the "split brain" by configuring the majority of nodes (total number of master-eligible nodes / 2 + 1):
#
#discovery.zen.minimum_master_nodes: 
#

这个参数的作用,就是告诉es直到有足够的master候选节点时,才可以选举出一个master,否则就不要选举出一个master。

这个参数必须被设置为集群中master候选节点的quorum数量,也就是大多数。至于quorum的算法,就是:master候选节点数量 / 2 + 1

举例说明

比如我们有10个节点,都能维护数据,也可以是master候选节点,那么quorum就是10 / 2 + 1 = 6

如果我们有三个master候选节点,还有100个数据节点,那么quorum就是3 / 2 + 1 = 2

如果我们有2个节点,都可以是master候选节点,那么quorum是2 / 2 + 1 = 2。此时就有问题了,因为如果一个node挂掉了,那么剩下一个master候选节点,是无法满足quorum数量的,也就无法选举出新的master,集群就挂掉了(可读不可写)。此时就只能将这个参数设置为1,但是这就无法阻止脑裂的发生了。

2个节点,discovery.zen.minimum_master_nodes分别设置成2和1会怎么样?

见下图

设置成2的场景, 无法发起选举,没有master了。 

å¨è¿éæå¥å¾çæè¿°

设置为1的场景,不可避免脑裂

å¨è¿éæå¥å¾çæè¿°

综上所述,一个生产环境的es集群,至少要有3个节点,同时将这个参数设置为quorum,也就是2。discovery.zen.minimum_master_nodes设置为2,如何避免脑裂呢?

3个节点,discovery.zen.minimum_master_nodes设置为2,是如何避免脑裂?

那么这个是参数是如何避免脑裂问题的产生的呢?比如我们有3个节点,quorum是2.现在网络故障,1个节点在一个网络区域,另外2个节点在另外一个网络区域,不同的网络区域内无法通信。这个时候有两种情况情况:

(1)如果master是单独的那个节点,另外2个节点是master候选节点,那么此时那个单独的master节点因为没有指定数量的候选master node在自己当前所在的集群内,因此就会取消当前master的角色,尝试重新选举,但是无法选举成功。然后另外一个网络区域内的node因为无法连接到master,就会发起重新选举,因为有两个master候选节点,满足了quorum,因此可以成功选举出一个master。此时集群中就会还是只有一个master。

å¨è¿éæå¥å¾çæè¿°

(2)如果master和另外一个node在一个网络区域内,然后一个node单独在一个网络区域内。那么此时那个单独的node因为连接不上master,会尝试发起选举,但是因为master候选节点数量不到quorum,因此无法选举出master。而另外一个网络区域内,原先的那个master还会继续工作。这也可以保证集群内只有一个master节点。

å¨è¿éæå¥å¾çæè¿°

综上所述,通过在elasticsearch.yml中配置discovery.zen.minimum_master_nodes: 2,就可以避免脑裂问题的产生。

10个节点,discovery.zen.minimum_master_nodes设置为6,是如何避免脑裂?

如果master是单独的那个节点,另外2个节点是master候选节点,那么此时那个单独的master节点因为没有指定数量的候选master node在自己当前所在的集群内,因此就会取消当前master的角色

比如我们有10个节点,都能维护数据,也可以是master候选节点,那么quorum就是10 / 2 + 1 = 6。

这就解决了如果一个集群被划分成(9)(1),9>6个node重新组成一个集群(node,master)。1≤6个node组不成集群。这就不会出现两个master

如果一个集群被划分成(8)(2),8≥6个node重新组成一个集群(node,master)。2≤6个node组不成集群。这就不会出现两个master

如果一个集群被划分成(7)(3),7≥6个node重新组成一个集群(node,master)。3≤6个node组不成集群。这就不会出现两个master

如果一个集群被划分成(6)(4),6≥6个node重新组成一个集群(node,master)。6≤6个node组不成集群。这就不会出现两个master

如果一个集群被划分成(5)(5),都不满足无法选举.。

动态设置discovery.zen.minimum_master_nodes

但是因为es集群是可以动态增加和下线节点的,所以可能随时会改变quorum。所以这个参数也是可以通过api随时修改的,特别是在节点上线和下线的时候,都需要作出对应的修改。而且一旦修改过后,这个配置就会持久化保存下来。


PUT /_cluster/settings
{
    "persistent" : {
        "discovery.zen.minimum_master_nodes" : 2
    }
}
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值