关于Elasticsearch集群脑裂brain-split的预防与解决

什么是脑裂?

在ES集群内部网络通信出现问题时,集群中的节点与master通信断开,节点会认为当前集群里没有master,从原集群里分裂出来的节点会再次选举master,这样导致原集群会有多个master,不同的节点又隶属于不同的master,这种情况称之为脑裂(Split Brains)

脑裂会导致集群处于丢失数据的危险情况,因为master被认为是集群中最高的统治者,它负责新分片的产生,分片的迁移等,如果集群中出现两个master,集群内数据完整和一致性就会被打破。

关于脑裂的问题,最好的处理方式在于预防,通过设置配置参数minimum_master_nodes来防止集群出现多个master

minimum_master_nodes的设定对集群的稳定性是非常重要的,这个设置告诉集群选择除非节点有足够的资格,否则不要选择该节点为master,这个资格就是该节点获得足够节点的支持数:

   (number of master-eligible nodes / 2) + 1 即 (所有备选master节点数量的值/2)+1

例如:有10各常规节点(既可以作为数据节点,又可以作为master节点),那么minimum_master_nodes设置为6

如果有3各master备选节点,100各数据节点,那么minimum_master_nodes设置为2

如果有2各常规节点,那就很尴尬了,minimum_master_nodes需要被设置为2,如果其中一个节点挂掉,集群将不可用,如果设置为1,又不能阻止脑裂


如何配置呢?

第一种方法,可以在配置文件elasticsearch.yml中添加 

discovery.zen.minimum_master_nodes: 2

但是es集群是动态的,经常有添加节点和删除节点的操作,这就导致每个节点都要进行配置文件的修改以及重启集群是非常糟糕的。采用第二种方法

第二种方法,动态api调用配置,

PUT /_cluster/settings
{
    "persistent" : {
        "discovery.zen.minimum_master_nodes" : 2
    }
}
可以使用curl命令

curl -XPUT http://localhost:9201/_cluster/settings -d '
{
 "persistent" : {
        "discovery.zen.minimum_master_nodes" : 2
    }
}'
这是永久的配置,优先级高于配置文件中的配置,你应该修改该配置,无论是在添加节点,还是删除节点时。

查看配置集群当前minimum_master_nodes值

curl -XGET localhost:9200/_cluster/settings

附上官方文档地址及图片

https://www.elastic.co/guide/en/elasticsearch/guide/1.x/_important_configuration_changes.html








阅读更多

没有更多推荐了,返回首页