zookeeper学习总结
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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学习总结的主要内容,如果未能解决你的问题,请参考以下文章