Zookeeper

发布时间 2023-09-13 16:53:44作者: 木乃伊人

一、简介

       可以用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,这样就可以实现动态选举功能了。