maven版本尽量3.5版本以上,jdk1.8
1.选举流程
如果其他服务器sid小于自己的sid,直接关闭socket连接,这么做的原因是为了减少连接
如果相同,打印警告信息,如果远端sid大于自己的sid,建立发送线程,接收线程
sendWorker.start,直接看run方法逻辑:
从阻塞队列中拿到消息
1.2 recver.run方法
读取远端服务器socker消息
整体选票逻辑,业务层丢入sendqueue-workerSender-queueSendMap发送队列选票消息,然后将选票信息发送到远端服务器和自己的recvWorker接收->recvQueue队列中,生成选票。
wokersender构建选票
mysid等于sid加入到传输层队列,如果不相等丢到queuesendMap中
fastleaderElection选举算法:初始化状态looking
真实的选票逻辑:newEpoch等于curEpoch,先比较zxid并且比较newID,curId,
updateProposal:更新选票,下次投票投竞争出来的选票
sendNotifications:将选出的选票发送给其他机器
termPredicadate:将选出来的选票放入voteSet并且进行半数比较
半数比较逻辑:比较投票机器数量是否大于半数half
half:投票数/2
返回为true以后,如果自己PK赢了,将自己设置为leading,否则,将当前状态设置为following
当一次选举以后状态更改,看leading和following,当第三个机器收到选票会比较当前状态是否是looking,
当第三台机器进来以后会走follwoing和leading,首先比较当前周期,进行上面的选票比较逻辑。最后设置当前选举状态