zookeeper
- zookeeper api
linux:
zkCli.sh : 连接客户端
输入 ll :查看帮助信息
ZooKeeper -server host:port cmd args
stat path [watch]
set path data [version]
ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl
addauth scheme auth
quit
getAcl path
close
connect host:port
ls / :查看根节点下面有哪些节点
[testRoot, testRoot1, zookeeper, testRoot222, testRoot111, dubbo, testRoot312]
get /testRoot : 查看节点
hello
cZxid = 0x1cf
ctime = Sat Nov 30 13:52:46 CST 2019
mZxid = 0x1cf
mtime = Sat Nov 30 13:52:46 CST 2019
pZxid = 0x1cf
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
create /202009 1 :创建节点
create /202009 /09 1 : 创建子节点
create -e /202009/08 1 :创建临时节点 客户端退出后,自动删除
create -s /202009/07 1 : 创建顺序节点,自动排序 070000000000
create -s -e /202009/06 1 : 创建临时顺序节点
set /202009 2 : 修改节点
delete /202009 : 删除节点,有子节点的时候删除失败
rmr /202009 : 连子节点一块删除
quit: 退出客户端
- 分布式协调
例如:A系统发送请求到mq,B系统消费后如何将结果告知A系统。
解决方案:利用zookeeper实现分布式系统之间的协调工作。
步骤:A系统发送请求之后可以对zookeeper上的某个节点注册监听,B系统处理完请求之后修改节点值,这样A系统立刻能收到通知
- 分布式锁
步骤:
1.创建父节点 create /202009 1
2.客户端A连接上ZK,在 父节点/202009下面创建临时顺序节点 create /202009/01 1 ,并且查看父节点下的所有子节点,发现自己的序号是最小的(顺序节点,zk内部会为每个节点维护一个序号),A获得锁
3.客户端B连接上ZK,在父节点/202009下面创建临时顺序节点 create /202009/02 2 ,并且查看父节点下的所有子节点,发现自己的序号不是最小的,获取锁失败,并且同时监听上一个顺序节点/202009/01
4.客户端C连接上ZK,同理获取锁失败,同时监听上一个顺序节点/202009/02
5.客户端A执行事务完毕,删除自己创建的临时顺序节点 delete /202009/01 ,释放锁
6.客户端B监听到/202009/01 删除事件,同时查看父节点下的所有子节点,发现自己的序号是最小的,获取锁
7.客户端C同上原理
如果中间某个客户端发生宕机,zk自动将其创建的临时顺序节点删除,释放锁,这就是临时节点的好处
- 配置管理(发布/订阅)
1. 将应用的配置信息放到zookeeper上集中管理
2. 系统A,系统B,系统C监听zookeeper上的对应节点
3. 修改节点上的配置信息,系统A,B,C能实时获取到修改信息
- 统一命名服务
在分布式应用中,需要一套完整的命中规则,既能产生唯一的名称,又能便于识别,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址
在分布式环境下,zk创建的顺序节点具有自增性,唯一性
create -s /machine-A/Log/2020/09 1 :节点名称是/machine-A/Log/2020/090000000001 表示机器A下面的20200901日志
create -s /machine-A/Log/2020/09 1 :节点名称是/machine-A/Log/2020/090000000002 表示机器A下面的20200902日志
create -s /machine-B/Log/2020/09 1 :节点名称是/machine-B/Log/2020/090000000001 表示机器B下面的20200901日志
- zookeeper 集群
搭建集群步骤
1.从虚拟机中克隆了三台服务器 A,B,C,三台服务器中都安装好了jdk,zookeeper
2.编辑zoo.cfg 文件
server.1=192.168.140.55:2888:3888
server.2=192.168.140.57:2888:3888
server.3=192.168.140.60:2888:3888
server.A=B:C:D
A:其中 A 是一个数字,表示这个是服务器的编号;
B:是这个服务器的 ip 地址;
C:Leader选举的端口;
D:Zookeeper服务器之间的通信端口。
3.在data目录下面新建myid文件,文件对应server的编号。例如A服务器对应server.1=192.168.140.55:2888:3888 则myid内容是1。
data目录有zoo.cfg中的 dataDir属性指定,例如 dataDir=/home/chen/software/zookeeper/data
4.一定要关闭防火墙 service iptables stop
启动zk服务
zkServer.sh start 启动
zkServer.sh status 查看状态
zkServer.sh stop 关闭服务
zkServer.sh restart 重启
select * from t_stl_s_cust_lmrc_monitor where id in( '4028d0337451e07b0174527683c7006a','4028d0337451e07b0174527683a80068');