ZooKeeper的使用实践

231 阅读2分钟

1.Zookeeper的特点

  • 是一个简单的文件系统:提供排序和通知
  • Zookeeper可以实现多种协调数据结构和协议

    分布式队列、分布式锁、领导者协议
  • Zookeeper的高可用性
    可以避免打点故障
  • Zookeeper是一个通用资源库
    所有用户都可以对资源库进行修改和添加

Zookeeper的API

connect 连接到zookeeper集合
create 创建znode

Zookeeper辅助类Watcher

当zookeeper实例被创建时,一定要等到与Zookeeper服务器连接成功才能使用该实例,当客户端与Zookeeper服务器建立连接时Watcher回调process(),
public void process(WatcherEvent event)事件回调函数

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

import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
 * @description: zookeeper create group
 * @author: Ksssss(chenlin @ hoolai.com)
 * @time: 2019-10-24 20:22
 */

public class CreateGroup implements Watcher {
    private final static int MAX_CONNECT_TIME = 5000;
    private CountDownLatch countDownLatch = new CountDownLatch(1);
    private ZooKeeper zk;

    /**
     * @param host 服务器地址端口默认2181
     * @throws Exception
     */
    public CreateGroup(String host) throws Exception {
        zk = new ZooKeeper(host, MAX_CONNECT_TIME, this);
        countDownLatch.await();
    }

    /**
     * 当Zookeeper连接建立成功,回掉process()
     *
     * @param watchedEvent
     */
    public void process(WatchedEvent watchedEvent) {
        if (watchedEvent.getState() == Event.KeeperState.SyncConnected)
            countDownLatch.countDown();
    }

    /**
     * @param path       Znode路径
     * @param data       Znode的数据
     * @param acls       节点访问控制权限列表
     * @param createMode 节点的类型
     */
    public void create(String path, byte[] data, List<ACL> acls, CreateMode createMode) throws InterruptedException, KeeperException {
        zk.create(path, data, acls, createMode);
    }

    public void close() throws InterruptedException {
        zk.close();
    }

    public static void main(String[] args) {
        System.out.printf("%s\t%s\t", args[0], args[1]);
        try {
            CreateGroup createGroup = new CreateGroup(args[0]);
            createGroup.create(args[1], null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            createGroup.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ZooKeeper服务

  • 数据模型
    • zookeeper具有简单的树形结构,树的结点称为znode,每个znode都有一个ACL(权限控制),也可以存储数据(数据在1mb内)

    • zookeeper具有原子性,要么全部读,要么全部写(注意:读到的数据可能和znode的数据不同步,但是写一定是会保存在znode中)

    • zookeeper的znode地址一定是绝对地址,不支持./..之类,zookeeper是保留字

  • 操作
  • 实现
  • 一致性
  • 会话
  • 状态