1. zookeeper 搭建
参考:
http://blog.csdn.net/zhaoguoxian12345/article/details/7729215
2. 使用zookeeper 编程
理解watcher , barrier, produce/consume的实例
package zk;
import java.io.IOException;
import java.util.List;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
public class Demo {
private static final int TIMEOUT = 3000;
public static void main(String[] args) throws IOException {
ZooKeeper zkp = new ZooKeeper("localhost:2181", TIMEOUT, null);
try {
// 创建一个EPHEMERAL类型的节点,会话关闭后它会自动被删除
zkp.create("/node1", "data1".getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL);
if (zkp.exists("/node1", false) != null) {
System.out.println("node1 exists now.");
}
try {
// 当节点名已存在时再去创建它会抛出KeeperException(即使本次的ACL、CreateMode和上次的不一样)
zkp.create("/node1", "data1".getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
} catch (KeeperException e) {
System.out.println("KeeperException caught:" + e.getMessage());
}
// 关闭会话
zkp.close();
zkp = new ZooKeeper("localhost:2181", TIMEOUT, null);
// 重新建立会话后node1已经不存在了
if (zkp.exists("/node1", false) == null) {
System.out.println("node1 dosn't exists now.");
}
// 创建SEQUENTIAL节点
zkp.create("/node-", "same data".getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT_SEQUENTIAL);
zkp.create("/node-", "same data".getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT_SEQUENTIAL);
zkp.create("/node-", "same data".getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT_SEQUENTIAL);
List<String> children = zkp.getChildren("/", null);
System.out.println("Children of root node:");
for (String child : children) {
System.out.println(child);
}
zkp.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
关于watcher, 可以参考:
配置推送(Watcher)
zookeeper为解决数据的一致性,使用了Watcher的异步回调接口,将服务端znode的变化以事件的形式通知给客户端,主要是一种反向推送的机制,让客户端可以做出及时响应。比如及时更新后端的可用集群服务列表。
这里有篇文章介绍Watcher/Callback比较详细,可以参考下:
- http://luzengyi.blog.163.com/blog/static/529188201064113744373/
- http://luzengyi.blog.163.com/blog/static/529188201061155444869/
如果想更好的理解Watcher的使用场景,可以了解下使用Watcher机制实现分布式的Barrier , Queue , Lock同步。
http://zookeeper.apache.org/doc/r3.3.3/zookeeperProgrammers.html
3. 关于paxos算法
4. storm如何使用zk
参看: http://xumingming.sinaapp.com/466/twitter-storm-code-analysis-zookeeper-dirs/