Zookeeper的数据保存在内存中。Zookeeper容许分布式进程经过共享的层次结构命名空间进行相互协调,层次结构命名空间由ZooKeeper中的数据寄存器——Znode组成,Znode相似于文件和目录。node
每一个ZNode由两部分组成:linux
node模型,父node会有多个子node服务器
节点建立后就一直存在,直到有删除操做来主动清除这个节点,不会随会话失效而消失。session
节点生命周期和客户端会话绑定。客户端会话失效(是会话失效,不是链接断开)时,节点消失。数据结构
不是一种类型,持久和临时节点都会有顺序节点,每一个Zookeeper的父节点会记录子节点的建立前后顺序,在建立的时候自动给子节点的节点名加上一个数字后缀。数字范围是整型最大值。架构
针对每一个节点的增删改操做,Zookeeper能够根据watcher事件进行监控,当监控的某个znode发生变化,就会触发watch事件。Zookeeper的watch都是一次性的,触发后当即销毁。并发
其实就是session工做原理。负载均衡
leader分布式
follower性能
observer
要保证leader选举快,就要保证follower节点可控且尽可能少
Zookeeper经过ZAB协议保证数据最终一致性。
Paxos:https://www.douban.com/note/208430424/(写得好,就懒得再总结了,直接看)
Zookeeper经过ZAB(Zookeeper Atomic Broadcast 原子广播)这个支持崩溃恢复的一致性协议来维护数据一致性。经过这个协议,Zookeeper实现了一种主从模式的架构来保证各个副本之间的数据一致。
ZAB协议主要包括两点:
一旦Leader节点没法工做,ZAB会自动从Follower节点从新选举出一个Leader
好处是保证提交过的数据不会丢失。由于提交过的数据都是半数经过的,即便leader服务器宕机也至少有一半以上的服务器保存有数据。
follower/observer节点收到后处理写请求,再回复leader节点
##### 消息广播和崩溃恢复 * 消息广播 过半服务器和Leader服务器完成数据状态同步后,就进入消息广播模式。当一台遵循ZAB协议的服务器加入集群,当发现有Leader服务器后,就自动进入数据恢复模式,和Leader服务器进行数据同步,同步完成后再参与到消息广播去 Leader服务器接收到客户端的事务请求,会生成对应事务方案,发起一次消息广播。当从服务器接收到客户端事务请求,会将请求转发给Leader服务器 * 崩溃恢复 当Leader服务器出现异常状况,则进入恢复模式,从新选举Leader服务器,当过半机器和Leader服务器完成数据状态同步以后,就退出恢复模式。服务器在成为Leader后,先判断自身未Commit的消息(是否存在于大多数服务器中从而决定是否要将其Commit * 小结 * 因为使用主从复制模式,全部写操做都由Leader主导,而读操做可经过任意节点完成,所以Zookeeper读性能好于写性能,适合读多写少的场景; * 虽然使用主从,同一时间只有一个Leader,但Failover机制保证了集群不存在单点失败(SPOF)的问题; * ZAB协议保证了Failover(崩溃恢复)过程当中的数据一致性; * 服务器收到数据后先写本地文件再进行处理,保证了数据的持久性
每一个Zookeeper服务器的惟一标识。
事务ID,用于标识一次更新操做的 Proposal ID。为了保证proposal顺序行,zxid必须单调递增。
Zookeeper使用一个64位数来表示,高32位是leader的epoch,从1开始,每次选出新的Leader,epoch加一。低32位位该epoch内的序号,每次epoch变化,都将低32位的序号重置。保证了zxid的全局递增性。
LOOKING、FOLLOWING、LEADING、OBSERVING
选票数据结构
投票流程
Zookeeper规定全部有效的投票都必须在同一轮次中。每一个服务器在开始新一轮投票是,会先对本身维护的logicClock进行自增
广播投票前服务器会现将本身的投票箱清空
每一个服务器最开始都是经过广播把票投给本身
服务器会尝试从其余服务器获取投票,并计入本身的投票箱。
判断选举轮次
选票PK
若是已经肯定有过半服务器承认了本身的投票(也多是更新后的投票),则终止投票,不然继续接受其余服务器的投票
更新服务器状态为LEADING或者FOLLOWING
Zookeeper实现分布式锁原理就是Watch机制+临时顺序节点。
4-1 主动轮询,心跳?弊端:延迟,压力
4-2 watch: 解决延迟问题。 弊端:压力
4-3 多个watch同时触发,负载压力?顺序节点,watch前一个(按序列顺序依次watch前一个),最小的得到锁!成本:一旦最小的释放了锁,Zookeeper只给第二个发事件回调,资源消耗压力小
Zookeeper写性能不高,若是有上万个客户端参与锁竞争,就会有上万个写请求(建立leader节点)发送给Zookeeper,Zookeeper集群负载压力过大;
当释放锁,leader主动放弃领导权时,又会触发watch,须要给每一个客户端进行通知,负载压力过大