概念
集群角色
| 角色 | 描述 | | ——– | ———————————– | | Leader | 是整个Zookeeper集群工作机制中的核心 | | Follower | 是Zookeeper集群状态的跟随者 | | Observer | 服务器充当一个观察者的角色 |
会话
客户端与服务端是通过建立 TCP 长连接来维持 Session。通过这个连接能够进行心跳检测来保持会话的有效性。
数据节点
数据单元 Znode 分为:临时节点,永久节点
ZooKeeper 的数据模型是树型数据结构。
在服务器出现故障时,其在 ZooKeeper 中注册的临时节点,会自动删除掉。
数据版本
版本类型 | 说明 |
---|---|
version | 当前数据节点数据内容的版本号 |
cversion | 当前数据节点子节点的版本号 |
aversion | 当前数据节点ACL变更版本号 |
watcher
事件监听器能把数据节点发的变化,通知给感兴趣的客户端。
ACL
五种权限类型:
CREATE, READ, WRITE, DELETE, ADMIN(设置节点 ACL 的权限)
问题汇总
启动时报 NoSuchMethodError
java.lang.NoSuchMethodError: org.apache.zookeeper.server.quorum.flexible.QuorumMaj.<init>(Ljava/util/Map;)V
at org.apache.curator.framework.imps.EnsembleTracker.<init>(EnsembleTracker.java:59)
at org.apache.curator.framework.imps.CuratorFrameworkImpl.<init>(CuratorFrameworkImpl.java:158)
at org.apache.curator.framework.CuratorFrameworkFactory$Builder.build(CuratorFrameworkFactory.java:156)
at com.fuqssi.lancelot.zookeeper.CuratorClient.<clinit>(CuratorClient.java:19)
上述异常是因为在 Maven 中引用 Curator.jar 之前,引入了 ZooKeeper.jar。导致 Curator 编译时引用的 ZooKeeper 和自己引用的 ZooKeeper 版本不一致。
删掉自己引用的 ZooKeeper,引入 Curator 之后,Maven 会解决 ZooKeeper 的依赖。
客户端
zkCli
常用命令
客户端连接服务器命令
# -r :只读参数。是指如果一台服务器与过半数以上的服务器失去联系,则这台服务器不再处理客户端的请求,加上 -r 参数后,这台服务器可以对外提供读取服务。
$ zkCli.sh -r -server ip:port
查看节点状态
$ stat path
# 返回结果如下
cZxid = 0x400000004 // 创建时的事务id
ctime = Tue Feb 28 16:37:13 CST 2017 // 事务创建时间
mZxid = 0x400000004 // 最后一次更新时的事务id
mtime = Tue Feb 28 16:37:13 CST 2017 // 最后一次更新事务的时间
pZxid = 0x400000004 // 该节点的子节点列表修改的事务id,子节点列表的修改,包括增加和删除子节点。修改子节点数据内容不计算在内
cversion = 0 // 子节点版本号
dataVersion = 0 // 数据版本号
aclVersion = 0 // 权限版本号
ephemeralOwner = 0x0 // 用于临时节点,临时节点的事务id
dataLength = 4 // 当前节点的数据长度
numChildren = 0 // 当前节点的子节点数量
ZkClient
ZkClient 封装了 ZooKeeper API,内部实现了 Session 超时重连,Watcher 反复注册等功能。
Curator
Fluent API 风格,Apache 顶级项目。