ElasticSearch进阶-集群脑裂问题
1.集群脑裂是什么?所谓脑裂问题,就是同一个集群中的不同节点,对于集群的状态有了不一样的理解,比如集群中存在两个master,正常情况下我们集群中只能有一个master节点。2.集群脑裂场景举例如果因为网络的故障,导致一个集群被划分成了两片,每片都有多个node,以及一个master,那么集群中就出现了两个master了。但是因为master是集群中非常重要的一个角色,主宰了集群状态的维护,以及s
1.集群脑裂是什么?
所谓脑裂问题,就是同一个集群中的不同节点,对于集群的状态有了不一样的理解,比如集群中存在两个master,正常情况下我们集群中只能有一个master节点。
2.集群脑裂场景举例
如果因为网络的故障,导致一个集群被划分成了两片,每片都有多个node,以及一个master,那么集群中就出现了两个master了。但是因为master是集群中非常重要的一个角色,主宰了集群状态的维护,以及shard的分配,因此如果有两个master,可能会导致数据异常。
如:
节点1在启动时被选举为主节点并保存主分片标记为0P,而节点2保存副本分片标记为0R。
现在,如果在两个节点之间的通讯中断了,会发生什么?由于网络问题或只是因为其中一个节点无响应,这是有可能发生的。
两个节点都相信对方已经挂了。节点1不需要做什么,因为它本来就被选举为主节点。但是节点2会自动选举它自己为主节点,因为它相信集群的一部分没有主节点了。
在elasticsearch集群,是有主节点来决定将分片平均的分布到节点上的。节点2保存的是复制分片,但它相信主节点不可用了。所以它会自动提升Node2节点为主节点。
现在我们的集群在一个不一致的状态了。打在节点1上的索引请求会将索引数据分配在主节点,同时打在节点2的请求会将索引数据放在分片上。在这种情况下,分片的两份数据分开了,如果不做一个全量的重索引很难对它们进行重排序。在更坏的情况下,一个对集群无感知的索引客户端(例如,使用REST接口的),这个问题非常透明难以发现,无论哪个节点被命中索引请求仍然在每次都会成功完成。问题只有在搜索数据时才会被隐约发现:取决于搜索请求命中了哪个节点,结果都会不同。
3.脑裂解决方案
在elasticsearch.yml中配置属性:discovery.zen.minimum_master_nodes,它的值默认是1,这个参数的作用,就是告诉es直到有足够的master候选节点支持时,才可以选举出一个master,否则就不要选举出一个master。
这个参数设置有个算法就是:master候选资格节点数量 / 2 + 1,所有有资格成为master的节点都需要加上这个配置。
假设我们有10个节点,都能维护数据,也都有资格成为master节点,那么quorum就是10 / 2 + 1 = 6;假设我们有5个节点,那么quorum就是5/2 + 1 = 3。
4.分析:为什么master候选节点最少三个(minimum_master_nodes是如何避免脑裂问题产生的)
思考一下,如果你只有两台节点,那么是无法使用官方的这个配置公式的,(这也就是为什么我们之前建议最少要三台机器能成为主节点),两台的话会出现各种各样的问题,为什么呢?
思考一下假设集群中共有2个节点,discovery.zen.minimum_master_nodes分别设置成2和1会怎么样?
如果我们有2个节点,都可以是master候选节点,那么quorum是2 / 2 + 1 = 2。此时就有问题了,因为如果一个node挂掉了,这么这时节点发生变更,那么只剩下一个master候选节点,是无法满足quorum数量的,也就无法选举出新的master,集群就彻底挂掉了。此时就只能将这个参数设置为1,但是这就无法阻止脑裂的发生了。
那么思考一下三台行不行呢?
node1为主节点 node2、3是数据节点,3/2+1 = 2,也是至少两台支持才能成为master。
1)如果主节点和两个数据节点因为网络不稳定失去联系,两个数据节点是可以正常通信的,那么此时那个单独的master节点因为没有指定数量的候选master node在自己当前所在的集群内,因此就会取消当前master的角色,尝试重新选举,但是无法选举成功。然后另外一个网络区域内的node因为无法连接到master,就会发起重新选举,因为有两个master候选节点,满足了quorum,因此可以成功选举出一个master。此时集群中就会还是只有一个master,不会出现脑裂。
2)如果master和另外一个node在一个网络区域内,然后一个node单独在一个网络区域内。那么此时那个单独的node因为连接不上master,会尝试发起选举,但是因为master候选节点数量不到quorum,因此无法选举出master。而另外一个网络区域内,原先的那个master还会继续工作。这也可以保证集群内只有一个master节点。
3)如果三台相互之间都无法通信,同上分析,则也不会出现脑裂问题。
综上所述,一个生产环境的es集群,至少要有3个节点,三台主节点通过在elasticsearch.yml中配置discovery.zen.minimum_master_nodes: 2,就可以避免脑裂问题的产生。
更多推荐
所有评论(0)