ZooKeeper的部署以及简单使用



http://sling2007.blog.163.com/blog/static/847327132013283163528/


ZooKeeper的部署以及简单使用  

2013-03-08 15:52:14|  分类:分布式/hadoop |  标签:|举报|字号 订阅

    要想使用ZooKeeper,首先就要把它部署在服务器上跑起来,就想ApacheTomcatFtpServer等服务器一样。ZooKeeper的部署方式主要有三种,单机模式、伪集群模式、集群模式。其实单机和伪集群都是集群模式的特殊情况。


一、 单机模式

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

1.编写配置文件zoo.cfg

    zookeeper-3.3.3/conf文件夹下面就是要编写配置文件的位置了。在文件夹下面新建一个文件zoo.cfgZooKeeper的运行默认是读取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.sh start

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

 

二、ZooKeeper的集群模式部署

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

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

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

2.编写配置文件

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

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

3.创建myid文件

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

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


4.执行运行脚本

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

./zkServer.sh start

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

 

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

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

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

zkCli.sh –server 202.115.36.251:2181

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

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

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

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

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

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

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

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

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

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

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

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

 

6. 使用Java API来访问ZooKeeper

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

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

 
   

import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper; public class T { public static void main(String[] args) throws Exception { // 创建一个与服务器的连接 ZooKeeper zk = new ZooKeeper("220.181.8.230:2181,220.181.8.149:2181,220.181.8.199:2181", 1000 * 60, new Watcher() { // 监控所有被触发的事件 public void process(WatchedEvent event) { 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(new String(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(new String(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.sh status 
          hadoop@slave-01:~/installation/zookeeper-3.3.4$ bin/zkServer.sh status  
  1. JMX enabled by default  
  2. Using config: /home/hadoop/installation/zookeeper-3.3.4/bin/../conf/zoo.cfg  
  3. Mode: follower  
  4.   
  5. hadoop@slave-02:~/installation/zookeeper-3.3.4$  bin/zkServer.sh status  
  6. JMX enabled by default  
  7. Using config: /home/hadoop/installation/zookeeper-3.3.4/bin/../conf/zoo.cfg  
  8. Mode: leader  
  9.   
  10. hadoop@slave-03:~/installation/zookeeper-3.3.4$  bin/zkServer.sh status  
  11. JMX enabled by default  
  12. Using config: /home/hadoop/installation/zookeeper-3.3.4/bin/../conf/zoo.cfg  
  13. Mode: follower 
8、清除zk状态
当在zk上已经做了很多事情,配置已经比较杂乱,现在想重新初始化一下,也就是把所有状态删除,步骤是:
8.1 关闭所有zk节点,用zkServer.sh status查看是否关闭
8.2 删除zoo.cfg定义的数据文件夹下的所有文件,除了myid文件外
8.3 启动zk节点
现在配置就重置了
9、常见问题:
9.1 在用zkCli.sh启动客户端时,Will not attempt to authenticate using SASL (无法定位登录配置)
这是由于没有启用用户验证导致的,不影响使用,但影响安全性。SASL 即:Simple Authentication and Security Layer


你可能感兴趣的:(分布式技术,JAVA技术)