初识Zookeeper

一、什么Zookeeper

Zookeeper是一个分布式开源框架,提供了协调分布式应用的基本服务,它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。ZooKeeper本身可以以单机模式安装运行,不过它的长处在于通过分布式ZooKeeper集群(一个Leader,多个Follower),基于一定的策略来保证ZooKeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。

1、zookeeper是为别的分布式程序服务的

2、Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,zk就能正常服务)

3、Zookeeper所提供的服务涵盖:主从协调、服务器节点动态上下线、统一配置管理、分布式共享锁、统> 一名称服务等

4、虽然说可以提供各种服务,但是zookeeper在底层其实只提供了两个功能:

管理(存储,读取)用户程序提交的数据(类似namenode中存放的metadata); 
并为用户程序提供数据节点监听服务;

二、Zookeeper集群机制

Zookeeper集群的角色: Leader 和 follower 
只要集群中有半数以上节点存活,集群就能提供服务

三、Zookeeper特性

1、Zookeeper:一个leader,多个follower组成的集群

2、全局数据一致:每个server保存一份相同的数据副本,client无论连接到哪个server,数据都是一致的

3、分布式读写,更新请求转发,由leader实施

4、更新请求顺序进行,来自同一个client的更新请求按其发送顺序依次执行

5、数据更新原子性,一次数据更新要么成功,要么失败

6、实时性,在一定时间范围内,client能读到最新数据

四、Zookeeper客户端

ZooKeeper命令行工具类似于Linux的shell环境,不过功能肯定不及shell啦,但是使用它我们可以简单的对ZooKeeper进行访问,数据创建,数据修改等操作.  使用 zkCli.sh -server 127.0.0.1:2181 连接到 ZooKeeper 服务,连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息。

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

  1. 显示根目录下、文件: ls / 使用 ls 命令来查看当前 ZooKeeper 中所包含的内容

  2. 显示根目录下、文件: ls2 / 查看当前节点数据并能看到更新次数等数据

  3. 创建文件,并设置初始内容: create /zk "test" 创建一个新的 znode节点“ zk ”以及与它关联的字符串  

  4. 获取文件内容: get /zk 确认 znode 是否包含我们所创建的字符串

  5. 修改文件内容: set /zk "zkbak" 对 zk 所关联的字符串进行设置

  6. 删除文件: delete /zk 将刚才创建的 znode 删除

  7. 退出客户端: quit

  8. 帮助命令: help

五、小案例

  导入依赖

<dependency>              <groupId>org.apache.zookeeper</groupId>
  <artifactId>zookeeper</artifactId>
  <version>3.4.6</version>
</dependency>

  修改名称

初识Zookeeper

  打开服务

初识Zookeeper

 初识Zookeeper

   index

package com.ZooMckz;

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

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

public class index {

    /**
     * 集群连接地址
     */
    private static final String CONNECT_ADDR = "0.0.0.0:2181";
    /**
     * session超时时间
     */
    private static final int SESSION_OUTTIME = 2000;
    /**
     * 信号量,阻塞程序执行,用户等待zookeeper连接成功,发送成功信号,
     */
    private static final CountDownLatch countDownLatch = new CountDownLatch(1);

    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        /**
         * 连接zooheeper
         *
         * 步骤一:创建zooheeper对象
         *
         */

        ZooKeeper zooKeeper=new ZooKeeper(CONNECT_ADDR, SESSION_OUTTIME, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                Event.KeeperState keeperState = event.getState();
                System.out.println("成功连接!!!");
            }
        });

        //创建节点
        zooKeeper.create("/zk01","value01".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);


        //获取节点
        byte[] zk01s = zooKeeper.getData("/zk01", false, new Stat());
        System.out.println(new String(zk01s,"UTF-8"));

        //修改节点
        zooKeeper.setData("/zk01","wahahahavalues".getBytes(),0);


        //获取节点
        byte[] zk01ss = zooKeeper.getData("/zk01", false, new Stat());
        System.out.println(new String(zk01ss,"UTF-8"));

        //删除节点
        zooKeeper.delete("/zk01",-1);


        //关闭连接
        zooKeeper.close();
    }
}