赞
踩
下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.6.2/
我下载了最新的apache-zookeeper-3.6.2-bin.tar.gz
通过tar命令进行解压,然后修改conf/zoo_sample.cfg为conf/zoo.cfg,并修改里面的配置。
datadir为存储zookeeper节点快照的地方,默认是/tmp/zookeeper,你需要自定义一个地址,否则linux会自动清理tmp下的内容。
clientPort:我们可以看到zookeeper会监听2181端口的客户端连接
admin.serverPort:zookeeper默认启动的端口是8080,如果需要自定义启动端口,请指定它
分布式锁的实现主要注意一下几点:
1、锁要有互斥性,当一个线程获取到锁,另一个线程就会获取锁失败
2、在线程获取到锁之后还未释放锁,当前进程宕机,系统需自动释放锁。
zookeeper是通过创建临时节点实现分布式锁,如果临时节点不存在,就创建节点(获取锁)。如果节点存在,就创建失败(获取锁失败),客户端可以给服务器设置一个监听,当另一个线程释放锁或宕机,则会给当前监听返回一个回调,此时就可以再次尝试获取锁。
启动两个client:clientA和clientB,通过启动bin目录下的 zkCli.sh
clientA尝试创建临时节点/lock: (-e 表示创建的是一个临时节点)
创建成功!表明获取锁成功。
此时clientB也尝试创建临时节点/lock:
发现节点已存在,表明获取锁失败。
此时我们不需要不断地轮询去获取锁,那样是很耗性能的。zookeeper提供了监听机制,通过stat -w [path] 可以在/lock锁上注册一个监听。该命令返回了该节点的信息。
此时,我们模拟clientA释放锁的操作,删除临时节点/lock 或者 直接退出客户端 quit:
此时我们查看clientB:
收到了一个事件监听回调,type为NodeDeleted, path为/lock
收到回调之后,此时clientB再次尝试获取锁,成功。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。