⦁ 1.基本概念
zookeeper是分布式协调服务
每个节点存储的数据很小, 不应该成数据库用,最多几kb
节点包括 临时节点和持久化节点
redis的分布式锁麻烦就麻烦在要考虑锁的过期时间,死锁等,代码复杂度提高
zookeeper提供的保证:
由单点leader执行写的操作,保证顺序写
原子性
zookeeper是主从复制架构类似redis,且二进制安全,即也是存的字节数组
2.集群安装
(1)搭建zookeeper集群:
i.修改zoo.cfg,复制zoo.cfg3个,修改dataDir和dataLogDir 以及clientPort 要不一样,然后在dataDir下分别写myid 里面记录0.1.2,
2888是选主投票用
3888是正常情况下leader接收读写请求的
参考:https://blog.csdn.net/vbirdbest/article/details/82688462
分别启动三个实例
../bin/zkServer.sh start ./zoo0.cfg
../bin/zkServer.sh start ./zoo1.cfg
../bin/zkServer.sh start ./zoo2.cfg
然后查看状态
../bin/zkServer.sh status ./zoo0.cfg
- 命令常见
⦁ help是帮助信息
⦁ 所有的create、get、set操作都要以绝对路径/开头
create /zk_test my_data #创建并设置目录的值set my_data
create /zk_test/zkzsx #创建目录
get -s/zs_test/zkzsx -s展示更多信息
cZxid:节点创建时的zxid序列号 --目录创建的序列号,16进制表示,低4字节表示事务id,
前4字节表示纪元,当leader变更一次时,纪元会变化
ctime:节点创建时间
mZxid:节点最近一次更新时的zxid,当再次更新时会加1
mtime:节点最近一次更新的时间
cversion:子节点数据更新次数
dataVersion:本节点数据更新次数
pZxid = 0x30000000d 表示当前节点下最后一个被创建的节点的cZxid,见下图
所有的操作都会先通过leader进行,对目录的增删改都会有递增序列号
datalength:字节数长度
ephemeralOwner 当前节点如果是临时节点,则会展示临时节点所属于的sessionid
set /zs_test/zkzsx dd
其实cZxid就是全局节点的递增序列号,从0开始,创建一个递增1,mZxid就是某个节点被修改的递增序列号,pZxid标记当前目录下最后一个被创建的节点
临时节点和session会话是绑定的,随着session消亡而消亡,单session本身是所有集群机器可见的,即统一视图
会话通过leader在集群内共享
create -s 创建顺序节点
多个客户端同时创建相同节点时,zk会给节点编号,而该节点的值始终以最后一次设置的为准
参看官网:
https://zookeeper.apache.org/doc/current/zookeeperStarted.html
3.zookeeper节点的应用
zk不能拿来当数据库用,场景是分布式协调,配置等
4.session 没有连接池的概念,每一个连接都有不同的session
watch 客户端先注册要监听的节点状态。同时保存监听器相关信息,当客户端监听的数据状态发生变化时,zk主动通知发送相应事件给客户端,客户端进行回调处理,
watcher一次性触发的特点,通知完一次后,之前的回调函数就失效了,要再监听的话需要重新设置回调,或者默认重新注册默认回调
默认的watcher是session级别的,只要session中有事件发生就会回调,并不与某个集群中具体的机器相关