ZooKeeper相关整理

一. 简介

        ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop家族的重要一员。Hadoop及家族项目的命名也特别有意思,Hadoop(大象)下包括:Hive(蜜蜂) ——数据仓库工具、Pig(小猪)——Hadoop客户端,类似于SQL的面向数据流的Pig Latin语言等等、顾名思义zookeeper是整个Hadoop动物园的管理员。

二.安装部署

      ZooKeeper是以Fast Paxos算法为基础的,解决了著名的算法-拜占庭将军问题(有兴趣的同学可以百度一下),zookeeper本身提供分布式协调管理服务,在项目系统中别的组件对其有很大的依赖性,因此本身需要特别稳定,zookeeper集群本身具有过半存活属性,只要挂掉的机器不超过整个集群的一半,剩下的机器组成的集群仍然能对外提供稳定的服务,因此本身zookeeper的部署都是集群模式的,并且部署的集群数量尽量要是奇数,因为偶数挂掉一半机器之后满足不了过半存活会形成集群脑裂。当然自己学习的时候也可以在自己电脑只装一个单机版,通常建议装单机版的伪集群模式,体验上是跟生产上的集群模式是一样的。下面说下实际Linux系统下集群模式的安装,按照最小满足zookeeper过半存活特性的最小奇数3台机器举例。

      1.检查java环境。因为zookeeper是java语言写的,因此首先需要搭建java环境,要注意不同版本的zookeeper对jdk的版本是有要求的。目前最稳定的                            zookeeper版本是3.4.6版本。

      2.将Apache官网下载的zookeeper包解压到服务器,类似目录  /home/zookeeper-3.4.6

      3.跳到zookeeper根目录下的conf文件下,将 zoo_sample.cfg文件重命名为zoo.cfg,  mv /home/zookeeper-3.4.6/conf/zoo_sample.cfg    zoo.cfg

      4.编辑zoo.cfg,此文件是zookeeper的配置文件,vi  zoo.cfg  修改或增加一下内容:

              dataDir=/home/zookeeper-3.4.6/data  (在zookeeper根目录下新建一个data文件夹)

              dataLogDir=/home/zookeeper-3.4.6/log  (在zookeeper根目录下新建一个log文件夹)

            server.1=1.2.3.4:2888:3888      (第一台机器的实际配置信息  ip:端口号 :端口号  两个端口号一个是集群间通信的  一个是自己机器的)

            server.2=1.2.3.5:2888:3888      (第二台)

            server.3=1.2.3.6:2888:3888        (第二台)

        这里要注意下server.1这个后缀,表示的是1.2.3.4这个机器,对应相关机器中的server id是1,不要忘记配置!!

      5.创建数据目录:mkdir /home/zookeeper-3.4.6/data

      6.在data目录下创建myid文件,写入当前机器的serverid ,分别写入1、2、3 。Windows下面就是新建一个txt写上数字后将.txt后缀去掉即可。Linux下 vi myid              填完数字 保存退出即可。

      7.启动zookeeper,开启动物管理员的上岗之路  /home/zookeeper-3.4.6/bin/zkServer.sh start    这里要多说一点,由于配置的是集群模式,因此需要到每台机器          上去启动zookeeper,假设在配置文件里配置了3台机器,在网络没问题的情况下,当最后一台机器启动起来之前,之前启动的每一台机器的控制台都会不停              的刷心跳日志,这是因为集群心跳检测集群中的机器是否都健在,第一次启动的时候可能会觉得奇怪,这个是正常的,只要之前每一步都正确配置,当                      集群中最后一台机器启动之后,所有的机器的控制台会停止刷新报错日志。

      8.检查是否成功运行  /home/zookeeper-3.4.3/bin/zkCli.sh 或 echo stat|nc localhost 2181 (会zookeeper四字命令的也可以用四字命令查看集群状态)

      9.其他 ——设置服务器自动启动服务 

        cd 命令切换到/etc/rc.d/init.d/ ,接着用touch zookeeper创建一个文件

        chmod +x zookeeper        vi zookeeper  (编写以下内容)

            #!/bin/bash

            #chkconfig:2345 20 90

            #description:zookeeper

            #processname:zookeeper

            case $1 in

            start) su root /home/zookeeper-3.4.6/bin/zkServer.sh start;;

            stop) su root /home/zookeeper-3.4.6/bin/zkServer.sh stop;;

            status) su root /home/zookeeper-3.4.6/bin/zkServer.sh status;;

            restart) su root /home/zookeeper-3.4.6/bin/zkServer.sh restart;;

            *)  echo "require start|stop|status|restart"  ;;

            esac

        chkconfig --add zookeeper命令把zookeeper添加到开机启动里面

        chkconfig --list 来看看我们添加的zookeeper是否在里面

      10.单机版的伪集群模式跟实际的集群模式类似,集群模式会了之后单机版的很简单,在自己电脑上这几个安装包里的端口号注意不要重复就行。

三.zookeeper其他、及运维说明

    1.zoo.cfg 配置文件中中 maxClientCnxns=100 ZK单个服务器的最大连接数设成0则不受连接数限制,其它还有很多参数的具体配置方法这里不具体说明了。

    2.清理DATA和log :从3.4.0开始,zookeeper提供了自动清理snapshot和事务日志的功能,通过配置autopurge.snapRetainCount和autopurge.purgeInterval这            两个参数能够实现定时清理了。这两个参数都是在zoo.cfg中配置的:

        autopurge.purgeInterval这个参数指定了清理频率,单位是小时,需要填写一个1或更大的整数,默认是0,表示不开启自动清理功能。

        autopurge.snapRetainCount这个参数和上面的参数搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个。

    3.ZK节点添加权限,zookeeper是一个路径形式的层级目录结构,每一个具体路径下都有一个zk节点,只可以可以存储几兆数据,因此不能用                                        zookeeper来当存储,节点上的数据量多了之后也会影响其性能。zk节点可以针对每个节点设置权限,并且节点权限不是继承的,设置父节点权限,其子节点          不继承父节点的权限。对zk节点上的数据有安全要求的系统可以添加权限。

        zookeeper提供了几种认证方式:(1) world :  有单一ID,anyone表示任何人

                                                            (2) auth  : 不使用任何ID,表示任何通过验证的用户

                                                            (3)digest :  使用户名 密码 字符串生成MD5哈希值作为ACL标识符ID.权限的验证通过直接发送用户名和密码字符串方式                                                                                          完成

                                                              (4)  ip      : 使用客户端主机ip地址作为一个ACL标识符,ACL表达式是以add/bits这种格式表示的。ZK服务器会将addr的                                                                                      前bits位与客户端地址的前bits位来进行匹配验证权限。

        添加权限的代码示例:

                      List acls =newArrayList(2);

                      Id id1 =newId("digest", DigestAuthenticationProvider.generateDigest("admin:admin123"));

                      ACL acl1 =newACL(ZooDefs.Perms.ALL, id1);

                      Id id2 =newId("digest", DigestAuthenticationProvider.generateDigest("guest:guest123"));

                      ACL acl2 =newACL(ZooDefs.Perms.READ, id2);

                      acls.add(acl1);

                      acls.add(acl2);

                      ZooKeeper zk =newZooKeeper("127.0.0.1:2181",10000,newDefaultWatcher());

                      zk.create("/test",newbyte[0], acls, CreateMode.PERSISTENT);

        登录Zookeeper读取节点数据时:

                    ZooKeeper zk =newZooKeeper("127.0.0.1:2181",10000,newDefaultWatcher());

                    zk.addAuthInfo("digest","guest:guest123".getBytes());

                    byte[] value = zk.getData("/test",null,newStat());

            4.zookeeper运维四字命令相关,可以方便快速的查询和排查问题。




        5.实际开发中感觉zookeeper原生的api客户端不够完善,实现一些功能需要自己敲大量代码,而且容易出现一些问题。这里给大家推荐——Curator。Curator是            Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeeper客户端的开发量。

四.Zookeeper典型8大应用场景及对应特性:

      1.数据发布订阅:对统一配置信息数据可以通过zookeeper创建一个数据节点并让客户端进行监听,主要利用了zookeeper的watcher监听特性。

      2.负载均衡:创建一个节点,负载应用把自己的服务器地址写到此节点下,如果此应用挂掉,此节点消失,这里也可以用于实现fail over(故障切换)。

      3.命名服务:利用zookeeper创建顺序无重复节点的特性。这里多说一点,zk节点分为两大类:永久节点和临时节点,然后各自又有有序和无序节点,以此也可                              以说zk节点一共有四种。

      4.分布式协调/通知:不同的客户端都对zookeeper上的同一数据节点进行watcher注册,监听数据节点的变化,当发生变化时,所有订阅的客户端都会收到通知                                          并进行处理,这里利用的watcher监听特性。

      5.集群管理:利用watcher监听与临时节点在会话失效后自动清除的特性。同时,各服务器可以将自己的运行状态信息写入到自己机器对应的临时节点中,进而                              有助于Leader收集机器信息,可以用来管理集群机器的整体配置、负载、切换等。

      6.Master选举:所有的客户端创建同一个path的数据节点,只有一个能成功,即为Master。原理同实现分布式锁。

      7.分布式锁:创建临时节点,由于相同名称的节点只能创建一个,谁成功即获得锁。另外,根据创建时不同的类型—序号,根据一定的规则可以模拟出共享锁,                            读写锁。

      8.分布式队列:每个客户端在指定节点下创建临时节点,然后获取该指定节点下的所有子节点并判断自己是否是序号最小的节点,若果是则可以进行处理,如果                                不是则进行等待并监听比自己序号小的最后一个节点,待接到最后一个最小序号消失的watcher通知后,重复检查。

现在由于zookeeper自身的完善及优秀的特性,很多其他的中间件或者系统都在自身的集群模式下的集群管理都将zookeeper集成到自身中,作为自身集群管理或者自身系统服务管理的重要基础组件,Apache Hbase和 Apache Solr 以及LinkedIn sensei 等项目中都采用到了 Zookeeper。

推荐阅读更多精彩内容