zookeeper
分布式协调框架,是一个用于存储少量数据,基于内存的数据库
用于:分布式锁,分布式注册中心,分布式配置中心等
主要概念:文件系统数据结构、监听机制
每个节点下可以存储数据,就是类似于文件目录
几点(目录)类型:
1.持久化节点:只要不删除,则永久存在
2.持久化顺序节点:创建的时候,会自动加上编号,例如从X-000000开始从小到达排序。
3.临时节点:客户端与服务端断开连接,自动删除,不能创建子节点。
4.临时顺序节点:断开连接,节点也会自动删除,同样不能创建子节点(可用于分布式锁)。
5.Container节点:子节点删除,container会自动删除。默认60s检测一次是否有子节点。
6.TTL节点:过了指定时间会自动清除,默认关闭。
监听机制:
1.设置对某个节点的监听,当节点被删除或者内容修改,对应的客户端会收到通知
命令:get -w /path
2.设置对某个目录监听,当目录下有子节点创建或删除,对应的客户端会收到通知
命令:ls -w /path
3.设置对某个目录的的递归子节点的监听,当目录下的人员子节点有目录结构的变化(子节点的创建或者删除),对应的客户端会收到通知
命令:ls -R -w /path
通知是一次性的,如果想继续监听,则需要重新设置监听
节点监听和目录监听的区别:
节点监听的是节点的删除和节点内容的修改
目录监听的是目录结构的改变,对目录下的节点中的内容的修改不监听
zookeeper集群
Leader:负责读写
Follower:负责读,并参数Leader选举
Observer:只负责读,不参与Leader选取
分布式锁
当并发量比较大时,可能有大量连接都处在监听/lock节点的状态,当锁释放后,要通知所有的监听的连接,即产生羊群效应,性能下架,属于非公平竞争。
可以用公平锁解决羊群效应,即:每个连接都会在/lock节点下产生一个临时顺序节点,先判断是否是/lock下最小的节点,是的话获取锁,不是的话只能监听前一个节点,节点被删除,通知下一个节点,此节点判断是否为最小的节点,是的话获取锁,否则监听前一个节点。
前面两种都是用了互斥锁,同一时间只能有一个请求占用,并发上来性能也会下降
可以采用共享锁
特点:
- 当前读不会监听上一个读
- 当前读监听离自己最近的写
- 当前写监听上一个节点(不管是读还是写)
解决了:读读不会加锁
Zookeeper选举流程
https://www.processon.com/view/link/626f3a171e08535fe5428996