目录
Zookeeper是具有高可用、高性能、一致性的开源协调服务框架,它提供了一些基本服务:统一命名服务、布式协调、存储数据、监听与通知等功能。
官网:http://zookeeper.apache.org/
源码:https://github.com/apache/zookeeper
一、zoo.cfg参数
参数 | 意义 |
tickTime | 2000 |
syncLimit | Leader和follower之间的通讯时长 最长不能超过initLimt*ticktime |
initLimt | 接受客户端链接zk初始化的最长等待心跳时长 initLimt*ticktime |
dataDir | 数据目录 |
dataLogDir | 日志文件 |
clientPort | 客户端链接服务端端口号 |
Server.A=B:C:D | A:第几号服务器 B服务IP C代表Leader和follower通讯端口 D备用选leader端口 |
二、集群角色
ZooKeeper有3种集群角色:Leader、Follower、Observer 。
Leader:
Leader作为整个ZooKeeper集群的主节点,负责响应所有对ZooKeeper状态变更的请求。它会将每个状态更新请求进行排序和编号,以便保证整个集群内部消息处理的FIFO,写操作都走leader,zk里面leader只有一个。
Follower :
Follower的逻辑就比较简单了。除了响应本服务器上的读请求外,follower还要处理leader的提议,并在leader提交该提议时在本地也进行提交。另外需要注意的是,leader和follower构成ZooKeeper集群的法定人数,也就是说,只有他们才参与新leader的选举、响应leader的提议。 帮助leader处理读请求,没有写请求,有投票权。
Observer :
如果ZooKeeper集群的读取负载很高,或者客户端多到跨机房,可以设置一些observer服务器,以提高读取的吞吐量。Observer和Follower比较相似,只有一些小区别:首先observer不属于法定人数,即不参加选举也不响应提议;其次是observer不需要将事务持久化到磁盘,一旦observer被重启,需要从leader重新同步整个名字空间。 可以处理读请求,没有写请求,没有投票权利。
三、节点结构
ZooKeeper操作和维护的为一个个数据节点,称为 znode,采用类似文件系统的层级树状结构进行管理。如果 znode 节点包含数据则存储为字节数组(byte array)。节点名称不能重复。
四、节点类型
ZooKeeper 共有 4 种节点类型,默认是PERSISTENT类型,对应的源码:org.apache.zookeeper.CreateMode
PERSISTENT:持久类型,如果不手动删除节点一直存在
EPHEMERAL:临时类型,客户端session失效就会随着删除节点,临时节点不能有子节点
PERSISTENT_SEQUENTIAL:持久有序类型,如果不手动删除节点一直存在,节点名称有序自增
EPHEMERAL_SEQUENTIAL:临时有序类型,客户端session失效就会随着删除节点,临时节点不能有子节点,节点名称有序自增
五、Stat数据结构
Stats数据结构包括状态信息、版本、权限相关属性,记录 ZNode 的三个数据版本,分别是version(当前ZNode的版本)、cversion(当前ZNode子节点的版本)和aversion(当前ZNode的ACL版本)。对应源码:org.apache.zookeeper.data.Stat。
属性含义如下:
状态属性 | 说明 |
czxid | 节点创建时的zxid |
mzxid | 节点最新一次更新发生时的zxid |
ctime | 节点创建时的时间戳. |
mtime | 节点最新一次更新发生时的时间戳. |
dataVersion | 节点数据的更新次数. |
cversion | 其子节点的更新次数 |
aclVersion | 节点ACL(授权信息)的更新次数.
|
ephemeralOwner | 如果该节点为ephemeral节点, ephemeralOwner值表示与该节点绑定的session id. 如果该节点不是ephemeral节点, ephemeralOwner值为0. 至于什么是ephemeral节点
|
dataLength | 节点数据的字节数. |
numChildren | 子节点个数. |
ls2、get、set命令会当前节点的Stats数据结构。
六、Watcher机制
Watcher(事件监听器),是Zookeeper中的一个很重要的特性。Zookeeper允许用户在指定节点上注册一些Watcher,并且在一些特定事件触发的时候,ZooKeeper服务端会将事件通知到感兴趣的客户端上去,该机制是Zookeeper实现分布式协调服务的重要特性。对应的源码:org.apache.zookeeper.Watcher。
KeeperState | EventType | 触发条件 | 说明 | 操作 |
SyncConnected(3) | None(-1) | 客户端与服务端成功建立连接 | 此时客户端和服务器处于连接状态 |
|
NodeCreated(1) | Watcher监听的对应数据节点被创建 | Create | ||
NodeDeleted(2) | Watcher监听的对应数据节点被删除 | Delete/znode
| ||
NodeDataChanged(3) | Watcher监听的对应数据节点的数据内容发生变更 | setDate/znode | ||
NodeChildChanged(4) | Wather监听的对应数据节点的子节点列表发生变更 | Create/child | ||
Disconnected(0) | None(-1) | 客户端与ZooKeeper服务器断开连接 | 此时客户端和服务器处于断开连接状态 |
|
Expired(-112) | None(-1) | 会话超时 | 此时客户端会话失效,通常同时也会受到SessionExpiredException异常 |
|
AuthFailed(4) | None(-1) | 通常有两种情况,1:使用错误的schema进行权限检查 2:SASL权限检查失败 | 通常同时也会收到AuthFailedException异常 |
|