Zookeeper理解

ZooKeeper可以来做:统一配置管理、统一命名服务、分布式锁、集群管理。
ZooKeeper的数据结构,跟Unix文件系统非常类似,可以看做是一颗树,每个节点叫做ZNode。每一个节点可以通过路径来标识,结构图如下:


image.png

节点

ZooKeeper的节点我们称之为Znode,Znode分为两种类型:

  • 短暂/临时(Ephemeral):当客户端和服务端断开连接后,所创建的Znode(节点)会自动删除
  • 持久(Persistent):当客户端和服务端断开连接后,所创建的Znode(节点)不会删除

监听器

常见的监听场景有以下两项:

  • 监听Znode节点的数据变化
  • 监听子节点的增减变化


    image.png

    image.png

通过监听+Znode节点(持久/短暂[临时]),就可以完成统一配置管理、统一命名服务、分布式锁、集群管理...

服务

统一配置管理

比如我们现在有三个系统A、B、C,他们有三份配置,分别是ASystem.yml、BSystem.yml、CSystem.yml,然后,这三份配置又非常类似,很多的配置项几乎都一样。此时,如果我们要改变其中一份配置项的信息,很可能其他两份都要改。并且,改变了配置项的信息很可能就要重启系统。于是,我们希望把ASystem.yml、BSystem.yml、CSystem.yml相同的配置项抽取出来成一份公用的配置common.yml,并且即便common.yml改了,也不需要系统A、B、C重启。

做法:我们可以将common.yml这份配置放在ZooKeeper的Znode节点中,系统A、B、C监听着这个Znode节点有无变更,如果变更了,及时响应。

image.png

统一命名服务

统一命名服务的理解其实跟域名一样,是我们为这某一部分的资源给它取一个名字,别人通过这个名字就可以拿到对应的资源。比如说,现在我有一个域名www.java3y.com,但我这个域名下有多台机器:

192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
别人访问www.java3y.com即可访问到我的机器,而不是通过IP去访问。

分布式锁

我们可以使用ZooKeeper来实现分布式锁,那是怎么做的呢??下面来看看:

系统A、B、C都去访问/locks节点
image.png

访问的时候会创建带顺序号的临时/短暂(EPHEMERAL_SEQUENTIAL)节点,比如,系统A创建了id_000000节点,系统B创建了id_000002节点,系统C创建了id_000001节点。

image.png

接着,拿到/locks节点下的所有子节点(id_000000,id_000001,id_000002),判断自己创建的是不是最小的那个节点。如果是,则拿到锁,执行完操作后,把创建的节点给删掉,删除的时候会触发Watch。如果不是,则监听比自己要小1的节点变化。

集群状态

image.png

有A、B、C三个系统,每个系统对应一个节点。只要系统A挂了,那/groupMember/A这个节点就会删除,通过监听groupMember下的子节点,系统B和C就能够感知到系统A已经挂了。(新增也是同理)。
除了能够感知节点的上下线变化,ZooKeeper还可以实现动态选举Master的功能。(如果集群是主从架构模式下)原理也很简单,如果想要实现动态选举Master的功能,Znode节点的类型是带顺序号的临时节点(EPHEMERAL_SEQUENTIAL)就好了。Zookeeper会每次选举最小编号的作为Master,如果Master挂了,自然对应的Znode节点就会删除。然后让新的最小编号作为Master,这样就可以实现动态选举的功能了。

ACL

acl是Access control lists 的缩写,也就是权限控制列表

zk的acl通过 [scheme:id:permissions] 来构成权限列表:
scheme:代表采用的某种权限机制
id:代表允许访问的用户
permissions:权限组合字符串

acl的构成-scheme,scheme有以下几种类型:

  • world:world下只有一个id,即只有一个用户,也就是anyone,那么组合的写法就是 world:anyone:[permissions]
    例如:

setAcl /testDir/testAcl world:anyone:crwa # 设置该节点的acl权限

  • ip:当设置为ip指定的ip地址,此时限制ip进行访问,比如ip:192.168.77.130:[permissions]
    例如:

setAcl /names/testip ip:192.168.190.129:cdrwa # 使用ip来设置权限,相当于白名单

  • auth:代表认证登录,需要注册用户获取权限后才可以登录访问,形式为 auth:userpassword:[permissions]
    例如:

addauth digest user1:123456 # 需要先添加一个用户
setAcl /testDir/testAcl auth:user1:123456:crwa # 然后才可以拿着这个用户去设置权限

  • digest:需要对密码加密才能访问,组合形式为:digest:username:BASE64(SHA1(password)):[permissions]
    例如:

setAcl /names/testDigest digest:user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=:crwa # 使用digest来设置权限

auth与digest的区别就是,前者使用明文密码进行登录,后者使用密文密码进行登录。setAcl /path auth:lee:lee:cdrwa 与 setAcl /path digest:lee:BASE64(SHA1(password)):cdrwa是等价的,在通过 addauth digest lee:lee 后都能操作指定节点的权限。在实际情况中,digest要更为常用一些。

  • super:代表超级管理员,拥有所有的权限

acl的构成-permissions:

权限字符串缩写 crdwa :

  • CREATE:创建子节点权限
  • READ:访问节点/子节点权限
  • WRITE:设置节点数据权限
  • DELETE:删除子节点权限
  • ADMIN:管理员权限

ACL命令:
getAcl 获取某个节点的acl权限信息
setAcl 设置某个节点的acl权限信息
addauth 输入认证授权信息,注册时输入明文密码(登录),但是在zk的系统里,密码是以加密后的形式存在的

另一篇讲的比较好的:https://www.cnblogs.com/takumicx/p/9508706.html#2-zookeeper%E9%9B%86%E7%BE%A4%E8%A7%92%E8%89%B2

你可能感兴趣的:(Zookeeper理解)