zk
zk是一个分布式数据一致性解决方案。典型的应用有数据发布订阅
,负载均衡
,命名服务
,集群管理
,master选举
,分布式锁
等。zk可以保证如下
分布式一致性特性。
-
顺序一致性
从同一个客户端发起的事务请求,最终会严格按照其发起的顺序被应用到zk中。
-
原子性
所有的事务请求的处理结果在所有机器上应用的结果是一致的,即要么所有机器都成功引用了某个事务,要么都没有应用。
-
可靠性
服务器成功应用了一个事务,那么这个事务会被保存下来。
-
实时性
一旦事务被应用,那么客户端能够立即从服务器上读取到这个事务的变更。
zk的严格的顺序访问控制使得客户端能够基于zk实现复杂的同步原语。
zk的基本概念
集群角色
典型的集群模式就是master/slave模式,master负责所有的写操作,slave通过异步复制方式获取新的数据,并提供读取服务。
但是在zk中,使用了Leader,Follower,Observer三个角色,zk集群中通过leader选取过程选取一个机器作为Leader,为客户端提供读和写
服务,其他机器称为Follower和Observer,他们都提供读服务。区别在于Observer不参与Leader选举过程,也不参与写操作的过半写操作策略
。
会话
zk的客户端和服务器会建立一个TCP长链接。通过心跳检测和服务器保持有效的会话。同时通过该链接接受来自服务器的Watch时间通知。会话的 sessionTimeout值设置会话的超时时间。当服务器压力太大、网络故障,链接会断开。
数据节点(ZNode)
集群中的机器我们也会称为节点,但是这里的数据节点不是指机器节点,是指数据模型中的数据单元,我们称为ZNode。zk中的所有数据都存放在内存中,
数据模型是一颗树(ZNode Tree),有斜杠进行分割,如/foo/path1
。ZNode又分为持久节点和临时节点,持久节点指创建后除非主动移除,这个
ZNode会一致保存在zk上,临时节点则不一样,它会和会话绑定,一旦会话失效,这个客户端创建的所有临时节点都会被移出。
ACL(Access Control Lists)
zk使用ACL控制权限,类似于UNIX文件系统中的权限控制,有如下5中:
- CREATE: 创建子节点的权限。
- READ: 获得节点数据和子节点列表的权限。
- WRITE: 更新节点数据的权限。
- DELETE: 删除子节点的权限。
- ADMIN: 设置节点ACL的权限。
其中CREATE和DELETE都是针对子节点的。
Watcher
Watcher(时间监听器)允许用户在指定节点上注册一些Watcher,在一些特定事件触发的时候,zk服务器会将事件通知到感兴趣的客户端上。是zk实现 分布式协调服务的重要特性。
版本
zk会将ZNode维护为一个stat的数据结构,stat中记录了ZNode的三个数据版本,分别是version(ZNode的当前版本)、cversion(当前Znode的子节点版本), aversion(当前ZNode的ACL版本)。
zkclient连接服务器
zkCli.sh -timeout 5000 -r -server ip:2181