zookeeper简述


zk是什么

zk是一个分布式协调器,在分布式系统中充当一个中间层的东西,例如在dubbo中做注册中心,协调生产者和消费者的路由,例如在分布式服务中做分布式锁,做第三方锁工具,还有在kafka中做broker的选举功能。

数据结构

内部是一个多叉树结构,每个节点都可以存储数据,没有节点都可以有多个子节点,每个字节点被称为znode,是zk中的最小单元,节点分为四大类

  1. 持久节点,一直存在
  2. 临时节点,会话内存在
  3. 持久顺序节点,持久节点,子节点名称有顺序
  4. 持久临时节点,临时节点,字节点名称有顺序
    节点拥有版本信息,有三种,子节点版本,数据节点版本,acl版本,分别都由变更而变更
    acl为zk的权限管控
    watcher为监听器,可以监听指定事件,例如删除节点的事件。
    会话为zk客户端和服务端的tcp长连接,客户端通过心跳保持链接

zk集群和选举

zk使用的是zab算法(paxos简化),主要包括崩溃恢复和消息广播,前者是当leader发生意外中断时,集群快速选举一个新的leader,恢复服务,后者是所有的写请求打到leader,由leader广播给所有flowers进行同步,超过一半ack就提交事物

集群节点类型

leader : 处理读写请求,对写请求进行排序编号,保证处理消息的先进先出
follower: 只处理读请求,参加选举
observer: 分担读请求。

选举过程

假设集群由3台机器,选举过程如下

  1. server启动后,进入选举,首先投票给自己,投票格式为(myid,zxid),(前者是自己的id,后者是全局事务id,事务id就是leader收到写请求后,生成的,然后广播给followers,所以zxid大的代表收到的事务更新),然后会把投票信息广播出去,例如server1的是(1,0),当server2启动后,也生成了投票信息,(2,0),然后又收到了server1的广播,这个时候有一个票的优先级,zxid大的优先,myid大的优先,所以server2不改动,还是把(2,0),广播出去,server1收到后发现比自己优先,就更新投票信息广播,这个时候server3启动,发现server2已经有两票了,那么集群已经结束选举了,自己直接变成follower.
    如果follower挂掉了,只要没有超过半数,集群就没问题,对应机器不提供服务即可
    但是leader挂掉了,就需要重新选举leader

zk的强一致性

直接结论,zk的写是强一致的,读不是,
对于写来说,所有写请求都会到leader,由leader广播,而且生成zxid,所以即使follower挂掉重启,也是保持一致的
但是读来说,因为写请求,如果有一半以上的节点ack了,就commit事务,所以有部分节点会慢一点,就不是强一致了。当然可以使用sync read。直接读leader,就是一致了。


  目录