简介
作用:
- 中间件,提供协调服务
- 作用于分布式系统
安装与使用
zoo.cfg文件
sh bin/zkServer.sh start
sh bin/zkServer.sh status
sh bin/zkServer.sh stop
基本数据模型
作用体现:
- master节点选举
- 集群数据的强一致性(统一配置文件管理)
- 发布和订阅
- 分布式锁
特性与命令
通过 ./zhCli.sh 打开客户端
ls / : 查看根目录下的节点
get /test : 获取/test节点的值及状态
stat / : 查看节点状态
ls2 / : ls /和stat /一起使用的效果
create /test test : 创建节点及值 create -e /test/tem2 test : 创建临时节点,此时get ephemeralOwner值不是0*0(说明是临时节点) create -s /test/tem2
test : 创建顺序节点(递增) set /test aa : 修改 set /test ab 1
: 带有版本号(乐观锁) delete /test2 : 删除
watcher机制
使用场景:
用法:
get /test watch : 等等 设置父节点watch事件
acl 权限
setAcl /test world:anyone:crwa(设置没有删除子节点权限)
addauth digest zhao:zhao(登陆)
auth:zhao:zhao:crwa
setAcl /test ip:172.27.49.732:crdwa(基于ip设置权限)
zk四字命令
echo ruok | nc localhost 2181
echo conf | nc localhost 2181
集群基础知识
集群同步用的端口和选举用的端口
zookeeper的java原生api开发
同步或者异步创建节点,都不支持子节点的递归创建,异步有一个callback函数
ZooKeeper zk = new ZooKeeper(zkServerPath, timeout, new ZKConnect());(创建连接)
zookeeper.create(path, data, acls, CreateMode.PERSISTENT, newCreateCallBack(), ctx);(创建节点)
Stat status = zkServer.getZookeeper().setData(“/testnode”, “xyz”.getBytes(), 0);(修改)
zkServer.getZookeeper().delete(“/test-delete-node”, 0);(删除)
byte[] resByte = zkServer.getZookeeper().getData(“/testnode”, true, stat);(获取节点数据)
zkServer.getZookeeper().getChildren(“/test2”, true);(获取子节点)
zkServer.createZKNode(“/aclimooc/testdigest”, “testdigest”.getBytes(), acls);(登陆才能访问)
zkServer.getZookeeper().addAuthInfo(“digest”, “imooc1:123456”.getBytes());(登陆)
Apache Curator客户端
dubbo
分布式锁
活锁:任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失败,尝试,失败。
活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。死锁是加不上就死等,活锁是加不上就放开已获得的资源重试
与spring融合
<description>zk与spring容器结合, 启动项目加载的时建立与zk的连接</description>
<!-- zookeeper 重试策略 -->
<bean id="retryPolicy" class="org.apache.curator.retry.RetryNTimes">
<