1.加载配置文件,单节点不牵扯选举,多节点需要选举
2.设置IP.PORT,最大连接数等参数
3.启动线程,开始节点选举
4.looking状态:统计所有的looking的总数,并为每个设置选票为当前节点的myid,当前日志ID zxid和当前的的epoch 构建选票信息。开始选举
1.将自己的选票信息发送给其他所有节点
2.自己的接收队列中获取消息是否为空
1.如果为空,检查自己是否收到消息,没有的话,则发送消息联系其他节点,我没有收到消息
2.否则尝试连接其他的节点
3.处理接收到的数据
1.zxid为-1,则退出
2.检查接收到的消息的epoch是否比自己的大,如果大,则设置自己的epoch为最新的epoch,并清除自己收到的所有消息 检测对比,自己的epoch->zxid->myid的大小,将最大的设置为新的选票数据,并通知其他节点自己的最新选票
3.如果收到的消息的epoch小于自己的选票的epoch,则表示当前收到消息的选票无效
4.如果收到的选票等于当前节点的epoch,则对比zxid->myid的大小,设置选票,并通知其他节点自己的最新选票信息
5.将投票结果缓存到本地,进行最终对比,遍历所有的收到的选票信息,将与当前节点选票一样的放进set,如果set的值大于总结点的一般,则进行设置
1.判断当前选举出来的节点信息,是否优于队列的所有选票信息(再次确认)如果队列中有的选票大于当前选举出来的,则退出,需要重新选举
2.否则设置当前选举出来的节点为leader节点
4.如果选举过程中的状态是leading,则表示当前节点是选举出来的信息,
1.如果当前节点的epoch等于新收到的信息的epoch,则同步最新消息到当前节点的接收对列,
1.并再次确定队列中是否有过半的选票是当前节点的选票,并且接收到的信息是否有当前节点,如果是则设置节点信息,删除队列所有信息并返回
2.将最新消息放进投票结果队列中,判断是否最新消息的节点选票是否超过一半,并且当前节点是否是leading状态,是的话,则设置当前节点为主节点.,删除队列所有信息并返回
5.如果是OBSERVING,就赋值observer信息,并连接leader
6.如果是FOLLOWING,就赋值follower信息,并连接leader
7.如果是leading ,则设置leader的基本信息,并同步磁盘中的信息,获取最新的zxid信息,并设置当前节点下的新的epoch信息, 同时启动与其他learner的通讯线程,并启动服务
对票数再次验证,如果统计票数,如果过半,则启动主节点,否则进行下一轮选举
zookeeper选举详情流程
最新推荐文章于 2024-01-11 17:10:53 发布