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);

浙公网安备 33010602011771号