Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1300769
  • 博文数量: 127
  • 博客积分: 2286
  • 博客等级: 大尉
  • 技术积分: 1943
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-10 10:37
文章分类

全部博文(127)

文章存档

2018年(1)

2015年(2)

2014年(1)

2013年(30)

2012年(88)

2011年(5)

分类: 云计算

2012-05-23 10:46:41

1. 经过测试,zookeeper实际上有两种watcher:

a. 建立zookeeper对象/连接的时候指定的watcher,它不是一次性的,但只对client的连接状态变化是做出反应。我觉得叫它default watcher比较合适

b. exists或getData指定的callback,它们是一次性的,你需不停地指定callback。而且该出发事情先要经过default watcher 

2. client连接zookeeper连接的时候,最好指定>=2个zookeeper服务器地址,这样当一个zookeeper当掉后,client会自动failover到其它的连接。这时候default watcher会先收到一个Disconnected事件,连接的新的Zookeeper服务器后会收到一个SyncConnected事件。这种情况下session建立的临时节点不会丢失,所以程序一般需要对这点做什么特别的工作。

notes:如果你指定的zookeeper中有leader,它好像会直接连接到leader,如果是global集群或多机房集群,建议只指定本机房的zooleeper。


3. 如果client连接指定的所有zookeeper server都当掉了,先还是会收到一个Disconnected事情,然后临时节点消失,启动zookeeper server后会收到Expired事情,这是后你需要重新建立zookeeper实例:


public void process(WatchedEvent event) {
switch (event.getState()) {
  ....

case Expired:
System.out.println("State expired");
try {
zk.close();
zk = new ZooKeeper(zk_server, 1000, this);
} catch (Exception e ) {
System.out.println("Process:InterruptedException");
e.printStackTrace();
}
break;
  ....}
}



阅读(6125) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~