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
一、单机模式
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:存储内存中
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命令行工具类似于
当启动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.使用
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
相关文章推荐
- ZooKeeper的部署以及简单使用
- ZooKeeper的部署以及简单使用
- ZooKeeper的部署以及简单使用
- 在CentOS7部署zookeeper集群以及简单API使用
- 在CentOS7部署zookeeper集群以及简单API使用
- ZooKeeper的部署以及简单使用
- ZooKeeper的部署以及简单使用
- httpsqs(quequ)队列部署以及简单使用
- zookeeper的简单安装以及基于intellij idea的可视化工具的使用
- zookeeper 学习笔记001(部署和简单的使用)
- 分布式编程—Zookeeper部署以及几种经典使用场景
- zookeeper的简单部署与使用
- 通过shell脚本批量部署ssh私钥认证以及批量操作工具pssh的简单使用
- Zookeeper命令行以及java API简单使用
- HBase的安装部署以及简单使用
- 使用vs2005 webservice 创建,部署,调用的简单实例
- OpenStack Swift All In One安装部署流程与简单使用
- 关于ios的autoLayout的一些简单介绍以及使用方法
- SharedPreferences的简单使用以及官方API给出的使用方法
- log4j的简单的例子~以及使用log4j和不使用log4j的对比