Zookeeper原理

监听器原理

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要尽力保持全局数据一致性。

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处同步数据。