官方文档:https://zookeeper.apache.org/doc/current/zookeeperOver.html
一、zookeeper数据结构
ZooKeeper是一个分布式应用程序的分布式协调服务,主要用来做注册发现、配置管理、集群管理、分布式锁
ZooKeeper提供的名称空间与linux系统的名称空间非常相似。名称是由斜杠(/)分隔的一系列路径元素。ZooKeeper命名空间中的每个节点都有路径标识,同时可以存储少量数据
zookeeperServer主要命令
1、启动Zookeeper服务: bin/zkServer.sh start
2、查看服务状态,包括节点类型: bin/zkServer.sh status
3、停止服务: bin/zkServer.sh stop
4、重启服务: bin/zkServer.sh restart
zookeeperClient主要命令
1、客户端创建连接: bin/zkCli.sh -server localhost:2181
2、查看节点信息: ls /storm
3、create命令用于创建节点,其中-s为顺序充点,-e临时节点:
create /zookeeper/node1"test_create" world:anyone:fdsfds
4、delete命令用于删除节点,如delete /nodeDelete
5、set命令用于设置节点的数据,如: set /usergrid hellUsergrid
6、addauth命令用于节点认证,使用方式:如addauth digest username:password
7、setAcl命令用于设置节点Acl;Acl由三部分构成:
1为scheme,2为user,3为permission,一般情况下表示为scheme:id:permissions
二、curator客户端
<!-- 对zookeeper的底层api的一些封装 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.0.0</version>
</dependency>
<!-- 封装了一些高级特性,如:Cache事件监听、选举、分布式锁 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.0.0</version>
</dependency>
创建会话
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework zkClient =
CuratorFrameworkFactory.builder()
.connectString(ZKSERVERS)
.sessionTimeoutMs(SESSION_TIMEOUT)
.connectionTimeoutMs(CONNECTION_TIMEOUT)
.retryPolicy(retryPolicy)
.namespace("base")
.build();
zkClient.start();
//业务代码
zkClient.close();
基础操作
//普通创建
zkClient.create().forPath("/username");
//赋值创建
zkClient.create().forPath("/username", "xiaoqiaobian".getBytes());
//节点创建(递归创建) zkClient.create().creatingParentsIfNeeded().forPath("/user/name/zhangsan","create_data".getBytes());
//修改
zkClient.setData().forPath("/username","zhangsan".getBytes());
//删除
zkClient.delete().forPath("/username");
// 临时节点创建
zkClient.create().withMode(CreateMode.EPHEMERAL).forPath("/username/lisi");
// 临时节点创建(递归创建) zkClient.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath("/username/wangwu","create_ephemeral_data".getBytes());
三、分布式锁
cruator实现:通过创建顺序临时节点,在并发过程中去zookeeper中排队获取锁,当第一个顺序获取锁时,第二个顺序节点会被拦截在外,同时出发watch监听第一个节点状态,当第一个节点释放锁后,判断第二个顺序节点是当前优先节点,使其获取锁
InterProcessMutex lock = new InterProcessMutex(zkClient, "/lock");
//获取锁
lock.acquire();
Thread.sleep(1000);
//业务代码
getRandom(i);
//释放所
lock.release();
// 生成随机数
private static void getRandom(int i) {
Random random = new Random();
int result = random.nextInt(10);
System.out.println("第"+i+"个,随机数为" + result);
}