一.zookeeper选择过程中的服务状态
FOLLOWING:追随状态.负责读,同步leader的数据.
LOOKING:竞选状态,参与选举成为leader
LEADING:领导状态,负责写,同步数据到follower
OBSERVING:观察状态,不参与竞选.
二.zookeeper的投票的数据结构
logicalclock:第几场选举
state:selft_id的服务的服务状态
self_id:标识哪个服务
self_zxid:服务的zxid
vote_id:选举哪个服务为leader
vote_zxid:选举为leader服务的zxid
刚启动服务时,是如何投票选举的?
投票规则:首先看是第几轮,如果相同,就比较zxid,大的胜出,如果zxid一样,最后比较myid,也是打的胜出.最后获得票数大于一半的成为leader,选举结束.
部署zookeeper的时候,假如部署5台机器,my_id分别是1,2,3,4,5.机器分别也是1-5.
当1服务启动的,会为自己投一票,数据存储结构是(第几轮投票,投票的my_id,被选举的my_id),所以id为1的存储的数据为(1,1,1).发送投票信息给其他zookeeper应用,没有收到响应.没有超过半数通过,状态为LOOKING.
当2服务启动的,会为自己投一票,id为2的存储的数据为(1,2,2).发送投票信息(myid,zxid,logicalclock)给其他zookeeper应用,当1服务收到了投票信息,首先看是第几轮投票,都是一样,都是1,接着看zxid,因为没有出现过修改,都一样,都是0,最后看my_id,2比1小,所以把票投给2,清空投票信息,投票信息改为(2,1,2),意思为第二场,myid为1服务的把票投给myid为2的服务.然后发给2服务.2服务发现自己的投票场次小,清空投票信息,2服务修改投票信息为(2,1,2)(2,2,2).意思是第二场,1号服务投给自己,第二个括号的数据是第二场,自己投给自己.没有满足半数通过,修改服务状态为LOOKING
当3服务启动时候,把自己的投票信息改为(1,3,3),然后发送投票信息(1,3,3)给其他服务.1服务接收后,清空投票信息,投票信息改为(3,1,3),同时发送给3服务.2服务接收到,清空投票信息把投票信息修改为(3,2,3),同时发自己的投票信息发给3服务.3服务接收到1和2服务的投票信息,把自己的投票信息改为(3,3,3)(3,1,3)(3,2,3),投票数目超过机器的一半,同时标记自己的服务状态为LEADING,把自己的选举信息发给其他服务,其他服务接收到信息,发现自己的投票数目没有超过一半,修改自己的服务状态为FOLLOWING.