storage R&D guy.
全部博文(1000)
分类: 云计算
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;
....}
}