一:监听服务端zookeeper节点数据改变

import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper; public class ConfigApp1 {
private static CountDownLatch connectedSemaphore = new CountDownLatch(1); public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
//连接zookeeper服务器
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", 5000,
new Watcher() {
public void process(WatchedEvent event) {
if (KeeperState.SyncConnected == event.getState()) { //zk连接成功通知事件
if ( EventType.None == event.getType() && null == event.getPath() ) {
connectedSemaphore.countDown();
System.out.println("===========");
}
} }
}); connectedSemaphore.await();
//创建节点app1,不进行ACL权限控制,EPHEMERAL:临时节点
zk.create("/app1", "app1Date".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); //注册对该节点的监听
zk.exists("/app1", new WatcherClass(zk)); //延迟2秒后 开始改变数据
TimeUnit.SECONDS.sleep(2);
for(int i = 0; i < 10; i++) {
TimeUnit.SECONDS.sleep(1);
String s = ("app" + i * 10);
zk.setData("/app1", s.getBytes(), -1);
System.out.println("数据改变了:"+s);
}
System.in.read();
} static class WatcherClass implements Watcher {
private ZooKeeper zk; public WatcherClass(ZooKeeper zk) {
this.zk = zk;
} @Override
public void process(WatchedEvent arg0) {
try {
byte[] b = zk.getData("/app1", false, null);
System.out.println("改变数据通知:" + new String(b)); //获取数据后,再次对节点进行监听
zk.exists("/app1", new WatcherClass(zk));
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
}

console结果截图:

 二:集群管理

  应用集群中,我们常常需要让每一个机器知道集群中(或依赖的其他某一个集群)哪些机器是活着的,并且在集群机器因为宕机,网络断链等原因能够不在人工介入的情况下迅速通知到每一个机器

思路:用三个类模拟成三个服务器,去连接zookeeper,这三个服务器监控zookeeper节点root,每个服务器上线都会在zookeeper的节点root下创建一个临时节点,这样,这三个服务器watcher这个zookeeper的root节点就可以动态感知服务器的上下线情况。

import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;
import org.apache.zookeeper.ZooKeeper; public class Cluster1 { private static final int zkSessionTimeOut = 5000; private static CountDownLatch connectedSemaphore = new CountDownLatch(1); public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
//连接zookeeper服务器
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", zkSessionTimeOut,
new Watcher() {
public void process(WatchedEvent event) {
if (KeeperState.SyncConnected == event.getState()) { //zk连接成功通知事件
if ( EventType.None == event.getType() && null == event.getPath() ) {
connectedSemaphore.countDown();
System.out.println("===========");
}
} }
}); connectedSemaphore.await(); Stat stat = zk.exists("/root", true);
if(stat == null) {
System.out.println("/root" + "路径不存在,请先创建该节点");
//创建节点root,不进行ACL权限控制,PERSISTENTAL:永久节点 只有永久节点才可以创建子节点的临时节点
zk.create("/root", "rootDate".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
String clusterPath = zk.create("/root/cluster1", "cluster1Date".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println(clusterPath); ZkWatcher zkWatcher = new ZkWatcher(zk);
List<String> clusterList = zk.getChildren("/root", zkWatcher); System.out.println("****************");
for(String str : clusterList) {
System.out.println("cluster:" + str);
}
System.out.println("****************"); while(true) { }
} }
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat; public class Cluster2 { private static final int zkSessionTimeOut = 5000; private static CountDownLatch connectedSemaphore = new CountDownLatch(1); public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
//连接zookeeper服务器
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", zkSessionTimeOut,
new Watcher() {
public void process(WatchedEvent event) {
if (KeeperState.SyncConnected == event.getState()) { //zk连接成功通知事件
if ( EventType.None == event.getType() && null == event.getPath() ) {
connectedSemaphore.countDown();
System.out.println("===========");
}
} }
}); connectedSemaphore.await(); Stat stat = zk.exists("/root", true);
if(stat == null) {
System.out.println("/root" + "路径不存在,请先创建该节点");
zk.create("/root", "rootDate".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
String clusterPath = zk.create("/root/cluster2", "cluster2Date".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println(clusterPath); ZkWatcher zkWatcher = new ZkWatcher(zk);
List<String> clusterList = zk.getChildren("/root", zkWatcher); System.out.println("****************");
for(String str : clusterList) {
System.out.println("cluster:" + str);
}
System.out.println("****************"); while(true) { }
} }
import java.io.IOException;
import java.util.List;
import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids; public class Cluster3 { private static final int zkSessionTimeOut = 5000; private static CountDownLatch connectedSemaphore = new CountDownLatch(1); public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
//连接zookeeper服务器
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181", zkSessionTimeOut,
new Watcher() {
public void process(WatchedEvent event) {
if (KeeperState.SyncConnected == event.getState()) { //zk连接成功通知事件
if ( EventType.None == event.getType() && null == event.getPath() ) {
connectedSemaphore.countDown();
System.out.println("===========");
}
} }
}); connectedSemaphore.await(); Stat stat = zk.exists("/root", true);
if(stat == null) {
System.out.println("/root" + "路径不存在,请先创建该节点");
zk.create("/root", "rootDate".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
String clusterPath = zk.create("/root/cluster3", "cluster3Date".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println(clusterPath); ZkWatcher zkWatcher = new ZkWatcher(zk);
List<String> clusterList = zk.getChildren("/root", zkWatcher); System.out.println("****************");
for(String str : clusterList) {
System.out.println("cluster:" + str);
}
System.out.println("****************"); while(true) { }
} }
import java.util.List;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooKeeper; public class ZkWatcher implements Watcher{ private ZooKeeper zk; public ZkWatcher(ZooKeeper zk) {
this.zk = zk;
} @Override
public void process(WatchedEvent event) {
if(EventType.NodeChildrenChanged.equals(event.getType())) {
List<String> clusterList = null;
try {
clusterList = zk.getChildren("/root", this);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("****************");
System.out.println("changed");
for(String str : clusterList) {
System.out.println("cluster:" + str);
}
System.out.println("****************");
}
} }

zookeeper 实战操作的更多相关文章

  1. 架构设计:远程调用服务架构设计及zookeeper技术详解(下篇)

    一.下篇开头的废话 终于开写下篇了,这也是我写远程调用框架的第三篇文章,前两篇都被博客园作为[编辑推荐]的文章,很兴奋哦,嘿嘿~~~~,本人是个很臭美的人,一定得要截图为证: 今天是2014年的第一天 ...

  2. [译]ZOOKEEPER RECIPES-Leader Election

    选主 使用ZooKeeper选主的一个简单方法是,在创建znode时使用Sequence和Ephemeral标志.主要思想是,使用一个znode,比如"/election",每个客 ...

  3. zookeeper源码分析之六session机制

    zookeeper中session意味着一个物理连接,客户端连接服务器成功之后,会发送一个连接型请求,此时就会有session 产生. session由sessionTracker产生的,sessio ...

  4. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  5. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  6. zookeeper源码分析之三客户端发送请求流程

    znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...

  7. zookeeper源码分析之二客户端启动

    ZooKeeper Client Library提供了丰富直观的API供用户程序使用,下面是一些常用的API: create(path, data, flags): 创建一个ZNode, path是其 ...

  8. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  9. zookeeper集群的搭建以及hadoop ha的相关配置

    1.环境 centos7 hadoop2.6.5 zookeeper3.4.9 jdk1.8 master作为active主机,data1作为standby备用机,三台机器均作为数据节点,yarn资源 ...

随机推荐

  1. luoguP2285 [HNOI2004]打鼹鼠 x

    P2285 [HNOI2004]打鼹鼠 题目描述 鼹鼠是一种很喜欢挖洞的动物,但每过一定的时间,它还是喜欢把头探出到地面上来透透气的.根据这个特点阿牛编写了一个打鼹鼠的游戏:在一个n*n的网格中,在某 ...

  2. Springboot 使用 webSocket

    介绍 WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议.在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进 ...

  3. mysql索引失效问题

    1.两表关联使用的条件字段中字段的长度是否是一致的 2.两表关联使用的条件字段中字段的编码是否是一致的

  4. oracle取差值集合

    Oracle Minus关键字 SQL中的MINUS关键字 SQL中有一个MINUS关键字,它运用在两个SQL语句上,它先找出第一条SQL语句所产生的结果,然后看这些结果有没有在第二个SQL语句的结果 ...

  5. Node.js读取文件相对路径写法注意

    首先看一下文件的存放结构: 我们现在希望在上面标记的JS文件里面读取html里面的内容,我们的代码如下: var fs=require("fs"); fs.readFile('te ...

  6. Android 中布局的优化措施都有哪些?

    1.尽可能减少布局的嵌套层级可以使用 sdk 提供的 hierarchyviewer 工具分析视图树,帮助我们发现没有用到的布局.2.不用设置不必要的背景,避免过度绘制比如父控件设置了背景色,子控件完 ...

  7. django写原生sql语句

    执行自定义SQL语言: from django.db import connection ​ cursor=connection.cursor() ​ # 插入操作 cursor.execute(&q ...

  8. flutter GestureDetector点击区域

    使用GestureDetector包裹Container,发现在Container内容为空的区域点击时,捕捉不到onTap点击事件. 解决方案:在GestureDetector里面添加属性: beha ...

  9. rocketmq的一些内容

    分布式开放消息系统(RocketMQ)的原理与实践 作者 CHEN川 关注 2016.02.25 15:43* 字数 6784 阅读 122302评论 41喜欢 321赞赏 7 一年前为了一次内部分享 ...

  10. sysstat功能列表

    iostat:统计并报告你的设备的CPU状态和I/O状态数据.mpstat:监控和显示关于CPU的细节信息.pidstat:统计正在运行的进程/任务的CPU.内存等信息.sar:保存和报告不同资源(C ...