泗县住房和城乡建设局网站,杭州建平台网站公司,怎么做网站规划,wordpress 文章标题调用1. 下载
官网地址#xff1a;Apache ZooKeeper
点击下载按钮 选择对应的版本进行下载 2. 使用
1、解压
tar -zxf apache-zookeeper-3.9.2-bin.tar.gz2、复制配置文件#xff0c;有一个示例配置文件 conf/zoo_sample.cfg#xff0c;此文件不能生效#xff0c;需要名称为…1. 下载
官网地址Apache ZooKeeper
点击下载按钮 选择对应的版本进行下载 2. 使用
1、解压
tar -zxf apache-zookeeper-3.9.2-bin.tar.gz2、复制配置文件有一个示例配置文件 conf/zoo_sample.cfg此文件不能生效需要名称为 zoo.cfg 的文件才能生效因此改名复制一份配置文件
cp conf/zoo_sample.cfg conf/zoo.cfg3、修改配置其他配置暂不做修改只重新指定一下 dataDir 的路径
# The number of milliseconds of each tick
tickTime2000
# The number of ticks that the initial
# synchronization phase can take
initLimit10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
#dataDir/tmp/zookeeper
dataDir../data
# the port at which the clients will connect
clientPort21814、启动 ZooKeeper 服务端
./bin/zkServer.sh start5、ZooKeeper 客户端连接本机连接可以不写 ip:port
./bin/zkCli.sh -server ip:port3. 常用命令
通过 help 命令可查看 ZooKeeper 常用命令
1、创建节点create 命令
在根目录下创建 node1 节点与它关联的内容是字符串 node1
create /node1 node1在 node1 节点下创建 node1.1 节点与它关联的内容是数字 123
create /node1/node1.1 1232、获取节点的数据get 命令
获取 node1 节点下 node1.1 子节点的数据get /node1/node1.1
[zk: localhost:2181(CONNECTED) 7] get /node1/node1.1
1233、更新节点数据内容set 命令
set /node1/node1.1 node1.1-1234、查看节点状态stat 命令
查看 node1 节点的状态stat /node1
[zk: localhost:2181(CONNECTED) 6] stat /node1
cZxid 0x4
ctime Tue Aug 20 17:01:23 CST 2024
mZxid 0x4
mtime Tue Aug 20 17:01:23 CST 2024
pZxid 0x5
cversion 1
dataVersion 0
aclVersion 0
ephemeralOwner 0x0
dataLength 5
numChildren 15、查看某个目录下的子节点ls 命令
查看根目录下的子节点ls /
[zk: localhost:2181(CONNECTED) 4] ls /
[node1, zookeeper]查看 node1 节点下的子节点和状态ls -s /node1
[zk: localhost:2181(CONNECTED) 9] ls -s /node1
[node1.1]
cZxid 0x4
ctime Tue Aug 20 17:01:23 CST 2024
mZxid 0x4
mtime Tue Aug 20 17:01:23 CST 2024
pZxid 0x5
cversion 1
dataVersion 0
aclVersion 0
ephemeralOwner 0x0
dataLength 5
numChildren 16、删除节点delete 命令要删除的节点必须没有子节点才行
删除 node1 节点delete /node1提示该节点不为空
[zk: localhost:2181(CONNECTED) 11] delete /node1
Node not empty: /node1删除 node1 节点下 node1.1 子节点delete /node1/node1.1
[zk: localhost:2181(CONNECTED) 12] delete /node1/node1.14. Curator
Curator 是 Netflix 公司开源的一套 ZooKeeper Java 客户端框架相比于 Zookeeper 自带的客户端 zookeeper 来说Curator 的封装更加完善各种 API 都可以比较方便地使用
4.1 引入依赖
版本自行选择
dependencygroupIdorg.apache.curator/groupIdartifactIdcurator-framework/artifactIdversion${curator.version}/version
/dependency
dependencygroupIdorg.apache.curator/groupIdartifactIdcurator-client/artifactIdversion${curator.version}/version
/dependency
dependencygroupIdorg.apache.curator/groupIdartifactIdcurator-recipes/artifactIdversion${curator.version}/version
/dependency4.2 连接 ZooKeeper 客户端
1、使用工厂类 CuratorFrameworkFactory 的静态 newClient() 方法
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;/*** Curator 客户端** author GreyFable* since 2024/8/22 11:33*/
public class CuratorClient {public static void main(String[] args) {// 重试策略RetryPolicy retryPolicy new ExponentialBackoffRetry(1000, 3);// 创建客户端实例CuratorFramework client CuratorFrameworkFactory.newClient(localhost:2181, retryPolicy);// 启动客户端client.start();}
}2、使用工厂类 CuratorFrameworkFactory 的静态 builder() 构造者方法
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;/*** Curator 客户端** author GreyFable* since 2024/8/22 11:33*/
public class CuratorClient {public static void main(String[] args) {RetryPolicy retryPolicy new ExponentialBackoffRetry(1000, 3);CuratorFramework client CuratorFrameworkFactory.builder().connectString(localhost:2181)// 会话超时时间.sessionTimeoutMs(5000)// 连接超时时间.connectionTimeoutMs(5000).retryPolicy(retryPolicy).build();client.start();}
}4.3 操作 ZooKeeper
1、判断节点是否存在
Stat stat client.checkExists().forPath(/node1/0001);
if (null ! stat) {System.out.println(节点已存在);
}2、创建节点
通常是将 znode 分为 4 大类
持久PERSISTENT节点 一旦创建就一直存在即使 ZooKeeper 集群宕机直到将其删除临时EPHEMERAL节点 临时节点的生命周期是与 客户端会话session 绑定的会话消失则节点消失 。并且临时节点 只能做叶子节点 不能创建子节点持久顺序PERSISTENT_SEQUENTIAL节点 除了具有持久PERSISTENT节点的特性之外 子节点的名称还具有顺序性。比如 /node1/app0000000001 、/node1/app0000000002临时顺序EPHEMERAL_SEQUENTIAL节点 除了具备临时EPHEMERAL节点的特性之外子节点的名称还具有顺序性
在使用 ZooKeeper 的时候会发现 CreateMode 类中实际有 7 种 znode 类型 但是用的最多的还是上面介绍的 4 种
创建默认持久化节点只有当父节点 /node1 存在时才会成功创建否则会报错
client.create().forPath(/node1/0001);创建指定类型的节点只有当父节点 /node1 存在时才会成功创建否则会报错
client.create().withMode(CreateMode.PERSISTENT).forPath(/node1/0002);父节点不存在时自动创建父节点使用 creatingParentsIfNeeded() 方法
client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(/node1/0003);创建节点并指定数据内容注意数据内容要是 byte 数组
client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(/node1/0004, 0004.getBytes());3、获取节点数据
byte[] bytes client.getData().forPath(/node1/0001);4、更新节点数据 client.setData().forPath(/node1/0001, 0001.getBytes());5、删除节点
删除一个子节点
client.delete().forPath(/node1/0001);删除一个节点以及其下的所有子节点
client.delete().deletingChildrenIfNeeded().forPath(/node1/0001);6、获取某个节点的所有子节点路径
ListString list client.getChildren().forPath(/node1/0001);4.4 监听器
Curator 引入了 Cache 来实现对 Zookeeper 服务端事件监听Cache 事件监听可以理解为一个本地缓存视图与远程 Zookeeper 视图的对比过程分为一下注册类型
NodeCache对某一个节点进行监听对当前节点数据变化进行处理PathChildrenCache对子节点进行监听但是不会对二级子节点进行监听对当前节点的子节点数据变化进行处理TreeCache对当前节点下所有节点进行监听对当前节点的子节点及递归子节点数据变化进行处理
不过在 Curator 5.1.0 以后NodeCache 、PathChildrenCache 、TreeCache 均已被弃用统一使用 CuratorCache 进行所有节点的事件监听对应的方法如下 forCreates()创建forChanges()设值forCreatesAndChanges()创建和设值forDeletes()删除如果删除多级节点会触发多次forAll()所有事件 默认情况下Listener 监听整个子树指定节点及其子节点的事件如果指定了 SINGLE_NODE_CACHE 选项则只监听单个节点的事件
CuratorCache curatorCache CuratorCache.build(client, /node1);
// CuratorCache curatorCache CuratorCache.build(client, /node1, CuratorCache.Options.SINGLE_NODE_CACHE);CuratorCacheListener listener CuratorCacheListener.builder().forCreates(childData -System.out.println(create: childData.getPath() new String(childData.getData()))).forChanges((oldNode, node) - System.out.println(change)).forCreatesAndChanges((oldNode, node) - System.out.println(createAndChange)).forDeletes(childData - System.out.println(delete)).forAll((type, oldData, data) - {if (type.name().equals(CuratorCacheListener.Type.NODE_CREATED.name())) {System.out.println(create);} else if (type.name().equals(CuratorCacheListener.Type.NODE_CHANGED.name())) {System.out.println(change);} else if (type.name().equals(CuratorCacheListener.Type.NODE_DELETED.name())) {System.out.println(delete);}}).build();curatorCache.listenable().addListener(listener);
curatorCache.start();