一、单节点操作
1. 启动服务器和client:
启动服务器 ~# zkServer.sh start ZooKeeper JMX enabled by default Using config: /data/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED 启动客户端 ~# zkCli.sh
2. 查看当前所有节点
[zk: localhost:2181(CONNECTED) 0] ls -R /
# Zookeeper系统自带的节点 / /zookeeper /zookeeper/config /zookeeper/quota
3. 新建app1和app2的znode
[zk: localhost:2181(CONNECTED) 1] create /app1 [zk: localhost:2181(CONNECTED) 1] create /app2 [zk: localhost:2181(CONNECTED) 1] create /app1/p_1 [zk: localhost:2181(CONNECTED) 1] create /app1/p_2 [zk: localhost:2181(CONNECTED) 1] create /app1/p_3 # 查看一下 [zk: localhost:2181(CONNECTED) 0] ls -R / / /app1 /app2 /zookeeper /app1/p_1 /app1/p_2 /app1/p_3 /zookeeper/config /zookeeper/quota
二、实现一个分布式锁
分布式锁要求如果锁的持有者宕了,锁可以被释放。ZooKeeper 的 ephemeral 节点恰好具备这样的特性。[zk: localhost:2181(CONNECTED) 6] create -e /lock Created /lock
客户端2:这个时候也去创建一个相同znode(由于被锁定了,客户端2无法获取)
# 创建提示已经存在 [zk: localhost:2181(CONNECTED) 0] create -e /lock Node already exists: /lock # 监控该znode [zk: localhost:2181(CONNECTED) 2] stat -w /lock cZxid = 0xb ctime = Thu May 19 09:13:48 EDT 2022 mZxid = 0xb mtime = Thu May 19 09:13:48 EDT 2022 pZxid = 0xb cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x1074e5aa8bc0000 dataLength = 0 numChildren = 0
客户端1:退出客户端,由于是临时znode,断开链接之后会自动删除(释放锁)
[zk: localhost:2181(CONNECTED) 7] quit WATCHER:: WatchedEvent state:Closed type:None path:null 2022-05-19 09:21:01,264 [myid:] - INFO [main:ZooKeeper@1619] - Session: 0x1074e5aa8bc0000 closed 2022-05-19 09:21:01,266 [myid:] - ERROR [main:ServiceUtils@42] - Exiting JVM with code 0 2022-05-19 09:21:01,267 [myid:] - INFO [main-EventThread:ClientCnxn$EventThread@578] - EventThread shut down for session: 0x1074e5aa8bc0000
客户端2:由于客户端2有监控这个znode,所以客户端1退出的时候,会收到日志,这个时候客户端2就可以创建了(获取锁)
WATCHER:: WatchedEvent state:SyncConnected type:NodeDeleted path:/lock # 创建znode [zk: localhost:2181(CONNECTED) 0] create -e /lock Created /lock
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。