云服务器

ZooKeeper介绍与使用

2019-12-04 14:18:39 131

背景

在使用ZooKeeper(以下简称zk)之前,首先就需要了解zk的相关背景,只有了解了它的背景才能很好地理解为什么要做这样一个项目出来而且得到了业界的认可和大规模使用。可以先看看维基百科里面,有关 ZooKeeper 的介绍,以下内容摘自wiki百科:

Apache ZooKeeper是Apache软件基金会的一个软件项目,他为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。ZooKeeper曾经是Hadoop的一个子项目,但现在是一个独立的顶级项目。ZooKeeper的架构通过冗余服务实现高可用性。因此,如果第一次无应答,客户端就可以询问另一台ZooKeeper主机。ZooKeeper节点将它们的数据存储于一个分层的命名空间,非常类似于一个文件系统或一个前缀树结构。客户端可以在节点读写,从而以这种方式拥有一个共享的配置服务。更新是全序的。使用ZooKeeper的公司包括Rackspace、雅虎[2]和eBay,以及类似于象Solr这样的开源企业级搜索系统。

不知道大家看完zk的介绍有什么感觉,反正我看完了还是对zk没有一个比较清晰的了解和概念,说白了就是不知道在实际项目工作中有什么用。经过一段时间的研究和文档查阅,我自己总结了一些有助于理解zk的内容,大家可以参考一下。

zk他是一个针对大型分布式计算场景的项目,大家可以先把关注点放在分布式这个关键点上,何为分布式,说得通俗了就是一大堆服务器,那么有了一大堆服务器后,我们用什么方法手段去管理这堆服务器?如何协调它们去工作(计算)?服务器的加入、退出如何管理?等等都是围绕着对服务器群体的管理控制。

我们先根据实际的工作情况假设一种场景,现在有几十台(甚至上百、上千台)服务器,首先我们需要维护服务器的在线状态,哪些服务器在线工作,哪些掉线了无法正常服务,这是许多集群项目最常见也必须要有的功能需求了;其次,如何把任务分发到对应的服务器去执行,然后把结果反馈汇总,这也是分布式计算的基础功能需求。上面所说的都是分布式集群常见、通用的共性需求。一般我们要实现的话,通常会这样来实现,先确定一个中心管理者的角色(通常叫master),然后其他服务器则是从的角色(通常叫slaver),master负责管理、下发指令slaver,slaver都连接到master(通常会使用tcp的长连接方式,当连接建立、断开了需要得到相关的通知进行管理),如此类推自己需要实现一个网络模型框架(通常是tcp网络模型),然后还要去设计master和slaver之间的报文传输协议、机制,除此之外还要考虑中心master宕机的灾备切换功能等等,这样下来需要开发的东西不少,还包含了设计、编码、调试等工作是一个不少的投入。

因为分布式集群往往都有这些共性的需求,所以zk项目就应运而生,提供了分布式集群常见所需的功能框架服务,使用者不用再开发底层代码,只需要使用它所提供的服务或者API做二次开发即可满足所需的分布式集群管理的功能需求。

介绍

讲完背景之后,再介绍zk就会水到渠成,能更好的理解为什么zk要提供这样的功能和服务。

架构




经典的C/S架构,跟我们日常项目一样,zk里面也是有 server 和 client 两个角色,client比较好理解,被管理的服务器设备,安装了zk程序(zk程序既包含了server和包含了client,通过不同的启动脚本运行server还是client);server就是管理者,从图片可以看出红色的是leader,其他server则是follower,就是server角色设计成主从的方式,来避免单server的单点故障。一个时刻,只有一个server是leader,其他是从follower,server之间会同步相关信息,client既可以连接leader也可以连接follower,当leader宕机了,zk会有选举机制,选举出新的leader,通常server数量推荐奇数3、5、7….。

数据模型和命名空间


zk提供了一个类似文件系统的数据组织方式和命名空间,如上图所示,有的地方则说是文件系统,说法不重要,能表达出相关意思即可。从图可以看到,根是从 / 开始的,节点则是跟文件系统组织方式一样 /app1/p_1, /app1/p_2,……。许多人看到这里可能有个疑问,就是搞这个东西出来有什么用,可以先简单说一下,我们可以为每台服务器创建一个节点,这样分布式的集群管理就比较清晰明了,不仅如此还能延伸出更多的功能应用,下面使用会讲述。

CRUD

既然zk提供了上面类似文件系统的数据模型和命名空间,那么接下来就介绍最常见的CRUD功能了。

  • create指令
    create /path/path/node 创建一个节点
    带上 -e 参数代表创建的是临时节点,当client连接断开了,这个临时节点就会删除,利用这个功能特性,我们就可以很方便的做一个设备在线、离线状态监控了,只需要每台client都创建一个特定属于自己标识的临时节点,当节点存在代表设备client在线,当节点消失了代表对于的设备client离线。
    带上 -s 参数,创建的节点会自动加上10位序列号的递增数值,利用这个功能,可以很方便地做累计方面的数据统计。

  • delete指令
    delete /path/path/node 删除一个节点。

  • exists指令
    检查指定节点是否存在,这个很好理解不用过多解释了。

  • get/set data指令
    除了创建节点之外,节点还可以设置额外数据,这个额外数据,比如我们可以把设备client的IP地址等信息设置到这个节点里面,使用get指令可以获取出这个节点的额外数据。

上面列举的是常见的指令,都是比较简单明了,指令虽然简单,单可以组合使用实现许多功能需求。下面先介绍安装、使用,先让大家可以体验一番,以后的API使用再会详细讲述一些项目开发的实用功能。

安装

zk是用java编写的,所以安装之前先得把java环境搞好,这里以CentOS 7.5为例子,直接yum安装openJDK即可,不用配置啥东西了

yum install -y java-1.8.0-openjdk

安装完之后,执行一下

java -version

有返回版本号,没提示啥错误信息那就可以了。下面是下载zk压缩包
http://zookeeper.apache.org/releases.html#download
进去选择下载镜像,然后选择stable稳定版本下载

wget "http://apache.communilink.net/zookeeper/stable/zookeeper-3.4.12.tar.gz"

解压包,然后分别启动server、client即可

  1. tar zxf zookeeper-3.4.12.tar.gz

  2. cd zookeeper-3.4.12


  3. #用自带的sample生成一份配置文件

  4. cp conf/zoo_sample.cfg conf/zoo.cfg


  5. #不同server、client服务器需要预先配置好zk的端口白名单,模块端口是tcp 2181


  6. #启动server

  7. bin/zkServer.sh


  8. #启动client终端,会进入zk的命令行模式

  9. bin/zkCli.sh -server serverIP地址:端口(2181)

使用

下面我们简单使用一下create、get/set 节点

  1. #先 ls 一下根目录,目前有一个默认自带的 zookeeper

  2. [zk: 192.168.2.1:2181(CONNECTED) 0] ls /

  3. [zookeeper]


  4. #创建节点 /test1 携带数据 hello

  5. [zk: 192.168.2.1:2181(CONNECTED) 9] create /test1 "hello"

  6. Created /test1


  7. #查看创建的节点

  8. [zk: 192.168.2.1:2181(CONNECTED) 10] ls /

  9. [zookeeper, test1]


  10. #获取节点 /test1数据

  11. [zk: 192.168.2.1:2181(CONNECTED) 11] get /test1

  12. hello

  13. cZxid = 0x11

  14. ctime = Wed Sep 26 15:33:32 CST 2018

  15. mZxid = 0x11

  16. mtime = Wed Sep 26 15:33:32 CST 2018

  17. pZxid = 0x11

  18. cversion = 0

  19. dataVersion = 0

  20. aclVersion = 0

  21. ephemeralOwner = 0x0

  22. dataLength = 5

  23. numChildren = 0


  24. #删除节点 /test1

  25. [zk: 192.168.2.1:2181(CONNECTED) 12] delete /test1

  26. [zk: 192.168.2.1:2181(CONNECTED) 13] ls /

  27. [zookeeper]

测试临时节点,我们分别用2台不同的client连接上zk server,我们可以利用临时节点作为服务器在线、离线状态监测。

  1. #client 1 创建一个临时节点

  2. [zk: 192.168.2.1:2181(CONNECTED) 0] create -e /test1 "hello"

  3. Created /test1

  4. [zk: 192.168.2.1:2181(CONNECTED) 1] ls /

  5. [zookeeper, test1]

  6. [zk: 192.168.2.1:2181(CONNECTED) 2]


  7. #client 2 可以看到client 1创建的临时节点 /test1

  8. [zk: 192.168.2.1:2181(CONNECTED) 1] ls /

  9. [zookeeper, test1]


  10. #client 1 退出命令行终端,断开zk连接

  11. ctrl+d


  12. #client 2 再次查看 / 目录节点,发现已经没有 /test1 节点了

  13. #这里有一个小问题,就是client 1断开后,临时节点不是立马删除,

  14. #而是有几秒钟的延时,这里估计是有参数可以配置留待后面的教程继续深入探讨

  15. [zk: 192.168.2.1:2181(CONNECTED) 5] ls /

  16. [zookeeper]


睿江云官网链接:https://www.eflycloud.com/home?from=RJ0032

微信关注

获取更多技术咨询