Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1940547
  • 博文数量: 1000
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7921
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-20 09:23
个人简介

storage R&D guy.

文章分类

全部博文(1000)

文章存档

2019年(5)

2017年(47)

2016年(38)

2015年(539)

2014年(193)

2013年(178)

分类: 云计算

2015-07-27 18:00:09

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;
  ....}
}



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