Zookeeper原理
监听器原理
1)Main线程中开启两个线程,Listerner负责监听,Connect负责网络通信。
2)Connect线程将注册的监听事件发给Zookeeper。
3)Zookeeper中监听器列表发生变化就通知Listerner。
4)Listerner内部调用回调函数process。
Zookeeper的选举机制
设有5台zookeeper,myid分别为1、2、3、4、5,依次启动。
1)1号启动 => 找Leader => 无 => 发起选举 => 投1号 => 1号1票,无Leader。
2)2号启动 => 找Leader => 无 => 发起选举 => 投2号,同时1号发现2号比自己厉害改投2号 => 2号2票,无Leader。
3)3号启动 => 找Leader => 无 => 发起选举 => 投3号,同时1号和2号都发现3号比自己厉害都改投3号 => 3号3票,超过半数,3号为Leader。
4)4号启动 => 找到Leader为3号。
5)5号启动 => 找到Leader为3号。
如何判断谁厉害?
1)先看zxid,谁大谁的事务新,数据就新,更应该成为Leader。(但Zookeeper大部分时间都是保持一致性的,zxid理想情况下应一致。)
2)再看myid,谁大谁厉害。
Zookeeper尽力保持数据一致性
当有数据发生修改时,Zookeeper要尽力保持全局数据一致性。
1)客户端向一个Server发起写请求(写请求是一个事务有zxid号)。
2)如果这个Server不是Leader,它会通知Leader,Leader再把写请求广播给所有Flower。
3)所有Zookeeper投票,如果同意则把写请求放入待写队列。
4)Leader收集票数,>半数则同意写,告知所有Server写。原本同意的写。不同意的直接重启,再从Leader处同步数据。
5)最后告知Client写成功。
正常情况下都会同意写,何时会不同意写?
因为网络延迟,某台Server当前最新的zxid比传过来的写请求zxid大,说明已经产生数据不一致,不能再写,再从Leader处同步数据。极端情况下Leader会不同意只能重启,重新选举Leader,再从Leader处同步数据。