zab协议
zookeeper为了保证数据的⼀致性,使⽤了ZAB(Zookeeper Atomic
Broadcast)协议,这个协议解决了Zookeeper的崩溃恢复和主从数据同步的问题。
集群的选举
集群刚启动的时候
在集群启动的时候,每个结点都会生成一张自己的选票,之后各个机器之间会将自己的选票发给其他机器,机器在拿到其他机器的选票的时候,会先对比选票中的事务id,事务id大的成为主节点的权重也更大,如果事务id都是一致的话,那么对比每台机器的serviceid,结点会选出一张最合理的选票,投到选票箱中,如果投票相中每个机器的选票大于半数的话,那么就将称为集群的leader,此时leader结点的状态会从looking变成leading,follow会从looking编程following
集群崩溃的时候,重新选举leader
leader会向follow在规定的时间周期内发送心跳,如果超出该时间周期,follow会重新进入到looking阶段,重新发起集群中leader的选取,在选取的过程中,整个集群不会对外提供服务
主从之间的数据同步
明确:集群中写数据都是leader来决定的,读数据可以从follow中进行读取
- 向主节点写入数据,主节点将数据写入到自己的数据文件,并且给自己返回一个ack,
- 主节点将数据发送给所有follow,follow收到数据,也将数据存入到自己的数据文件中,并且返回一个ack给主节点
- 主节点接收到返回的ack,如果返回的ack数量大于集群的半数的话,会向follow发送commit,首先就是将自己的数据加载到内存,follower收到commit指令的话,也会将数据写入到内存中
Zookeeper中的NIO与BIO的应⽤
NIO
⽤于被客户端连接的2181端⼝,使⽤的是NIO模式与客户端建⽴连接
客户端开启Watch时,也使⽤NIO,等待Zookeeper服务器的回调
BIO
集群在选举时,多个节点之间的投票通信端⼝,使⽤BIO进⾏通信。