本文介绍如何通过虚拟机搭建一个ZooKeeper集群,并且通过Java程序访问。关于VirtualBox创建虚拟机部分可以参考之前的Hadoop集群搭建。在网络连接部分,先创建一个虚拟host网络[这样会设置有一个可以使用的网段],然后每台机器的第二网卡选择host-only network,最后修改机器的/etc/hosts把集群机器名和ip写上,检查网络是否ping通。

官网下载ZooKeeper的binary包,本文版本号3.4.12。tar -xvf命令解压到/usr/local文件夹下,启动之前需要修改几个配置文件。

/usr/local/zookeeper/bin添加到环境变量

conf目录下,通过cp zoo_sample.cfg zoo.cfg复制一份配置文件,修改dataDir到一个非/tmp的文件夹,比如/usr/local/zookeeper/zookeeper-data

然后在该文件夹下创建myid文件,每个机器的myid文件里面写上本台机器的序号,比如server.1机器,myid里面就写1

然后在尾步追加ZooKeeper集群中机器的ip还有对应端口,比如

server.1=192.168.56.100:2888:3888
server.2=192.168.56.101:2888:3888
server.3=192.168.56.102:2888:3888

所有集群机器使用/bin/zkSever.sh start命令启动服务器。客户端机器可以通过zkCli.sh -server IP:port命令启动,比如zkCli.sh -server hadoop-master:2181[2181是默认端口号]。之后就可以通过client进行分布式数据节点操作

关于通过Java程序操作,首先创建Java Project[通过maven或者手动添加下载需要的jar包]。

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

public class ZkClient {

    public static void main(String[] args) throws Exception {
        String zkConn = "192.168.56.100:2181,192.168.56.101:2181,192.168.56.102:2181";
        ZooKeeper zk = new ZooKeeper(zkConn,5000, null);
        
        while(true) {
            if(zk.getState().equals(ZooKeeper.States.CONNECTED)) {
                System.out.println("ZooKeeper is connected");
                break;
            }
            else {
                Thread.sleep(1000);
            }
        }

        zk.create("/test","test".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

        Thread.sleep(20000);
        zk.close();
    }