- 自序
- 概述
- 安装和运行 Zookeeper
- Zookeeper 开发实例
- ZooKeeper 中的组和成员
- 创建组
- 加入组
- 成员列表
- 删除分组
- Zookeeper 服务
- 数据模型 Data Model
- 操作 Operations
- 实现 Implementation
- 数据一致性 Consistency
- 会话 Sessions
- ZooKeeper 应用程序 Building Applications with ZooKeeper
- 配置服务 Configuration Service
- 坚韧的 ZooKeeper 应用 The Resilient ZooKeeper Application
- 一个稳定的配置服务 A reliable configuration service
- 生产环境中的 ZooKeeper ZooKeeper in Production
- 韧性和性能 Resilience and Performance
- 配置
创建组
我们使用 zookeeper 的 Java API 来创建一个 /zoo
的组节点:
public class CreateGroup implements Watcher {
private static final int SESSION_TIMEOUT = 5000;
private ZooKeeper zk;
private CountDownLatch connectedSignal = new CountDownLatch(1);
public void connect(String hosts) throws IOException, InterruptedException {
zk = new ZooKeeper(hosts, SESSION_TIMEOUT, this);
connectedSignal.await();
}
@Override
public void process(WatchedEvent event) { // Watcher interface
if (event.getState() == KeeperState.SyncConnected) {
connectedSignal.countDown();
}
}
public void create(String groupName) throws KeeperException,
InterruptedException {
String path = "/" + groupName;
String createdPath = zk.create(path, null/*data*/, Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
System.out.println("Created " + createdPath);
}
public void close() throws InterruptedException {
zk.close();
}
public static void main(String[] args) throws Exception {
CreateGroup createGroup = new CreateGroup();
createGroup.connect(args[0]);
createGroup.create(args[1]);
createGroup.close();
}
}
当 main()
执行时,首先创建了一个 CreateGroup
的对象,然后调用 connect()
方法,通过 zookeeper 的 API 与 zookeeper 服务器连接。创建连接我们需要 3 个参数:一是服务器端主机名称以及端口号,二是客户端连接服务器 session 的超时时间,三是 Watcher 接口的一个实例。Watcher 实例负责接收 Zookeeper 数据变化时产生的事件回调。
在连接函数中创建了 zookeeper 的实例,然后建立与服务器的连接。建立连接函数会立即返回,所以我们需要等待连接建立成功后再进行其他的操作。我们使用 CountDownLatch 来阻塞当前线程,直到 zookeeper 准备就绪。这时,我们就看到 Watcher 的作用了。我们实现了 Watcher 接口的一个方法:
public void process(WatchedEvent event);
当客户端连接上了 zookeeper 服务器,Watcher 将由 process()
函数接收一个连接成功的事件。我们接下来调用 CountDownLatch,释放之前的阻塞。
连接成功后,我们调用 create()
方法。我们在这个方法中调用 zookeeper 实例的 create()
方法来创建一个 znode。参数包括:一是 znode 的 path;二是 znode 的内容(一个二进制数组),三是一个 access control list(ACL,访问控制列表,这里使用完全开放模式),最后是 znode 的性质。
znode 的性质分为 ephemeral 和 persistent 两种。ephemeral 性质的 znode 在创建他的客户端的会话结束,或者客户端以其他原因断开与服务器的连接时,会被自动删除。而 persistent 性质的 znode 就不会被自动删除,除非客户端主动删除,而且不一定是创建它的客户端可以删除它,其他客户端也可以删除它。这里我们创建一个 persistent 的 znode。
create()
将返回 znode 的 path。我们讲新建 znode 的 path 打印出来。
我们执行如上程序:
% export CLASSPATH=ch21-zk/target/classes/:$ZOOKEEPER_HOME/*:\
$ZOOKEEPER_HOME/lib/*:$ZOOKEEPER_HOME/conf
% java CreateGroup localhost zoo
Created /zoo
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论