一、Zookeeper集群搭建

1、下载压缩包,上传到虚拟机soft目录下,解压,安装之前记得先拍快照,关闭Hadoop集群

java client zookeeper 集群 zookeeper集群配置文件_zookeeper

 

java client zookeeper 集群 zookeeper集群配置文件_zookeeper_02

2、配置环境变量

vim /etc/profile

export ZOOKEEPER_HOME=/usr/local/soft/zookeeper-3.4.6

export PATH=$PATH:$ZOOKEEPER_HOME/bin

 配置文件生效

source /etc/profile

 

java client zookeeper 集群 zookeeper集群配置文件_zookeeper_03

 

java client zookeeper 集群 zookeeper集群配置文件_System_04

 

 

3、修改配置文件

cd conf

cp  zoo_sample.cfg zoo.cfg

 

java client zookeeper 集群 zookeeper集群配置文件_子节点_05

修改

dataDir=/usr/local/soft/zookeeper-3.4.6/data

增加

server.0=master:2888:3888

server.1=node1:2888:3888

server.2=node2:2888:3888

java client zookeeper 集群 zookeeper集群配置文件_zookeeper_06

 

 

4、同步到其它节点

scp -r zookeeper-3.4.6 node1:`pwd`

scp -r zookeeper-3.4.6 node2:`pwd`

 

java client zookeeper 集群 zookeeper集群配置文件_System_07

配置node1和node2的环境变量

scp /etc/profile node1:/etc/

scp /etc/profile node2:/etc/

在所有节点执行

source /etc/profile

java client zookeeper 集群 zookeeper集群配置文件_zookeeper_08

 

 

5、创建/usr/local/soft/zookeeper-3.4.6/data目录,所有节点都要创建

mkdir /usr/local/soft/zookeeper-3.4.6/data

 

java client zookeeper 集群 zookeeper集群配置文件_zookeeper_09

在data目录下创建myid文件

vim myid

master,node1,node2分别加上0,1,2

java client zookeeper 集群 zookeeper集群配置文件_子节点_10

 

 

java client zookeeper 集群 zookeeper集群配置文件_子节点_11

 

 

java client zookeeper 集群 zookeeper集群配置文件_System_12

 

 

6、启动zk,

zkServer.sh start  三台都需要执行

zkServer.sh status 查看状态

zkServer.sh stop 关闭

当有一个leader的时候启动成功

java client zookeeper 集群 zookeeper集群配置文件_System_13

java client zookeeper 集群 zookeeper集群配置文件_zookeeper_14

 

java client zookeeper 集群 zookeeper集群配置文件_zookeeper_15

leader负责客户端writer类型的请求;follower负责客户端reader类型的请求,并参与leader选举,并且节点对于用户来说是无中心化的,没有follow和leader区别,但是相对与zookeeper而言有follow和leader之分,随机分配

java client zookeeper 集群 zookeeper集群配置文件_System_16

 

 

 

java client zookeeper 集群 zookeeper集群配置文件_zookeeper_17

 

 

 

java client zookeeper 集群 zookeeper集群配置文件_System_18

二、Zookeeper基本命令操作

Zookeeper使用的数据结构为树形结构,根节点为"/"。Zookeeper集群中的节点

 

 

java client zookeeper 集群 zookeeper集群配置文件_System_19

 

 

执行指令zkCli.sh

 

java client zookeeper 集群 zookeeper集群配置文件_子节点_20

 

 

2、执行基本命令

执行指令zkCli.sh help  ,查看帮助信息

java client zookeeper 集群 zookeeper集群配置文件_zookeeper_21

 

 

ls  /   查找根目录

java client zookeeper 集群 zookeeper集群配置文件_System_22

 

 

create /test abc   创建节点并赋值

 

get /test   获取指定节点的值

java client zookeeper 集群 zookeeper集群配置文件_子节点_23

 

 

set /test cb  设置已存在节点的值

 

rmr /test  递归删除节点

 

delete /test/test01  删除不存在子节点的节点

 

java client zookeeper 集群 zookeeper集群配置文件_子节点_24

 

 

 

三、Zookeeper Java API的使用

1、在Java中新建maven项目命名zk,并导入对应版本的zookeeper jar包

  搜索maven仓库官网下载对应zookeeper版本jar包   

java client zookeeper 集群 zookeeper集群配置文件_zookeeper_25

 

 

 

java client zookeeper 集群 zookeeper集群配置文件_zookeeper_26

 

 创建maven项目

 

java client zookeeper 集群 zookeeper集群配置文件_zookeeper_27

 

 

java client zookeeper 集群 zookeeper集群配置文件_zookeeper_28

 

 

java client zookeeper 集群 zookeeper集群配置文件_子节点_29

 

 2、开始使用

1、连接

String connectionString = "127.0.0.1:2181"; int sessionTimeout = 30000; ZooKeeper zk = new ZooKeeper(connectionString,sessionTimeout,null });

是连接信息,当为集群的时候,使用”,”分隔,如 

        “192.168.1.1:2181,192.168.1.2:2181”

指会话过期时间,其值minSessionTimeout最小为tickTime的2倍,最大值 maxSessionTimeout为tickTime的20倍;即使传入的值不在此范围实际起作用的也是minSessionTimeout至maxSessionTimeout

2、创建节点

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

类型

描述

CreateMode.PERSISTENT

永久性节点

CreateMode.PERSISTENT_SEQUENTIAL

永久性序列节点

CreateMode.EPHEMERAL

临时节点,会话断开或过期时会删除此节点

CreateMode.PERSISTENT_SEQUENTIAL

临时序列节点,会话断开或过期时会删除此节点

 

3、获取节点

  Stat stat = new Stat(); zk.getData("/testRoot",true,stat);

4、修改节点数据

表示忽略版本

  zk.setData("/testRoot", "testRoot_modified".getBytes(), -1);

5、创建子节点

  zk.create("/testRoot/child1","child1_data".getBytes(),           

   ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);

6、获取子节点

List<String> children = zk.getChildren("/testRoot",new Watcher()

   {       

     public void process(WatchedEvent event)

    {            

      System.out.println("this is children node event");

               System.out.println(event);       

     }   

   });

  注:getChildren方法会在子点有变化时触发Watcher()这个监听器

 

7、删除节点

  zk.delete("/testRoot", -1); zk.delete("/testRoot/child1", -1);

8、关闭连接

  zk.close(); 

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.util.List;


public class ZookeeperDemo1 {
    public static void main(String[] args) throws Exception {
        //创建连接
        String conn = "master:2181,node1:2181,node2:2181";
        ZooKeeper zooKeeper = new ZooKeeper(conn, 3000, null);
        //创建节点
        /**
         * zk.create("/testRoot","testRoot".getBytes(),
         *            ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
         *
         * CreateMode.PERSISTENT    永久性节点
         * CreateMode.PERSISTENT_SEQUENTIAL    永久性序列节点
         * CreateMode.EPHEMERAL    临时节点,会话断开或过期时会删除此节点
         * CreateMode.PERSISTENT_SEQUENTIAL    临时序列节点,会话断开或过期时会删除此节点
         *
         *ACL zk自带的一个验证
         */

        String s = zooKeeper.create("/text", "text".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println(s);

        //获取节点
        /**
         * Stat stat = new Stat();
         * zk.getData("/testRoot",true,stat);
         */
        Stat stat = new Stat();
        byte[] data = zooKeeper.getData("/zookeeper", true, stat);
        System.out.println(data.toString());

        //修改节点数据
        /**
         * // -1表示忽略版本
         * zk.setData("/testRoot", "testRoot_modified".getBytes(), -1);
         */
        zooKeeper.setData("/text","textmodified".getBytes(),-1);

        /**
         * 创建子节点
         * zk.create("/testRoot/child1","child1_data".getBytes(),
         *             ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
         */
        zooKeeper.create("/text/text1","text1".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);

        /**
         * 获取子节点
         * List<String> children = zk.getChildren("/testRoot",new Watcher()
         *  {
         *
         *  public void process(WatchedEvent event)
         * {
         *
         * System.out.println("this is children node event");
         *
         *            System.out.println(event);
         *         }
         *
         *  });
         * 注:getChildren方法会在子点有变化时触发Watcher()这个监听器
         */
        List<String> children = zooKeeper.getChildren("/text/text1", new Watcher() {
            public void process(WatchedEvent watchedEvent) {
                System.out.println("这是字节点");
                System.out.println(watchedEvent);
            }
        });

        /**
         * 删除节点
         * zk.delete("/testRoot", -1);
         * zk.delete("/testRoot/child1", -1);
         */
        zooKeeper.delete("/text/text1",-1);
        zooKeeper.delete("/text",-1);
        /**
         *     关闭连接
         */
        zooKeeper.close();
    }
}

 

 

9、监听机制

import org.apache.zookeeper.*;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;

public class ZookeeperDemo2 {
    ZooKeeper zooKeeper;
    @Before
    public void init() throws IOException {
        //创建连接
        String conn = "master:2181,node1:2181,node2:2181";
         zooKeeper= new ZooKeeper(conn, 3000, null);
    }

    @Test
    public void create() throws KeeperException, InterruptedException {
        String s = zooKeeper.create("/text", "text".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        Thread.sleep(5000);//节点消失
    }

    @Test
    /**
     * 监听
     * 参数两个 第一个节点路径 第二个是监听
     * 把监听和路径绑定
     */
    public void children() throws KeeperException, InterruptedException {

            zooKeeper.getChildren("/text", new Watcher() {
                //回调函数
                //触发的前提
                public void process(WatchedEvent watchedEvent) {
                    System.out.println("当前节点不存在");
                    System.out.println(watchedEvent);
                }
            });
            while (true);//一直监听
        }

}

 

 

先运行create,再监听 

java client zookeeper 集群 zookeeper集群配置文件_子节点_30