2、Zeekeeper基础
一、核心概念
1.1、文件系统数据结构
PERSISTENT(持久化目录节点),永远存在。
PERSISTENT_SEQUENTIAL(持久化顺序编号目录节点),永远存在。有个顺序编号
EPHEMERAL(临时目录节点),客户端与zookeeper断开连接后,该节点被删除。
EPHEMERAL_SEQUENTIAL(临时顺序编号目录节点),客户端与zookeeper断开连接后,该节点被删除。有个顺序编号。
Container节点(3.5.3 版本新增,如果Container节点下面没有子节点,则Container节点在未来会被Zookeeper自动清除,定时任务默认60s检查一次)。
TTL节点(默认禁用,只能通过系统配置 zookeeper.extendedTypesEnabled=true开启)。
1.2、客户端监听通知机制
如果注册的是对某个节点的监听,则当这个节点被删除,或者被修改时,对应的客户端将被通知。
如果注册的是对某个目录的监听,则当这个目录有子节点被创建、有子节点被删除,对应的客户端将被通知。
如果注册的是对某个目录的递归子节点进行监听,则当这个目录下面的任意子节点有目录结构的变化(有子节点被创建,或被删除)或者根节点有数据变化时,对应的客户端将被通知。
1.3、ACL权限控制( Access Control List )
权限模式(Scheme)
范围验证:可以针对一个IP或者一段IP地址授予某种权限。
比如可以让一个 IP 地址为“ip:192.168.1.100”的机器对服务器上的某个数据节点具有写入的权限。或者也可以通过“ip:192.168.1.1/24”给一段IP地址的机器赋权。
口令验证:也就是用户名密码的方式去验证。
在ZooKeeper中这种验证方式是Digest认证,而Digest这种认证方式首先在客户端传送“username:password”这种形式的权限表示符后,ZooKeeper服务端会对密码部分使用SHA-1和BASE64算法进行加密,以保证安全性。
授权对象(ID)
c:create:数据节点创建权限,授予权限的对象可以在数据节点下创建子节点。
w:wirte:数据节点更新权限,授予权限的对象可以更新该数据节点。
r:read:数据节点读取权限,授予权限的对象可以读取该节点的内容以及子节点的列表信息。
d:delete:数据节点删除权限,授予权限的对象可以删除该数据节点的子节点。
a:admin:数据节点管理者权限,授予权限的对象可以对该数据节点体进行 ACL 权限设。
1.4、ZooKeeper内存数据
public class DataTree {
private final ConcurrentHashMap<String, DataNode> nodes =
new ConcurrentHashMap<String, DataNode>();
private final WatchManager dataWatches = new WatchManager();
private final WatchManager childWatches = new WatchManager();
}DataNode 是Zookeeper存储节点数据的最小单位
public class DataNode implements Record {
byte data[];
Long acl;
public StatPersisted stat;
private Set<String> children = null;
}1.5、ZooKeeper事务日志
java -classpath .:slf4j-api-1.7.25.jar:zookeeper-3.5.8.jar:zookeeper-jute-3.5.8.jar org.apache.zookeeper.server.LogFormatter /usr/local/zookeeper/apache-zookeeper-3.5.8-bin/data/version-2/log.1
1.6、ZooKeeper数据快照
java -classpath .:slf4j-api-1.7.25.jar:zookeeper-3.5.8.jar:zookeeper-jute-3.5.8.jar org.apache.zookeeper.server.SnapshotFormatter /usr/local/zookeeper/apache-zookeeper-3.5.8-bin/data-dir/version-2/snapshot.0
二、Zeekeeper基础命令
2.1、节点相关命令
创建节点
create [‐s] [‐e] [‐c] [‐t ttl] path [data] [acl] 中括号为可选项,没有则默认创建持久化 -s:顺序节点 ‐e:临时节点 -c:容器节点 -t:可以给节点添加过期时间,默认禁用,需要通过系统参数-Dzookeeper.extendedTypesEnabled=true启用. 举例: create /test‐node some‐data
查看节点
get /test‐node
修改节点数据
set /test‐node some‐data‐changed
查看节点信息
stat /test‐node
cZxid:创建znode的事务ID(Zxid的值)。
mZxid:最后修改znode的事务ID。
pZxid:最后添加或删除子节点的事务ID(子节点列表发生变化才会发生改变)。
ctime:创建时间。
mtime:最近修改时间。
dataVersion:节点当前数据版本。
cversion:子节点结果集版本(一个节点的子节点增加、删除都会影响这个版本)。
aclVersion:表示对此znode的acl版本。
ephemeralOwner:节点是临时节点时,表示节点所有者的session ID。 如果znode不是临时节点,则该字段设置为零。
dataLength:节点数据字段的长度。
numChildren:节点的子znode的数量。
查看节点状态信息同时查看数据
通过版本号据实现乐观锁
set -v 1 /test-node textName
如果在执行上面 set命令前, 有人修改了数据,zookeeper 会递增版本号, 这个时候,如果再用以前的版本号去修改,将会导致修改失败,报如下错误
2.2、事件监听
get ‐w /path // 注册监听的同时获取数据 stat ‐w /path // 对节点进行监听,且获取元数据信息
ls ‐R ‐w /path
如下对/test节点进行递归监听,但是每个目录下的目录监听也是一次性的,如第一次在/test目录下创建节点时,触发监听事件,第二次则没有,同样,因为时递归的目录监听,所以在/test/sub0下进行节点创建时,触发事件,但是再次创建/test/sub0/subsub1节点时,没有触发事件。
None: 连接建立事件
NodeCreated:节点创建。
NodeDeleted:节点删除。
NodeDataChanged:节点数据变化。
NodeChildrenChanged:子节点列表变化。
DataWatchRemoved:节点监听被移除。
ChildWatchRemoved:子节点监听被移除。
2.3、Zookeeper的 ACL权限控制命令
getAcl:获取某个节点的acl权限信息。 setAcl:设置某个节点的acl权限信息。 addauth:输入认证授权信息,相当于注册用户信息,注册时输入明文密码,zk将以密文的形式存储。
生成授权ID的两种方式
@Test
public void generateSuperDigest() throws NoSuchAlgorithmException {
String sId = DigestAuthenticationProvider.generateDigest("gj:test");
System.out.println(sId);// gj:X/NSthOB0fD/OT6iilJ55WJVado=
}命令方式
echo ‐n <user>:<password> | openssl dgst ‐binary ‐sha1 | openssl base64
设置ACL有两种方式
create /zk‐node datatest digest:gj:X/NSthOB0fD/OT6iilJ55WJVado=:cdrwa 或者 setAcl /zk‐node digest:gj:X/NSthOB0fD/OT6iilJ55WJVado=:cdrwa
添加授权信息后不能直接访问直接访问将报如下异常
异常信息:org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /zk‐node
访问前需要添加授权信息
addauth digest gj:test
auth明文授权
addauth digest zender:123 create /node‐1 node1data auth:zender:123:cdwra 这是zender用户授权信息会被zk保存,可以认为当前的授权用户为zender get /node‐1 node1data
IP授权模式
setAcl /node‐ip ip:192.168.109.128:cdwra create /node‐ip data ip:192.168.109.128:cdwra 多个指定IP可以通过逗号分隔: setAcl /node‐ip ip:192.168.109.128:cdwra,ip:192.168.109.129:zender
Super超级管理员模式
‐Dzookeeper.DigestAuthenticationProvider.superDigest=super:<base64encoded(SHA1(password))
版权声明
非特殊说明,本文由Zender原创或收集发布,欢迎转载。
ZENDER






发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。