ElasticSearch-脑裂
2025-01-22 08:19:30    479 字   
This post is also available in English and alternative languages.

ElasticSearch版本:6.5.0(点击跳转官方文档)


假设 集群中有十个节点,其中一个为master节点。

集群网络发生异常,三个节点(DataNode-1、DataNode-4、DataNode-7)与原集群失联,但三个节点之间还能联络。

三个节点联络不上master节点,认为对方出现了故障,于是开始选举Master,导致一个集群被分割成了两个独立的集群。

至此,集群中出现了两个Master节点,Master主宰集群状态维护、分片分配,出现两个Master节点,会导致数据被破坏,这种情况称为脑裂

脑裂-1

脑裂-2

脑裂-3


1. 如何避免

  • 集群尽量部署在同一内网环境,各个节点通讯可靠
  • master节点与data节点分离,保证master节点响应可靠性。
  • 检查、配置 discovery.zen.minimum_master_nodes。

2. discovery.zen.minimum_master_nodes

最小master候选节点数。配置最小master候选节点数,该参数对集群稳定、防止脑裂很重要。

ElasticSearch 进行选举时,如果没有足够master候选节点时,就不要进行master节点选举。等master候选节点数量足够了才进行选举。

数量计算:(master候选节点数 / 2)+ 1。

例如:

1
2
3
4
5
集群中有10个节点
(10个节点既能保存数据,也能成为master,即10个master候选节点)
那最小数量即:(10/2)+1 = 6

如果有3个master候选节点,最小数量:(3/2)+1 = 2

3. 配置

3.1. elasticsearch.yml

1
discovery.zen.minimum_master_nodes: 2

3.2. dsl配置

minimum_master_nodes 配置允许通过API调用,动态修改配置。

这是一个永久配置,会优先生效;当 添加、删除 master 节点时,也需要修改该配置。

1
2
3
4
5
6
PUT /_cluster/settings
{
"persistent" : {
"discovery.zen.minimum_master_nodes" : 2
}
}

4. Reference