使用Curator也可以简化Ephemeral Node (临时节点)的操作。 临时节点驻存在ZooKeeper中,当连接和session断掉时被删除。
比如通过ZooKeeper发布服务,服务启动时将自己的信息注册为临时节点,当服务断掉时ZooKeeper将此临时节点删除,这样client就不会得到服务的信息了。
PersistentEphemeralNode
类代表临时节点。 通过下面的构造函数创建:
public PersistentEphemeralNode(CuratorFramework client,
PersistentEphemeralNode.Mode mode,
String basePath,
byte[] data)
参数说明:
- client – client instance
- mode – creation/protection mode
- basePath – the base path for the node
- data – data for the node
其它参数还好理解, 不好理解的是PersistentEphemeralNode.Mode。
- EPHEMERAL: 以ZooKeeper的 CreateMode.EPHEMERAL方式创建节点。
- EPHEMERAL_SEQUENTIAL: 如果path已经存在,以CreateMode.EPHEMERAL创建节点,否则以CreateMode.EPHEMERAL_SEQUENTIAL方式创建节点。
- PROTECTED_EPHEMERAL: 以CreateMode.EPHEMERAL创建,提供保护方式。
- PROTECTED_EPHEMERAL_SEQUENTIAL: 类似EPHEMERAL_SEQUENTIAL,提供保护方式。
保护方式是指一种很边缘的情况: 当服务器将节点创建好,但是节点名还没有返回给client,这时候服务器可能崩溃了,然后此时ZK session仍然合法, 所以此临时节点不会被删除。对于client来说, 它无法知道哪个节点是它们创建的。
即使不是sequential-ephemeral,也可能服务器创建成功但是客户端由于某些原因不知道创建的节点。
Curator对这些可能无人看管的节点提供了保护机制。 这些节点创建时会加上一个GUID。 如果节点创建失败正常的重试机制会发生。 重试时, 首先搜索父path, 根据GUID搜索节点,如果找到这样的节点, 则认为这些节点是第一次尝试创建时创建成功但丢失的节点,然后返回给调用者。
节点必须调用start
方法启动。 不用时调用close
方法。
PersistentEphemeralNode 内部自己处理错误状态。
我们的例子创建了两个节点,一个是临时节点,一个事持久化的节点。 可以看到, client重连后临时节点不存在了。
package com.colobu.zkrecipe.node;
import java.util.concurrent.TimeUnit;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.nodes.PersistentEphemeralNode;
import org.apache.curator.framework.recipes.nodes.PersistentEphemeralNode.Mode;
import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.test.KillSession;
import org.apache.curator.test.TestingServer;
import org.apache.curator.utils.CloseableUtils;
public class PersistentEphemeralNodeExample {
private static final String PATH = "/example/ephemeralNode";
private static final String PATH2 = "/example/node";
public static void main(String[] args) throws Exception {
TestingServer server = new TestingServer();
CuratorFramework client = null;
PersistentEphemeralNode node = null;
try {
client = CuratorFrameworkFactory.newClient(server.getConnectString(), new ExponentialBackoffRetry(1000, 3));
client.getConnectionStateListenable().addListener(new ConnectionStateListener() {
@Override
public void stateChanged(CuratorFramework client, ConnectionState newState) {
System.out.println("client state:" + newState.name());
}
});
client.start();
//http://zookeeper.apache.org/doc/r3.2.2/api/org/apache/zookeeper/CreateMode.html
node = new PersistentEphemeralNode(client, Mode.EPHEMERAL,PATH, "test".getBytes());
node.start();
node.waitForInitialCreate(3, TimeUnit.SECONDS);
String actualPath = node.getActualPath();
System.out.println("node " + actualPath + " value: " + new String(client.getData().forPath(actualPath)));
client.create().forPath(PATH2, "persistent node".getBytes());
System.out.println("node " + PATH2 + " value: " + new String(client.getData().forPath(PATH2)));
KillSession.kill(client.getZookeeperClient().getZooKeeper(), server.getConnectString());
System.out.println("node " + actualPath + " doesn't exist: " + (client.checkExists().forPath(actualPath) == null));
System.out.println("node " + PATH2 + " value: " + new String(client.getData().forPath(PATH2)));
} catch (Exception ex) {
ex.printStackTrace();
} finally {
CloseableUtils.closeQuietly(node);
CloseableUtils.closeQuietly(client);
CloseableUtils.closeQuietly(server);
}
}
}
相关推荐
利用zookeeper的临时顺序节点实现分布式锁,同时控制多个quartz示例协作执行的代码。
ZKInspector:zookeeper节点管理工具,可以很方便地增删改查ZK集群当前的节点状态
详细介绍了Zookeeper的五种节点类型,包括持久化节点、持久化顺序节点、临时节点、临时顺序节点和容器节点,每种类型都有其独特的应用场景和功能。文章还探讨了Zookeeper在分布式系统中的经典应用,如配置中心、注册...
zookeeper-3.4.5-cdh5.4.0.jar
1.必须跟zookeeper放置在同一台机器 2.解压,配置start.sh、exhibitor.properties对应的zookeeper路径接口 3.启动start.sh
ZooInspector 用于查看zookeeper的节点信息 内含文件ZooInspector.zip,执行JAR包:zookeeper-dev-ZooInspector.jar
Zookeeper源码剖析:深入理解Leader选举机制
使用JAVA代码实现zookeeper服务的节点删除功能,代码带有注释简单易懂
Zookeeper以及kafka单节点发、服务部署
使用maven构建项目后,可以从下载或在zookeeper-assembly / target目录中找到。 apache-zookeeper-[version].tar.gz Contains all the source files which can be built by running: mvn clean install To ...
单节点将Zookeeper作为单节点启动docker run akomic/zookeeper多节点启动Zookeeper多节点集群(3个节点) docker run -e SERVER_ID=1 -e MAX_SERVERS=3 --name zookeeper-1 --restart=always akomic/zookeeperdocker...
docker.io/dabealu/zookeeper-exporter:v0.1.13
NULL 博文链接:https://425826501.iteye.com/blog/2424450
ZooKeeper-分布式过程协同技术详解 和 从Paxos到Zookeeper 分布式一致性原理与实践 电子书。喜欢请支持种作者。购买纸质版
-- 此rar文件包含两个ZooKeeper版本 一个3.4.6、一个3.4.14.无需积分可以直接下载,希望能够帮助到你。 zookeeper-3.4.14.tar.gz :2019-04-01 14:45 发布 zookeeper-3.4.6.tar.gz :2017-10-04 10:47 发布 ...
赠送jar包:zookeeper-3.4.6.jar;...使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:zookeeper-3.4.9.jar;...使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:zookeeper-3.3.3.jar;...使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
从Paxos到Zookeeper:分布式一致性原理与实践,适合分布式系统各阶段学习,并对分布式架构有深入的理解与提高