zookeeper也许有人听过,他可在分布式作为注册和配置中心,或者分布式锁。面试一问,你就只会这一句话。此处我也只想告诉大家,对于zookeeper你应该知道那些主要的基础知识
一、什么是zookeeper?
1.存有少数据的内存型数据库,()没错就是和你redis)一样。
2.文件系统型的数据结构+监听通知机制
二、文件系统型数据结构是什么意思?
就比如文件目录结构大肠包小肠。每个目录都是一个znode节点,和文件系统一样,可以增加,修改,删除每个节点。节点类型分为一下集中类型:
1.持久化节点:客户端和zookeeper断开连接后依然存在
2.持久化顺序节点:节点名称附带顺序编号,断开连接后,节点依然存在
3.临时节点:断开连接后,节点被删除
4.临时顺序节点:节点名称附带顺序编号,断开连接后节点被删除
5.容器节点:当没有子节点时,将会被服务器回收
6.TTL节点:过了指定的时间后,将被服务器删除
三、监听通知机制
客户端注册监听他关心的任意目录,节点或递归子目录节点,当监听的节点发生改变就会通知客户端。特别注意,通知都是一次性的。所以一实际场景中,当坚挺到节点发生改变,需要对节点才在添加监听。
四、应用场景吹逼
1.分布式配置中心
在zookeeper新建一个节点,所有的客户端都去对该节点添加监听事件,当手动修改了节点的类容,就会主动通知到客户端,发生更改。
2.分布式注册中心
在zookeeper里面创建一个持久节点名为user-service,每个服务启动就在该目录创建一个临时节点,当order-service需要依赖是,直接获取user-service下的所有节点,从而获取到里面的IP端口等信息,实现一个负载均衡即可。同时还要对父节点user-service尽心监听,遮阳挡节点有新加入或者掉线退出都会收到通知。
3.分布式锁
非公平锁
当并发过来时,在zookeeper下创建了一个lock名称的节点(名字随便取),如果已经被创建了,那就监听该节点并等待,如果没有被创建成功就去强锁,创建成功的线程获得锁去执行业务逻辑,执行完后释放锁,没有抢到也去监听并等待。当抢到锁的线程释放锁,所有等待线程一起开始新一轮的抢锁(会出现羊群效应对服务器压力较大)
公平锁
利用临时顺序节点的特性
一开始就创建一个lock名称的临时顺序节点,然后所有的线程过来都在该节点下创建同一个名的节点,他们会按顺序编号排列,这个时候判断自己当前是不是最小的节点名,如果是就获得锁并执行业务逻辑,最后释放锁,没有获得锁的线程就对自己的上一个编号节点进行监听。递归的方式
读写锁:就是读读不互斥,读写互斥
5、开发中使用的哭护短开发框架Ccurator。Curator项目是现在ZooKeeper客户端中使用最多,对ZooKeeper版本支持最好的第三方客户端。
Curator把我们平时常用的很多ZooKeeper服务开发功能做了封装,例如Leader选举、分布式计数器、分布式锁。这就减少了技术人员在使用ZooKeeper时的大部分底层细节开发工作。在会话重新连接、Watch反复注册、多种异常处理等使用场景中,用原生的ZooKeeper处理比较复杂。而在使用Curator时,由于其对这些功能都做了高度的封装,使用起来更加简单,不但减少了开发时间,而且增强了程序的可靠性。



