最近在同事指点下,写了一个zookeeper进行配置维护的工程,代码地址如下https://github.com/GOvoid/jwq/tree/master/eby-configuration
其中有一点,
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的集中管理,集群管理,分布式锁等等。
zookeeper可以用watcher进行监控,如果watcher监测到变化,进行相应操作后,则监控停止,需要重新定义一个watcher。
有没有定义一次,一直监控的方法呢,答案是有的,代码如下。可以指定znode以及针对不同事件进行的处理
import org.apache.curator.framework.recipes.cache.PathChildrenCache;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
private void regWatcherOnLineRserver(String group) throws Exception {
final PathChildrenCache childrenCache = new PathChildrenCache(ZKClient.getClient(), "/" + group, false);
childrenCache.start(PathChildrenCache.StartMode.NORMAL);
childrenCache.getListenable().addListener(
new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event)
throws Exception {
switch (event.getType()) {
case CHILD_ADDED:
logger.debug("CHILD_ADDED: " + event.getData().getPath());
break;
case CHILD_REMOVED:
logger.debug("CHILD_REMOVE: " + event.getData().getPath());
synchronized (propMap) {
propMap.remove(event.getData().getPath());
}
break;
case CHILD_UPDATED:
logger.debug("CHILD_UPDATED: " + event.getData().getPath());
synchronized (propMap) {
propMap.remove(event.getData().getPath());
}
break;
default:
break;
}
}
}
);
}
引用的包
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.2.0-incubating</version>
</dependency>
zookeeper的核心算法是paxos,栋哥在讲分布式存储的执行顺序一致性时,讲到该算法,用大家都申请涨工资来做了个比喻,对自己理解该算法有很大帮助,后续需要继续研究一下,加深理解
@TODO paxos算法