首先Zookeeper(下文简称zk)是一种”分布式协调服务”,我们常见的分布式系统中都有zk的影子。
zk通过简单的架构和API解决了分布式系统难以协调的问题。这样开发人员可以更专注于核心应用程序的逻辑,而不用为分布式环境下的应用程序的协调而担心。
zk的数据结构
zk的数据结构类似文件系统,zk的基本存储单元是节点(Znode),每一个Znode具有唯一确定的路径
Znode的结构
Znode由data acl child stat组成
- data 代表当前Znode存储的数据信息
- acl 代表当前Znode的访问权限
- stat Znode的元数据
- 版本号 每当和Znode相关联的数据发生变化时,对应的版本号也会增加。当多个zk客户端在同一znode上操作时,版本号很重要。
- ACL 存储当前znode的访问权限
- 时间戳
- 数据长度 - 存储在znode中数据总量
- child 表示当前节点的子节点们
Znode的类型
- 持久节点(PERSISTENT) 该类型节点只有创建它的客户端主动执行删除操作才会被删除,否则会一直存在
- 临时节点(EPHEMERAL) 该类型节点,和客户端会话紧密相关,当客户端和zk集群断开连接时,临时节点会自动删除。临时节点不允许有子节点
- 顺序节点(SEQUENTIAL) 创建这个类型的节点时候会自动在其节点名后面追加一个整型数字(该数字由父节点维护)
zk的事务
zk的事务是指能够改变zk服务器状态的操作,一般包括节点的创建、删除、节点内容更新、客户端会话创建与失效等。
对于每一个事务,zk都会为其分配一个全局唯一的事务ID(ZXID);每一个ZXID对应一次更新操作
Session
客户端连接到服务器,会向客户端分配SessionId,同一个会话中的请求按照FIFO顺序执行。
客户端以特定的时间间隔发送心跳,如果时间间隔大于服务器指定的超时时间,那么视为会话过期,将判定客户端死机。