您的位置:首页 > 数据库 > Redis

ZooKeeper的部署以及简单使用

2017-04-13 00:00 288 查看
要想使用ZooKeeper,首先就要把它部署在服务器上跑起来,就想Apache,Tomcat,FtpServer等服务器一样。ZooKeeper的部署方式主要有三种,单机模式、伪集群模式、集群模式。其实单机和伪集群都是集群模式的特殊情况。

一、单机模式

ZooKeeper的单机模式通常是用来快速测试客户端应用程序的,在实际过程中不可能是单机模式。单机模式的配置也比较简单。

1.编写配置文件zoo.cfg

zookeeper-3.3.3/conf文件夹下面就是要编写配置文件的位置了。在文件夹下面新建一个文件zoo.cfg。ZooKeeper的运行默认是读取zoo.cfg文件里面的内容的。以下是一个最简单的配置文件的样例:

tickTime=2000

dataDir=/var/zookeeper

clientPort=2181

在这个文件中,我们需要指定dataDir的值,它指向了一个目录,这个目录在开始的时候需要为空。下面是每个参数的含义:

tickTime:基本事件单元,以毫秒为单位。这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳。

dataDir:存储内存中数据库快照的位置,顾名思义就是Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。

clientPort:这个端口就是客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口,接受客户端的访问请求。

使用单机模式时用户需要注意:这种配置方式下没有ZooKeeper副本,所以如果ZooKeeper服务器出现故障,ZooKeeper服务将会停止。

2.执行运行脚本

在zookeeper-3.3.3/bin文件夹下面运行zkServer.sh即可,运行完毕之后则ZooKeeper服务变启动起来。

./zkServer.shstart

脚本默认调用zoo.cfg里面的配置,因此程序正常启动。

二、ZooKeeper的集群模式部署

ZooKeeper的集群模式下,多个Zookeeper服务器在工作前会选举出一个Leader,在接下来的工作中这个被选举出来的Leader死了,而剩下的Zookeeper服务器会知道这个Leader死掉了,在活着的Zookeeper集群中会继续选出一个Leader,选举出Leader的目的是为了可以在分布式的环境中保证数据的一致性。

l.确认集群服务器的数量

由于ZooKeeper集群中,会有一个Leader负责管理和协调其他集群服务器,因此服务器的数量通常都是单数,例如3,5,7...等,这样2n+1的数量的服务器就可以允许最多n台服务器的失效。

2.编写配置文件

zookeeper-3.3.3/conf文件夹下面(可以把默认的zoosample.cfg复制一份到zoo.cfg),配置文件zoo.cfg需要在每台服务器中都要编写,以下是一个配置文件的样本:

#Filenamezoo.cfg

tickTime=2000

dataDir=/home/zookeeper/data

clientPort=2181

initLimit=5

syncLimit=2

server.1=202.115.36.251:2888:3888

server.2=202.115.36.241:2888:3888

server.3=202.115.36.242:2888:3888

initLimit:这个配置项是用来配置Zookeeper接受客户端(这里所说的客户端不是用户连接Zookeeper服务器的客户端,而是Zookeeper服务器集群中连接到Leader的Follower服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过10个心跳的时间(也就是tickTime)长度后Zookeeper服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是5*2000=10秒。

syncLimit:这个配置项标识Leader与Follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是2*2000=4秒

server.A=B:C:D:其中A是一个数字,表示这个是第几号服务器;B是这个服务器的ip地址;C表示的是这个服务器与集群中的Leader服务器交换信息的端口;D表示的是万一集群中的Leader服务器挂了,需要一个端口来重新进行选举,选出一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于B都是一样,所以不同的Zookeeper实例通信端口号不能一样,所以要给它们分配不同的端口号。

3.创建myid文件

除了修改zoo.cfg配置文件,集群模式下还要配置一个文件myid,这个文件在dataDir目录下,这个文件里面就只有一个数据就是A的值,Zookeeper启动时会读取这个文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是那个server。这个myid的值要和配置文件中的server.x=ip:port:port中的x一致。

在251的dataDir执行:echo"1">myid

4.执行运行脚本

和单机模式下的运行方式基本相同,值得注意的地方就是要分别在不同服务器上执行一次,例如分别在251,241,242上运行:

./zkServer.shstart

这样才能使得整个集群启动起来。

5.通过ZooKeeper命令行工具访问ZooKeeper

ZooKeeper命令行工具类似于Linux的shell环境,不过功能肯定不及shell啦,但是使用它我们可以简单的对ZooKeeper进行访问,数据创建,数据修改等操作。

当启动ZooKeeper服务成功之后,输入下述命令,连接到ZooKeeper服务:

zkCli.sh–server202.115.36.251:2181

连接成功后,系统会输出ZooKeeper的相关环境以及配置信息,并在屏幕输出“WelcometoZooKeeper”等信息。

命令行工具的一些简单操作如下:

1)使用ls命令来查看当前ZooKeeper中所包含的内容:

[zk:202.115.36.251:2181(CONNECTED)1]ls/

2)创建一个新的znode,使用create/zkmyData。这个命令创建了一个新的znode节点“zk”以及与它关联的字符串:

[zk:202.115.36.251:2181(CONNECTED)2]create/zk"myData"

3)我们运行get命令来确认znode是否包含我们所创建的字符串:

[zk:202.115.36.251:2181(CONNECTED)3]get/zk

4)下面我们通过set命令来对zk所关联的字符串进行设置:

[zk:202.115.36.251:2181(CONNECTED)4]set/zk"zsl"

5)下面我们将刚才创建的znode删除:

[zk:202.115.36.251:2181(CONNECTED)5]delete/zk

6.使用JavaAPI来访问ZooKeeper

API访问ZooKeeper才是客户端主要的使用手段,通过在客户端编写丰富多彩的程序,来达到对ZooKeeper的利用。这里给出一个简单的例子:

可以通过客户端脚本,连接到ZooKeeper集群上。对于客户端来说,ZooKeeper是一个整体(ensemble),连接到ZooKeeper集群实际上感觉在独享整个集群的服务,所以,你可以在任何一个结点上建立到服务集群的连接


importorg.apache.zookeeper.CreateMode;importorg.apache.zookeeper.WatchedEvent;importorg.apache.zookeeper.Watcher;importorg.apache.zookeeper.ZooDefs.Ids;importorg.apache.zookeeper.ZooKeeper;publicclassT{publicstaticvoidmain(String[]args)throwsException{//创建一个与服务器的连接ZooKeeperzk=newZooKeeper("220.181.8.230:2181,220.181.8.149:2181,220.181.8.199:2181",1000*60,newWatcher(){//监控所有被触发的事件publicvoidprocess(WatchedEventevent){System.out.println("已经触发了"+event.getType()+"事件!");}});//创建一个目录节点zk.create("/testRootPath","testRootData".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);//创建一个子目录节点zk.create("/testRootPath/testChildPathOne","testChildDataOne".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);System.out.println(newString(zk.getData("/testRootPath",false,null)));//取出子目录节点列表System.out.println(zk.getChildren("/testRootPath",true));//修改子目录节点数据zk.setData("/testRootPath/testChildPathOne","modifyChildDataOne".getBytes(),-1);System.out.println("目录节点状态:["+zk.exists("/testRootPath",true)+"]");//创建另外一个子目录节点zk.create("/testRootPath/testChildPathTwo","testChildDataTwo".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);System.out.println(newString(zk.getData("/testRootPath/testChildPathTwo",true,null)));//删除子目录节点zk.delete("/testRootPath/testChildPathTwo",-1);zk.delete("/testRootPath/testChildPathOne",-1);//删除父目录节点zk.delete("/testRootPath",-1);//关闭连接zk.close();}}

7.查看zookeeper的各节点状态
可以通过ZooKeeper的脚本来查看启动状态,包括集群中各个结点的角色(或是Leader,或是Follower),如下所示,是在ZooKeeper集群中的每个结点上查询的结果:zkServer.shstatus
hadoop@slave-01:~/installation/zookeeper-3.3.4$bin/zkServer.shstatus

JMXenabledbydefault

Usingconfig:/home/hadoop/installation/zookeeper-3.3.4/bin/../conf/zoo.cfg

Mode:follower

hadoop@slave-02:~/installation/zookeeper-3.3.4$bin/zkServer.shstatus

JMXenabledbydefault

Usingconfig:/home/hadoop/installation/zookeeper-3.3.4/bin/../conf/zoo.cfg

Mode:leader

hadoop@slave-03:~/installation/zookeeper-3.3.4$bin/zkServer.shstatus

JMXenabledbydefault

Usingconfig:/home/hadoop/installation/zookeeper-3.3.4/bin/../conf/zoo.cfg

Mode:follower

8、清除zk状态
当在zk上已经做了很多事情,配置已经比较杂乱,现在想重新初始化一下,也就是把所有状态删除,步骤是:
8.1关闭所有zk节点,用zkServer.shstatus查看是否关闭
8.2删除zoo.cfg定义的数据文件夹下的所有文件,除了myid文件外
8.3启动zk节点
现在配置就重置了
9、常见问题:
9.1在用zkCli.sh启动客户端时,WillnotattempttoauthenticateusingSASL(无法定位登录配置)
这是由于没有启用用户验证导致的,不影响使用,但影响安全性。SASL即:SimpleAuthenticationandSecurityLayer

源码来源:minglisoft.cn/technology
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息