- Elasticsearch是如何实现master选举的
master选举默认是由zendiscovery模块负责。
系统刚刚启动的时候,选取id最小的备选master为master节点。
系统运行起来之后,master和非master节点间是存在一个类似心跳检测的ping机制的,当master ping不到其他节点,或者其他节点ping不到master的时候,他们之间就会互相判断,是否大多数都连不到主节点上了,如果大多数都连不上,那么就开始重新进行master选举。
master选举的底层实现是对于所有的master备选节点的clustersate进行比较,选择最新的clusterstate节点作为主节点,如果有两个节点的clusterstate值相同,那么选择id较小也就是较早的node作为主节点。我猜测这样选举的原因是用最新clusterstate可以保证集群处在最近的版本中,避免陈旧数据或操作的出现导致数据冲突,而用最早id其实也就是应用最先生成的节点的原因,应该是为了保证集群的稳定,最小的id应该最早执行完所有的数据一致性及各种操作了,所以可以保证数据的相对稳定。这样选举出来的一个主节点如果被大多数的备选主节点同意选为主节点并且该节点也选择自己作为主节点,那么这个节点就可当选,否则进行下一轮选举,一直到选举成功。
这里有两个重要的配置,elasticsearch.yml文件中的
discovery.zen.ping.unicast.hosts[]:这是一个master备选节点的主机表,所有想要加入集群的节点都向他们发送请求来加入集群。
discovery.zen.mininum_master_nodes的数量最好设定为备选主节点数量/2+1.因为这个配置控制了选举的最少节点数,即最少这么多个节点投票通