一、首先来了解两个概念
1、一种比较简单的算法就是Bully,它通过一定的直接给每个节点赋予一唯一的ID,这些ID是可以排序的,每次master选举都会选举ID最大的节点。这种实现非常简单。但是会存在一些问题,在master负载过重时它会假死,于是第二大节点就成为了master节点。因此假死master节点因负载减轻又活了过来,于是他又被选为master,然后又假死……,这种情况可能一直存在导致系统不稳定。
2、集群还有一个问题就是脑裂(brain split):一个集群因为网络问题导致多个master选举出来而分裂。这也是master选举必须要解决的问题。
二、elasticsearch的master选举原理(它是在bully的基础上做了改进,它原理如下:)
(1)对所有可以成为master的节点根据nodeId排序,每次选举每个节点都把自己所知道节点排一次序,然后选出第一个(第0位)节点,暂且认为它是master节点。
(2)如果对某个节点的投票数达到一定的值(可以成为master节点数n/2+1)并且该节点自己也选举自己,那这个节点就是master。否则重新选举。
(3)对于brain split问题,需要把候选master节点最小值设置为可以成为master节点数n/2+1(quorum )
三、master 选举的内部实现方法:
1、按nodeId排序,直接返回第一个