首页 > 代码库 > zookeeper学习总结

zookeeper学习总结

知识点:

1、zookeeper服务器节点分为三种 主节点(可写),从节点(可读,参与选举,参与写数据的事务(超过一半节点写成功才算写成功)),观察节点(可读,不参与选举和写事务)

zookeeper数据节点两种 持久的、暂时的;暂时的会随着创建它的会话断开而删除;

数据节点添加时分为 四种;上述两种分别对应 一种直接命名 (如:name),一种会给命名自动添加节点版本号(如:name000001);

2、设置观察机制,连接zk服务器时设置一个watcher,zk连接点设置一个 CountDownLatch(同步辅助类),阻塞(等待)连接完成;在设置的watcher释放上述同步辅助类CountDownLatch.countDown()

public void connect(String hosts) throws IOException, InterruptedException {
        zk = new ZooKeeper(hosts, SESSION_TIMEOUT, watcher);
        connectedSignal.await();
    }

public void process(WatchedEvent arg0) {
        if (arg0.getState() == KeeperState.SyncConnected) {
            connectedSignal.countDown();
        }
        
    }

3、获取节点数据的两种方式,一种直接拿数据,一种拿数据并且设置数据变化的观察

//getData(path<节点路径>, watcher<监视器>, stat<数据版本号>)
zk.getData(path, false, null);
zk.getData(path, watcher, null);

4、持续 设置观察子节点变化(存在节点变化没被观察到的可能性,响应上一个变化时,新的观察没有被添加之前,发生了一个变化)

(1)在watcher 的 process函数中直接添加 嵌套观察 ;运行到此处中线程 中断(设置失效),这种方式也存在 无穷嵌套的 问题,导致占用内存持续增多;

(2)在在watcher 的 process函数中 另起一个线程 设置观察,运行正常;

/**
*另起线程的方式 持续观察;
*/
private
void addWatcherNode(final ZookeeperTools zkTools) { ZooKeeper zkClient = zkTools.getZooKeeper(); // 创建Watcher,监控子节点的变化 Watcher watcher = new Watcher() { @Override public void process(WatchedEvent event) { // 打印事件信息 System.out.println("WatchedEvent *********"); System.out.println("event.getPath() :" + event.getPath()); System.out.println("event.getType() :" + event.getType()); System.out.println("event.getType() :" + event.getType()); System.out.println("event.getWrapper() :" + event.getWrapper()); System.out.println("WatchedEvent ********* end"); Thread thr2 = new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "正在执行。。。"); addWatcherNode(zkTools); } }); pool.execute(thr2); synchronized (this) { notify(); // 唤醒生产者 } } }; try { zkClient.getChildren("/tt", watcher); synchronized (watcher) { watcher.wait(); // 阻塞生产者 } } catch (KeeperException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

 

 

文章汇总

zookeeper Watcher API 说明 :http://www.cnblogs.com/dennisit/p/4340688.html

Zookeeper-Watcher机制与异步调用原理  http://www.cnblogs.com/wely/p/6198662.html

【分布式】Zookeeper与Paxos http://www.cnblogs.com/leesf456/p/6012777.html

zookeeper学习总结