zookeeper-分布式协调系统

一、zookeeper-分布式协调系统

下载地址:https://zookeeper.apache.org/releases.html

1、概述

zookeeper是一个树形的存储系统,根是 “/”,zookeeper=文件系统+监听通知机制,客户端可以注册监听它关心的目录节点,当目录节点发生变化(数据改变、被删除、子目录节点增加删除)时,zookeeper会通知客户端

2、结构

zookeeper类似于Linux的文件树结构,不同的是,zookeeper的节点本身可以存储数据

3、排它锁

使用zookeeper的客户端创建节点时,若不同的客户端所要创建的节点路径相同,则只有一个会被创建成功,可以利用这个特性设计排它锁,节点创建成功则获得锁(其他的客户端监听该节点,若节点销毁,则表明该锁被释放或持有锁的客户端断开连接,其他客户端可以再次竞争性的创建该节点)

4、持久节点和临时节点

节点可以按照存在时间分为持久节点和临时节点

1、持久节点

节点会一直存在直到被手动销毁

2、临时节点

创建该节点的客户端一旦断开连接,该节点自动销毁

5、权限特性

  • ZooKeeper的权限控制是基于每个zNode节点的,需要对每个节点设置权限
  • 每个zNode支持设置多种权限控制方案和多个权限
  • 子节点不会继承父节点的权限,客户端无权访问某节点,但可能可以访问它的子节点
  • 客户端断开连接后,需要重新addauth认证

6、权限细节

ACL 权限控制,使用<权限模式>:<授权对象>:<权限> 来标识

1、权限模式

权限模式分为四类:world,ip,auth,digest

  • world:默认的权限模式,只有一个用户:anyone,代表所有人
  • ip:使用IP地址认证,设置ip地址或地址段,只允许此 地址下的客户端
  • auth:使用已添加认证的用户认证,此方式需要提前在zookeeper服务器中添加用户,设置密码时应使用明文密码,服务器将自动加密保存
  • digest:使用“用户名:密码”方式认证,此方式输入的密码应使用密文,服务器不会自动对这里的密码加密
2、授权对象

授权对象可以是具体的用户或者一个实体(IP、机器)

3、权限

权限分为五种,CREATE, DELETE, WRITE, READ, ADMIN, 设置权限时,使用其简写,如:auth:tom:cdr,表示对tom授予CREATE, DELETE, READ权限

  • CREATE 简写c 可以创建子节点
  • DELETE 简写d 可以删除子节点
  • READ 简写r 可以读取节点数据及显示子节点列表
  • WRITE 简写w 可以设置节点数据
  • ADMIN 简写a 可以设置节点访问控制列表权限

7、命令行

1、world模式
setAcl <path> world:anyone:<acl>
setAcl /node1 world:anyone:cdrwa
2、ip模式
setAcl <path> ip:<ip>:<acl>
setAcl /node2 ip:192.168.100.1:cdrwa
3、auth模式

先addauth添加用户,然后对用户设置权限

#添加认证用户
addauth digest <user>:<password>
setAcl <path> auth:<user>:<acl>
4、digest模式

这里的密码是经过SHA1及BASE64处理的密文

在SHELL中可以通过以下命令计算:
echo -n <user>:<password> | openssl dgst -binary -sha1 | openssl base64
例如:
echo -n yoonper:123456 | openssl dgst -binary -sha1 | openssl base64
UvJWhBril5yzpEiA2eV7bwwhfLs=
      
setAcl <path> digest:<user>:<password>:<acl>
setAcl /node4 digest:yoonper:UvJWhBril5yzpEiA2eV7bwwhfLs=:cdrwa

8、Java API

在pom中导入合适版本的jar包:https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper

1、连接到zookeeper服务器
final CountDownLatch countDownLatch = new CountDownLatch(1);
//连接成功后,会回调watcher监听,此连接操作是异步的,执行完new语句后,直接调用后续代码
Zookeeper zooKeeper = new ZooKeeper(CONNECT_STRING, TIMEOUT, new Watcher() {
    public void process(WatchedEvent event) {
        if(Event.KeeperState.SyncConnected == event.getState()){
            //如果收到了服务端的响应事件,连接成功
            countDownLatch.countDown();
        }
    }
});
countDownLatch.await();
2、身份认证

如果将要访问的资源有权限要求,则应当在访问之前向服务器验证身份,获取对应资源的访问权限

zooKeeper.addAuthInfo("digest", "username:password".getBytes());
3、查询节点权限
List<ACL> aclList = zooKeeper.getACL(String path, Stat stat);
4、查询子节点
List<String> children = zooKeeper.getChildren(String path, Watcher watcerh);
5、设置节点权限
//perm: Perms 枚举
//id:Ids 枚举
ACL acl = new ACL(int perm, ID id);

//version: Version 枚举
Stat stat = zooKeeper.setACL(String path, List<ACL> list, int version);
6、检测节点及注册监听
//若存在,该方法返回节点的状态信息
//若watcher非空,则该方法还可以对节点注册监听器,监听节点的状态
Stat stat = zooKeeper.exists(String path, Watcher watcher)
7、设置节点数据
//version: Version 枚举
//data: String.getBytes() 可以返回 Byte[]
zooKeeper.setData(String path, byte[] data, int version);
8、查询节点数据
byte[] data = zooKeeper.setData(String path, byte[] data, int version)
String str = new String(data);
9、创建节点
//mode: CreateMode 枚举
zooKeeper.create(String path, byte[] data, List<ACL> list, CreateMode mode);
10、删除节点
zookeeper.delete(String path, int version);
posted @ 2023-06-14 09:29  谭五月  阅读(28)  评论(0)    收藏  举报