如果发送方不是自己这里有效的投票成员, 把自己的选举提议发给发送方 如果发送方是自己这里有效的投票成员, 如果自己处在选举阶段 将收到的选举提议放入接收队列 如果如果发送方处于选举阶段且发送方选举轮次小于自己的选举轮次 把自己的选举提议发给发送方 如果自己不在选举阶段 如果发送方处于选举阶段 如果自己是主,且发送方在自己投票成员里,且自己超过一定时间未完成主节点epoch确认 自己放弃成为主。 向发送方发送自己的选举提议开始主节点选举
1.构造自己的初始投票,初始投票【自身集群id,数据实体中zxid,currenEpoch】 2.更新自身选举轮次 3.向自己可见的每个集群可投票人员发送 投票通知。 投票通知包含如下内容: **提议的主节点id** **主节点的zxid** **自身选举轮次** **自身状态【可能是寻主,主,从,观察者】** **发送对端的标识【以便发到此对端】** **提议的epoch【初始为自身currentEpoch】** **自身可见的所有集群信息** 4.此后进入循环迭代: 收取不到通知且自身投票被超过半数投票成员确认了。 以自身投票作为自己认可的选举结果。结束循环迭代。 收到通知,通知来自处于寻主阶段的集群成员。假设通知发出方为B,自身为A。 **若B的选举轮次比自己大,** 将自己选举轮次更新为B的,清空自己轮次下已经收集的投票。 依据B的轮次,zxid,成员id和自己的轮次,zxid,成员id更新自身选举提议。 再次向自身可见的所有集群投票成员,发出自身的投票通知。 记录来自B的选举提议ProsalB **若B的选举轮次比自己小,** 忽略B的通知。 **若B的选举轮次和自己一样,** 依据B的**轮次,zxid,成员id**和自己的**轮次,zxid,成员id**决定自身选举提议后续采纳B的还是自己的。 **如果决定,采纳B的,** 更新自身选举提议, 再次向自身可见的所有投票者发送自身选举提议。 将来自B的提议ProsalB记录到自身收集的有效投票提议集合。 统计,累计收取到的选举提议中,自身选举提议是否已经被自己可见集群的过半投票成员的选举提议所确定。 **如果自身提议被过半确认,** 从接收队列中寻找可以让自己改变决定的选举提议, **如果一定时间内找不到** 结束选举 以自身选举提议作为自己认可的选举结果。 **如果一定时间内找到,** 继续下轮循环 收到通知,通知来自处于已经进入从节点状态/主节点状态的集群成员。假设通知发出方为B,自身为A。 **若B的选举轮次和自身一样,** 将来自B的提议ProsalB记录到自身收集的有效投票提议集合。 统计,累计收取到的选举提议中, ProsalB是否已经被自己可见集群的过半投票成员的选举提议所确定。 **若ProsalB已经被过半确认,**且满足: 要么,ProsalB中提议的主节点是自己&ProsalB的选举轮次和自身一致, 要么,ProsalB中提议的主节点C的投票已被自己收集,C投票中说明自己已经处于主节点状态。 满足上述之一下, 结束自身选举。 采纳ProsalB作为自身选举结果。 若尚不能通过ProsalB得出自身结果, 将ProsalB这类来自非选举状态投票成员的选举提议额外放在一个独立容器存储。 从独立容器统计,累计收取到的选举提议中, ProsalB是否已经被自己可见集群的过半投票成员的选举提议所确定。 若ProsalB已经被过半确认,且满足: 要么,ProsalB中提议的主节点是自己&ProsalB的选举轮次和自身一致, 要么,ProsalB中提议的主节点C的投票已被自己收集,C投票中说明自己已经处于主节点状态。 满足上述之一下, 结束自身选举。 采纳ProsalB作为自身选举结果。 将自身选举轮次更新为ProsalB中的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)