一、什么是Zookeeper
分布式协调框架:统一命名服务、状态同步服务、集群管理、分布式配置项
1、文件系统数据结构
znode(目录节点)
2、事件监听机制
可以对节点进行监听
二、zookeeper实战
启动 zkServer.sh
启动客户端 zkcli.sh (默认端口2181)
常用命令
基础增删,设值、取值
create /test 默认是持久化节点
delete /test
set /test abc
get /test
create -e /ephemeral
-s 顺序节点 会自动累加
-e 临时节点 无法创建子节点
-c 容器节点 一个周期内被删除
-t 需要修改配置文件开启,否则不能用。
监听
ls -w /test 监听节点,但是是一次性的。
ls -R -w /test 监听整个节点树,每个节点监听一次,一旦触发就失效
权限控制ACL
c-create w-write r-read d-delete a
集群
锁机制
分布式锁
单进程锁 java: synchronized / lock
分布式锁特点:独占性
1、非公平锁:
当A拿到锁,其余所有人在等待锁的释放。A释放了,通知其他人,B拿到锁后,剩下人又在等待
这就是惊群效应,会给zk带了压力
2、公平锁
先来后到
直接用curator连接zk, 提供了公平锁。
1、父节点是容器节点
2、子节点是临时顺序节点
3、共享锁
解决读写不一致
写的锁前,不可以有写或者读的请求。监听前面一个节点,不管是读还是写
读的锁前,不可以有写的请求,可以有读的请求。代码实现,监听最近的写节点
redis锁和zk锁的区别
1、redis不管是哨兵还是集群模式,都是主从节点的。主节点写入成功即成功。
2、zk是leader和follower模式,半数以上写成功,才算写成功。
ZOOKEEPER的可靠性比redis的好
但是,性能可定是redis好。
读写并发不一致情况,如何保证数据一致性?
共享锁