Zookeeper原理和ZAB协议
1,zookeeper架构组件
1)概念
Leader :zk集群主节点,用户写入数据、提供读取服务、处理事务请求等。
Follower:zk集群从节点,用于同步Leader、提供读取服务、处理非事务请求等。leader与follower间使用心跳监测来保持连接。
Client:连接leader或者follower,定时发送心跳,保持链接。
Znode:包含stat元数据。版本号(多个客户端cas操作)、时间戳、数据长度、ACL读写权限。
2)会话和监视
会话:client连接server时分配ID,创建临时节点时,会保存sessionId(用户断开时删除节点)。client通过特定间隔发送心跳,来保持session有效。
监视:用于向客户端通知znode的变更,包含本身数据变更和子节点变更。可以在读取znode时,设置watch。
3)读取和写入
写入:leader处理(follower接收则转发到leader),广播写入请求到所有follower,当超过一半返回ack,则完成写入过程。
读取:每个server都有自己的database,不需要与集群交互。
4)zxid:每一个节点的创建、删除、更新等都有一个全局唯一的事务id。
2,ZAB协议
1)Zookeeper Atomic Broadcast
zk原子广播协议,基于paxos协议,解决多节点写入
问题的协议,用于实现分布式一致性算法
2)zab阶段
选举(election
):每个follower都向其他节点发送(选取自身为leader的vote投票)。 其他follower接收到vote后,对比zxid(本地日志中最大事务id),如果比自己新则投票并更新自身vote。当某个节点收到超过半数的vote时,则选取为leader。
发现(discovery
) :follower向准leader发送followerinfo命令,准leader返回newleader指令。
同步(sync
):leader发起同步指令,根据leader日志,更新所有follower节点的数据。
广播(boradcast
):客户端提交事务请求到leader,leader广播事务到所有的follower,收到超过半数的ack时,则进行事务的提交。