1、版本及环境
zookeeper 3.5.2 下载地址为:http://mirror.bit.edu.cn/apache/zookeeper/
Linux version 2.6.32-504.el6.x86_64
三台机器:10.202.15.193 10.202.15.195 10.202.15.198
jdk1.8
2、下载后,上传至linux /usr/local/zookeeper 然后解压,tar -zxvf zookeeper-3.5.2-alpha.tar.gz
3、解压后的文件含有如下
total 1960 drwxr-xr-x 2 1000 1000 4096 Jul 1 2016 bin -rw-rw-r-- 1 1000 1000 80660 Jun 30 2016 build.xml -rw-rw-r-- 1 1000 1000 115528 Jun 30 2016 CHANGES.txt drwxr-xr-x 2 1000 1000 4096 Apr 12 19:43 conf drwxr-xr-x 9 1000 1000 4096 Jun 30 2016 contrib drwxr-xr-x 2 1000 1000 4096 Jul 1 2016 dist-maven drwxr-xr-x 6 1000 1000 4096 Jul 1 2016 docs -rw-rw-r-- 1 1000 1000 1953 Jun 30 2016 ivysettings.xml -rw-rw-r-- 1 1000 1000 3898 Jun 30 2016 ivy.xml drwxr-xr-x 4 1000 1000 4096 Jul 1 2016 lib -rw-rw-r-- 1 1000 1000 12085 Jun 30 2016 LICENSE.txt drwxr-xr-x 2 root root 4096 Apr 12 19:43 logs -rw-rw-r-- 1 1000 1000 3133 Jun 30 2016 NOTICE.txt -rw-rw-r-- 1 1000 1000 1347 Jun 30 2016 README_packaging.txt -rw-rw-r-- 1 1000 1000 1557 Jun 30 2016 README.txt drwxr-xr-x 5 1000 1000 4096 Jun 30 2016 recipes drwxr-xr-x 7 1000 1000 4096 Jul 1 2016 src -rw-rw-r-- 1 1000 1000 1722478 Jun 30 2016 zookeeper-3.5.2-alpha.jar -rw-rw-r-- 1 1000 1000 836 Jul 1 2016 zookeeper-3.5.2-alpha.jar.asc -rw-rw-r-- 1 1000 1000 33 Jun 30 2016 zookeeper-3.5.2-alpha.jar.md5 -rw-rw-r-- 1 1000 1000 41 Jun 30 2016 zookeeper-3.5.2-alpha.jar.sha1
3,、进入conf 目录 cd /usr/local/zookeeper/zookeeper-3.5.2-alpha/conf,然后执行 cp zoo_sample.cfg zoo.cfg ,相当于更改zoo_sample.cfg 成 zoo.cfg,然后vim zoo.cfg
4、编辑zoo.cfg,内容如下:
# The number of milliseconds of each tick tickTime=2000 # The number of ticks that the initial # synchronization phase can take initLimit=10 # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes.
#存数据的地址 dataDir=/usr/local/zookeeper/data dataLogDir=/usr/local/zookeeper/logs
#master slave1 slave2分别为三台机器的用户名,即相当于ip地址10.202.15.193 10.202.15.195 10.202.15.198
#193 195 198相当于id,这个必须和后面的myid的值对应 2888是leader与follower直接的通讯端口,而3888是选举端口
server.193=master:2888:3888 server.195=slave1:2888:3888 server.198=slave2:2888:3888
# the port at which the clients will connect clientPort=2181 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1
5、配置完成后保存,然后再data目录下新建文件myid,然后写入193,保存。命令为:vim myid
6、配置zookeeper环境变量 命令为 vim /etc/profile
ZOOKEEPER_HOME=/usr/local/zookeeper/zookeeper-3.5.2-alpha JAVA_HOME=/usr/local/jdk/jdk1.8.0_121/ PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib export JAVA_HOME CLASSPATH PATH
然后保存,执行 resource /etc/profile 使之生效
7、拷贝文件夹 /usr/local/zookeeper/ 到其他两台机器,并配置环境变量
8、更改对应机器的myid的值,机器10.202.15.195为195, 机器10.202.15.198为198
9、启动,切换到bin目录,然后执行./zkServer.sh start ,执行完后,可以看到 STARTED,然后执行jps,可以看到QuorumPeerMain,如果没有看到这个进程,则没有启动,也可以通过./zkServer.sh status 查看状态。还可以看到当前机器是leader还是follower,类似信息如下:
ZooKeeper JMX enabled by default Using config: /usr/local/zookeeper/zookeeper-3.5.2-alpha/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Mode: follower
10、linux客户端连接
在bin目录下执行 ./zkCli.sh 即可,这样就可以操作了,如create /path set /path hello
1、eclipse zookeeper插件安装
打开eclipse,help->install New Software,输入地址http://www.massedynamic.org/eclipse/updates/即可,重启eclipse,连接上zookeeper客户端
2、新建一个类,简单例子如下,
public class Master implements Watcher{ private ZooKeeper zk; private String hostPort; public Master(String hostPort) { this.hostPort = hostPort; } public ZooKeeper startZK() throws IOException{ zk = new ZooKeeper(hostPort, 15000, this); return zk; } public void process(WatchedEvent event) { System.out.println("你已经出发了"+event.getType()+"事件!"); } public static void main(String[] args) throws Exception{ String add = "10.202.15.193:2181"; Master m = new Master(add); ZooKeeper zk = m.startZK(); //zk.create("/testRootPath", "testRootPath".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zk.create("/testRootPath/testChildOnePath", "testChildOne".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); //zk.create("/testRootPath/testChildTwoPath", "testChildTwo".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); //取出指定目录数据 System.out.println(new String(zk.getData("/testRootPath", false, null))); //取出子节点目录数据 返回List 获得是节点的名称,而非数据 // System.out.println(zk.getChildren("/testRootPath", new Watcher(){ // public void process(WatchedEvent event) { // System.out.println("hello,event "+event); // } // })); //zk.setData("/testRootPath/testChildOnePath", "testChildModifyOne".getBytes(), -1); zk.setData("/testRootPath/testChildTwoPath", "testChildModifyTwo".getBytes(), -1); zk.getData("/testRootPath/testChildTwoPath", new Watcher(){ public void process(WatchedEvent event) { System.out.println("hello,event "+event);//当对此节点进行操作时才会发生这个watch事件,仅仅查询数据是不会发生watch时间的 } }, null); zk.setData("/testRootPath/testChildTwoPath","testChildTwo111".getBytes(),-1); //删除 -1表示删除所有版本 zk.delete("/testRootPath/testChildOnePath", -1); //Thread.sleep(10000); zk.close(); } }