maven版本尽量3.5版本以上,jdk1.8

如果其他服务器sid小于自己的sid,直接关闭socket连接,这么做的原因是为了减少连接

如果相同,打印警告信息,如果远端sid大于自己的sid,建立发送线程,接收线程

sendWorker.start,直接看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,首先比较当前周期,进行上面的选票比较逻辑。最后设置当前选举状态
