ZooKeeper安装和使用

1
2
3
4
5
6
7
8
9
//安装
docker pull zookeeper:3.5.8
//启动
docker run -d --name zookeeper -p 2181:2181 zookeeper:3.5.8
//进入容器
docker exec -it zookeeper /bin/bash
//启动zookeeper
cd bin
./zkCli.sh server 127.0.0.1:2181

常用命令演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//创节点
create /node1 "node1"
create /node1/node1.1 123
//跟新节点
set /node1 "node2"
//获取节点
get /node1
//查看节点 子节点
ls /
ls /node1
//查看节点状态
stat /node1
ls2 /node1
//删除节点
delete /node1/node1.1

ZooKeeper客户端Curator简单使用

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
private static final int BASE_SLEEP_TIME = 1000;
private static final int MAX_RETRIES = 3;

// Retry strategy. Retry 3 times, and will increase the sleep time between retries.
RetryPolicy retryPolicy = new ExponentialBackoffRetry(BASE_SLEEP_TIME, MAX_RETRIES);
CuratorFramework zkClient = CuratorFrameworkFactory.builder()
// the server to connect to (can be a server list)
.connectString("127.0.0.1:2181")
.retryPolicy(retryPolicy)
.build();
zkClient.start();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
zkClient.create().forPath("/node1");

zkClient.create().forPath("/node1/00001");
zkClient.create().withMode(CreateMode.PERSISTENT).forPath("/node1/00002");

zkClient.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/node1/00001");

zkClient.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/node1/00001");

zkClient.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/node1/00001","java".getBytes());
zkClient.getData().forPath("/node1/00001");//获取节点的数据内容,获取到的是 byte数组

zkClient.checkExists().forPath("/node1/00001");//不为null的话,说明节点创建成功

zkClient.delete().forPath("/node1/00001");

zkClient.delete().deletingChildrenIfNeeded().forPath("/node1");

zkClient.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/node1/00001","java".getBytes());
zkClient.getData().forPath("/node1/00001");//获取节点的数据内容
zkClient.setData().forPath("/node1/00001","c++".getBytes());//更新节点数据内容

List<String> childrenPaths = zkClient.getChildren().forPath("/node1");

1
2
3
4
5
6
7
String path = "/node1";
PathChildrenCache pathChildrenCache = new PathChildrenCache(zkClient, path, true);
PathChildrenCacheListener pathChildrenCacheListener = (curatorFramework, pathChildrenCacheEvent) -> {
// do something
};
pathChildrenCache.getListenable().addListener(pathChildrenCacheListener);
pathChildrenCache.start();
1
pathChildrenCacheEvent.getType()
1
2
3
4
5
6
7
8
9
10
11
12
public static enum Type {
CHILD_ADDED,//子节点增加
CHILD_UPDATED,//子节点更新
CHILD_REMOVED,//子节点被删除
CONNECTION_SUSPENDED,
CONNECTION_RECONNECTED,
CONNECTION_LOST,
INITIALIZED;

private Type() {
}
}