zookeeper安装

1       安装Java

1.1   说明

如果当前系统是64位系统,则需要下载java 64位,如果是32为系统,则下载32位java

1.2   下载地址

http://download.oracle.com/otn-pub/java/jdk/8u60-b27/jdk-8u60-linux-x64.tar.gz?AuthParam=1441181276_f4feb8f1d52f29ddf599f873d06883a9

1.3   安装

下载完毕,直接解压,并将文件名称重新命名为java

1.4   配置

在环境变量中增加Java_home,classPath,

  1. export JAVA_HOME=/usr/local/java
  2. export TOMCAT_HOME=/usr/local/apache-tomcat-8.0.26
  3. export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6
  4.  
  5. export PATH=$JAVA_HOME/bin:$PATH:$JSTORM_HOME/bin:$ZOOKEEPER_HOME/bin
  6. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$ZOOKEEPER_HOME/lib

2       安装zeekeeper

2.1   说明

目前zeekeeper的 稳定版本是3.4.6

2.2   下载地址

http://www.us.apache.org/dist/zookeeper/stable/zookeeper-3.4.6.tar.gz

2.3   安装

压缩包代码直接解压

2.4   配置

在环境变量中增加zookeeper_home,classPath,

  1. export JAVA_HOME=/usr/local/java
  2. export HADOOP_HOME=/usr/local/hadoop
  3. export ZOOKEEPER_HOMOE=/usr/local/zookeeper
  4. export PATH=.:$HADOOP_HOME/bin:$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf
  5. export HADOOP_COMMON_LIB_NATIVE_DIR=/usr/local/hadoop/lib/native
  6. export HADOOP_OPTS="-Djava.library.path=/usr/local/hadoop/lib"

搭建Zookeeper集群

2.5   说明

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

2.6   下载地址

http://apache.dataguru.cn/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

2.7   安装

安装参考:

http://blog.csdn.net/hi_kevin/article/details/7089358

       http://blog.csdn.net/hi_kevin/article/details/7089358

2.8   配置

在环境变量中增加tomcat_home,classPath,

  1. export JAVA_HOME=/usr/local/java
  2. export TOMCAT_HOME=/usr/local/apache-tomcat-8.0.26
  3. export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6
  4.  
  5. export PATH=$JAVA_HOME/bin:$PATH:$JSTORM_HOME/bin:$ZOOKEEPER_HOME/bin
  6. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$ZOOKEEPER_HOME/lib

2.9   部署

2.9.1   ZooKeeper的单机模式部署

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

l 编写配置文件zoo.cfg

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

  1. tickTime=2000
  2. dataDir=/var/zookeeper
  3. clientPort=2181

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

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

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

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

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

l 执行运行脚本

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

./zkServer.sh start

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

 

2.9.2   ZooKeeper的集群模式部署

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

 确认集群服务器的数量

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

l编写配置文件

配置文件需要在每台服务器中都要编写,以下是一个配置文件的样本:

  1. # Filename zoo.cfg
  2. tickTime=2000
  3. dataDir=/var/zookeeper/
  4. clientPort=2181
  5. initLimit=5
  6. syncLimit=2
  7. server.1=202.115.36.251:2888:3888
  8. server.2=202.115.36.241:2888:3888
  9. 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 实例通信端口号不能一样,所以要给它们分配不同的端口号

创建myid文件

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

执行运行脚本

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

./zkServer.sh start

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

 

2.9.3   ZooKeeper的集群伪分布

    其实在企业中是不会存在的,另外为了测试一个客户端程序也没有必要存在,只有在物质条件比较匮乏的条件下才会存在的模式。

集群伪分布模式就是在单机下模拟集群的ZooKeeper服务,在一台机器上面有多个ZooKeeper的JVM同时运行。

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

    2n+1,和之前的集群分布相同。

l 编写配置文件

    在/conf文件夹新建三个配置文件,zoo1.cfg,zoo2.cfg以及zoo3.cfg。配置文件分别如下编写:

  1. zoo1.cfg
  2. tickTime=2000
  3. initLimit=10
  4. syncLimit=5
  5. dataDir=/data/zookeeper/data
  6. clientPort=2181
  7. server.1=localhost:2887:3887
  8. server.2=localhost:2888:3888
  9. server.3=localhost:2889:3889
  10. zoo2.cfg
  11. tickTime=2000
  12. initLimit=10
  13. syncLimit=5
  14. dataDir=/data/zookeeper/data
  15. dataLogDir=/data/zookeeper/logs
  16. clientPort=2182
  17. server.1=localhost:2887:3887
  18. server.2=localhost:2888:3888
  19. server.3=localhost:2889:3889
  20. zoo3.cfg
  21. tickTime=2000
  22. initLimit=10
  23. syncLimit=5
  24. dataDir=/data/zookeeper/data
  25. clientPort=2183
  26. server.1=localhost:2887:3887
  27. server.2=localhost:2888:3888
  28. server.3=localhost:2889:3889

由于三个服务都在同一台电脑上,因此这里要保证地址的唯一性,因此要特别注意IP地址和端口号不要互相冲突,以免影响程序的正确执行。

创建myid文件

    这个同集群模式部署,在各自的文件夹下面创建。

即在d_1下面创建myid 里面的内容为1,d_2下面创建myid 里面的内容为2,d_3下面创建myid 里面的内容为3

执行运行脚本

    由于所有的配置文件都在/conf文件夹下面,因此要执行三次,而且要加文件名的参数,不然会默认执行zoo.cfg这个文件,如下:

59. ./zkServer.sh start  zoo1.cfg 

60. ./zkServer.sh start  zoo2.cfg  

61. ./zkServer.sh start  zoo3.cfg  

 

执行完毕后,将完成ZooKeeper的集群伪分布的启动。

 

2.10     检测状态

62. zkServer.sh status

63. JMX enabled by default

64. Using config: /home/hadooptest/zookeeper-3.4.3/bin/../conf/zoo.cfg

65. Mode: standalone

66. 检测转台:

67. zkCli.sh -server 127.0.0.1:2181

 

2.10.1 样例

[java] view plaincopy

68. package test;  

  1. 69.   

70. import java.io.IOException;  

  1. 71.   

72. import org.apache.zookeeper.CreateMode;  

73. import org.apache.zookeeper.KeeperException;  

74. import org.apache.zookeeper.Watcher;  

75. import org.apache.zookeeper.ZooKeeper;  

76. import org.apache.zookeeper.ZooDefs.Ids;  

  1. 77.   

78. public class demo {  

  1. 79.   
  2. 80.  // 会话超时时间,设置为与系统默认时间一致  
  3. 81.   
  4. 82.  private static final int SESSION_TIMEOUT = 30000;  
  5. 83.   
  6. 84.  // 创建 ZooKeeper 实例  
  7. 85.   
  8. 86.  ZooKeeper zk;  

87. // 创建 Watcher 实例  

  1. 88.   
  2. 89.  Watcher wh = new Watcher() {  
  3. 90.   
  4. 91.   public void process(org.apache.zookeeper.WatchedEvent event) {  
  5. 92.    System.out.println("event="+event.toString());  
  6. 93.   }  
  7. 94.   
  8. 95.  };  
  9. 96.   
  10. 97.  // 初始化 ZooKeeper 实例  
  11. 98.   
  12. 99.  private void createZKInstance() throws IOException{  
  13.   zk = new ZooKeeper("192.168.100.186:2181", demo.SESSION_TIMEOUT, this.wh);  
  14.  }  
  15.   
  16.  private void ZKOperations() throws IOException, InterruptedException, KeeperException{  
  17.   
  18.   System.out.println("\n 创建 ZooKeeper 节点 (znode : zoo2, 数据: myData2 ,权限: OPEN_ACL_UNSAFE ,节点类型: Persistent");  
  19.   
  20.   zk.create("/zoo2", "myData2".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);  
  21.   
  22.   System.out.println("\n 查看是否创建成功: ");  
  23.   
  24.   System.out.println(new String(zk.getData("/zoo2", falsenull)));  
  25.   
  26.   System.out.println("\n 修改节点数据 ");  
  27.   
  28.   zk.setData("/zoo2", "shenlan211314".getBytes(), -1);  
  29.   
  30.   System.out.println("\n 查看是否修改成功: ");  
  31.   
  32.   System.out.println(new String(zk.getData("/zoo2", falsenull)));  
  33.   
  34.   System.out.println("\n 删除节点 ");  
  35.   
  36.   zk.delete("/zoo2", -1);  
  37.   
  38.   System.out.println("\n 查看节点是否被删除: ");  
  39.   
  40.   System.out.println(" 节点状态: [" + zk.exists("/zoo2", false) + "]");  
  41.   
  42.  }  
  43.   
  44.  private void ZKClose() throws InterruptedException{  
  45.   zk.close();  
  46.  }  
  47.   
  48.  public static void main(String[] args) throws IOException,InterruptedException, KeeperException {  
  49.   demo dm = new demo();  
  50.   dm.createZKInstance();  
  51.   dm.ZKOperations();  
  52.   dm.ZKClose();  
  53.  }  
  54.