分布式协调服务zookeeper知识总结

1.zookeeper简介:

1.zookeeper:

Zookeeper是一个分布式协调服务;就是为用户的分布式应用程序提供协调服务。
A、zookeeper是为别的分布式程序服务的
B、Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,zk就能正常服务)
C、Zookeeper所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统一名称服务……
D、虽然说可以提供各种服务,但是zookeeper在底层其实只提供了两个功能:
(1)管理(存储,读取)用户程序提交的数据;
(2) 并为用户程序提供数据节点监听服务;

2.zookeeper应用场景:
共同点:(1)提供监听 (2)数据保管
这里写图片描述
这里写图片描述

而zookeeper本身就是这么个第三方的程序,具有高可靠性和可用性的特点。它本身就是个集群程序,只有有半数以上的节点存活,那么就能正常服务。节点数一般是奇数(至少三台)。

zookeeper集群的角色: leader 和 follower (observer)
只要集群中有半数以上节点存活,集群就能提供服务。

2.zookeeper安装:

  1. 首先准备三台服务器(至少三个节点才能提供可靠地zookeeper)
  2. 安装JDK,因为zookeeper是java程序
  3. 安装zookeeper
    zookeeper的安装我会单独写一篇出来,这里就是占个位置!

3..zookeeper集群角色分配原理:

这里写图片描述

  1. 会有主从结构,一个主,剩下的是从。但是如果不进行手动配置的话,zookeeper本身可以实现主从选举(算法:经PAXOS简化成为Zab)
  2. 过程:假设首先打开mini1这台机器,这个时候mini1就会通过广播来查看有多少台zookeeper服务器在运行,然后发现只有它自己。(但是它的配置文件中写的是有三台)然后进行投票,因为只有它自己运行着,所以票投给了自己,但是集群中一共三台,必须半数以上才可以,所以即使收到了自己投的一票也不行,得等着。直到我们把mini2打开,这时候又需要投票了,内部机制是尽量把票投给ID号大的,所以最后的结果是mini2得票多,当选为leader,mini1为follower。当mini3启动的时候发现集群有了leader,所以,这时候mini3也是follower。
    当有数据要写入zookeeper时,都要传给leader,然后leader会将数据传给所有follower,每个都进行复制保存,以保持数据存储一致。
    注意:
    zookeeper在集群数量很大的时候,保持数据一致所需要的时间会比较长。所以,zookeeper不适合用于数据更新极为频繁和数据一致性非常严格的场景。
  3. 综上,zookeeper安装需要手动配置的信息有(红色的):
    (1)每台zookeeper的ID(比如mini1的ID就是myid=1)
    (2) 每台上面关于集群的配置文件(有多少台zookeeper服务器)
    主从不需要配置,是集群内部自己决定的。

4.zookeeper的命令行客户端:

  1. 注意:在使用命令行客户端之前需要将服务端启动!否则一直提示重新连。挨个启动zookeeper服务器之后就会提示leader是哪个。
    这里写图片描述
  2. 在客户端中:
    help 可以显示很多信息帮助使用

5.zookeeper中的数据结构:

zookeeper中的数据是有自己的格式的:

  1. 层次化的目录结构,命名符合常规文件系统规范(见下图)
    这里写图片描述
  2. 每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
  3. 节点Znode可以包含数据和子节点(但是EPHEMERAL类型的节点不能有子节点,下一页详细讲解),任何一个节点都可以保存一份数据。
    这里写图片描述
    这里写图片描述
  4. 客户端应用可以在节点上设置监视器.

    注意:客户端上面在添加创建节点并附加节点数据的时候有空格时,空格后面的就不算了!

  5. 节点类型:
    (1)Znode有两种类型:
    短暂(ephemeral)(断开连接自己删除) 创建时加入-e参数
    create -e …
    持久(persistent)(断开连接不删除)
    比如:服务器连接zookeeper时候建立的节点就是短暂节点,那么当断开连接的时候,节点就会自己删除。这时候该节点的父节点就会触发一个事件通知自己,要调整了!
    (2)Znode有四种形式的目录节点(默认是persistent )
    PERSISTENT
    PERSISTENT_SEQUENTIAL(持久序列/test0000000019 ) 创建时加-s参数 create -s …
    EPHEMERAL
    EPHEMERAL_SEQUENTIAL
    这里写图片描述
    这里写图片描述
    (3)创建znode时设置顺序标识,znode名称后会附加一个值,顺序号是一个单调递增的计数器,由父节点维护.
    (4) 在分布式系统中,顺序号可以被用于为所有的事件进行全局排序,这样客户端可以通过顺序号推断事件的顺序.

注意:临时节点不能是创建永久的子节点的.

扫描二维码关注公众号,回复: 2202700 查看本文章

6.命令:(记不住了就用help来查)
quit 退出客户端
help 给出命令的提示等

    创建节点:  create [-s] [-e]  节点路径名称 节点内容  (有个acl代表权限)

    查看节点的子节点:  ls 节点路径

    获取节点内容: get 节点路径

    更新节点内容:set 节点路径 更新后的内容

    监听:  跟在各命令之后的watch(watch类型有很多,但是做应用开发的话主要用到的是数据变化和节点变化,也就是跟在get 和 ls 后面的watch) 

这里写图片描述

注意:这个监听只生效一次,并且watch跟在get后面,所以只有在节点内容发生变化的时候才会有监听提醒,而如果是增加子节点是不会提醒的。

  还有一部分是zookeeper在java客户端中的代码,那个之后贴上来~

猜你喜欢

转载自blog.csdn.net/katrina_ali/article/details/80560578