- 自序
- 概述
- 安装和运行 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
- 配置
成员列表
下面我们实现一个程序来列出一个组中的所有成员。
public class ListGroup extends ConnectionWatcher {
public void list(String groupName) throws KeeperException,
InterruptedException {
String path = "/" + groupName;
try {
List<String> children = zk.getChildren(path, false);
if (children.isEmpty()) {
System.out.printf("No members in group %s\n", groupName);
System.exit(1);
}
for (String child : children) {
System.out.println(child);
}
} catch (KeeperException.NoNodeException e) {
System.out.printf("Group %s does not exist\n", groupName);
System.exit(1);
}
}
public static void main(String[] args) throws Exception {
ListGroup listGroup = new ListGroup();
listGroup.connect(args[0]);
listGroup.list(args[1]);
listGroup.close();
}
}
我们在 list()
方法中通过调用 getChildren()
方法来获得某一个 path 下的子节点,然后打印出来。我们这里会试着捕获 KeeperException.NoNodeException,当 znode 不存在时会抛出这个异常。我们运行程序,会看见如下结果,说明我们还没在 zoo 组中添加任何成员几点:
% java ListGroup localhost zoo
No members in group zoo
我们可以运行之前的 JoinGroup
来添加成员。在后台运行一些 JoinGroup 程序,这些程序添加节点后都处于 sleep 状态:
% java JoinGroup localhost zoo duck &
% java JoinGroup localhost zoo cow &
% java JoinGroup localhost zoo goat &
% goat_pid=$!
最后一行命令的作用是将最后一个启动的 java 程序的 pid 记录下来,我们好在列出 zoo 下面的成员后,将该进程 kill 掉。
下面我们将 zoo 下的成员打印出来:
% java ListGroup localhost zoo
goat
duck
cow
然后我们将 kill 掉最后启动的 JoinGroup 客户端:
% kill $goat_pid
过几秒后,我们发现 goat 节点不见了。因为之前我们创建的 goat 节点是一个 ephemeral 节点,而创建这个节点的客户端在 ZooKeeper 上的会话已经被终结了,因为这个回话在 5 秒后失效了(我们设置了会话的超时时间为 5 秒):
% java ListGroup localhost zoo
duck
cow
让我们回过头来看看,我们到底都做了一些什么?我们首先创建了一个节点组,这些节点的创建者都在同一个分布式系统中。这些节点的创建者之间互相都不知情。一个创建者想使用这些节点数据进行一些工作,例如通过 znode 节点是否存在来判断节点的创建者是否存在。
最后一点,我们不能只依靠组成员关系来完全解决在与节点通信时的网络错误。当与一个集群组成员节点进行通信时,发生了通信失败,我们需要使用重试或者试验与组中其他的节点通信,来解决这次通信失败。
Zookeeper 的命令行工具
Zookeeper 有一套命令行工具。我们可以像如下使用,来查找 zoo 下的成员节点:
% zkCli.sh -server localhost ls /zoo
[cow, duck]
你可以不加参数运行这个工具,来获得帮助。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论