Zookeeper
一、简介
可以用zookeeper来做:统一配置管理、统一命名服务、分布式锁、集群管理。
二、数据结构
跟Unix文件系统非常类似,可以看做是一棵树,每个节点叫做【ZNode】,每个节点可以通过路径来标识,结构图如下:
Znode分类:
1、短暂/临时【Ephemeral】:当客户端和服务端断开后,所创建的Znode(节点)会自动删除;
2、持久【Persistent】:当客户端和服务端断开后,所创建的Znode(节点)不会自动删除;
注意:Zookeeper和Redis一样,也是C/S结构【客户端/服务器】
三、监听器
Zookeeper需要配合监听器才能够做很多事。
常见的监听场景有以下两个方面:
1、监听ZNode节点的数据变化;
2、监听子节点的增减变化;
通过监听+Znode节点(短暂/持久),Zookeeper就可以有很多功能了。
四、统一配置管理、统一命名服务、分布式锁、集群管理
4.1、统一配置管理
【场景】做项目时候,会用到配置,比如数据库配置,我们会写死在项目里面,如果需要更改,也是修改配置文件后提交替换。如果是集群,有100台机器,逐个修改提交就不实际。就需要用到统一管理配置。
【解决思路】
1、把公共配置抽取出来;
2、对公共配置进行维护;
3、修改公共配置后,应用不需要重新部署。
【采用方案】
1、公共配置抽取存放于Zookeeper中并落地数据库
2、对公共配置修改后发布到Zookeeper中并落地数据库
3、对应用开启配置实时监听,Zookeeper配置文件一旦被修改,应用可实时听到并获取
4.2、统一命名服务
就是我们为某一部分资源,给它取一个名字,别人通过这个名字,就可以拿到对应的资源。
比如,现有一个域名 www.net.com
192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
别人访问www.net.com 即可访问到我的机器,而不是通过IP去访问。
4.3、分布式锁
我们可以用Zookeeper来实现分布式锁。系统A,B,C都去访问 /locks 节点。
访问的时候会创建带顺序号的临时节点,比如,系统A创建了id_000000 节点,系统B创建了id_000002 节点,系统C创建了 id_000001节点。
接着,拿到 /locks 节点下的所有子节点(id_000000,id_000001,id_000002),判断自己创建的是不是最小的那个节点。
1、如果是,则拿到锁。
释放锁:执行完操作后,把创建的节点给删除掉
2、如果不是,则监听比自己要小1的节点变化
【例子】:
4.4、集群管理
三个系统A、B、C,在ZooKeeper中创建临时节点。
只要系统A挂了,那么 /groupMember/A 这个节点就会删除,通过监听 groupMember 下的子节点,系统B和C就能够感知到系统A已经挂了。(新增也是同理)
除了能够感知节点的上下线变化,Zookeeper还可以实现动态选举Master的功能。(如果集群是主从架构模式下)
原理也是很简单,如果想要实现动态选举Master的功能,Znode节点的类型是带顺序号的临时节点就好了。
Zookeeper会每次选举最小编号的作为Master,如果Master挂了,自然对应的Znode节点就会删除,然后让新的最小编码作为Master,这样就可以实现动态选举功能了。