一、Zookeeper的应用场景
1、维护配置信息
2、分布式锁服务
3、集群管理
4、生成分布式唯一ID
二、Zookeeper的数据结构:树状节点组成,如下图所示:
节点可以分为临时节点和持久化节点,
临时节点只存在创建的会话有效期内,并且当服务器停掉之后,临时节点也会消失
持久化节点:在创建之后,即便是会话结束,服务器停掉了,节点也不会消失,直到使用删除命令进行删除
三、操作节点
1、创建节点
持久化节点:create /Hadoop "test"
持久化有序节点:create -s /Hadoop "test"
临时节点:create -e /Hadoop "test"
创建有序临时节点:create -s -e/Hadoop "test"
创建的有序节点会在生成的节点名称后面加上000001,例如Hadoop00001、Hadoop00002
2、修改节点
set /Hadoop "test"
set /Hadoop "123456" 2
2位当前节点的版本
3、删除节点
delete /Hadoop "123456" 2
如果需要删除的节点下面有子节点,需要删除子节点之后才能删除当前节点
4、查看节点的状态
stat /hadoop :只输出节点的状态
get -s /hadoop :输出节点的值和节点的状态
获取节点数据
get /Hadoop
cZxid:数据节点创建时的事务ID
ctime:数据节点创建时的时间
mZxid:数据节点最后一次更新时事务ID
mtime:数据节点最后一次更新时的时间
pZxid:数据节点的子节点最后一次被修改时的事务ID
cVersion:子节点更改的次数
dataVersion:节点数据的更改次数
aclVersion:节点的ACL的更改次数
ephemeralOwner:如果节点是临时节点,则表示创建该节点的会话的Session ID;
如果节点是持久化的节点,该属性值为1
dataLength:数据内容的长度
numChildren:数据及诶单当前的字节点个数
5、监听节点数据变化
get -w /hadoop
四、Zookeeper的acl权限控制
1、acl权限控制
使用scheme:id:permission来表示同意,主要涵盖三个方面
权限模式(scheme)、授权对象(id)、权限(permission)
Zookeeper的权限控制是基于每个znode节点的,需要对每一个节点设置权限
每个znode支持设置多种权限控制方案和多个权限
子节点不会继承父节点的权限,客户端无权访问某节点,但是可能可以访问他的子节点
2、权限模式
world:只有一个用户:anyone,代表登录zookeeper所有人
IP:对客户端使用IP地址认证
auth:使用已添加认证的用户认证
digest:使用用户名和密码的方式认证
3、授权的权限
create:c 可以创建子节点
delete:d 可以删除子节点(仅仅是下一级节点)
read:r 可以读取节点数据及显示子节点列表
write:w 可以设置节点数据
admin:a 可以设置节点访问控制列表权限
4、授权相关的命令
getAcl:读取ACL权限
setAcl:设置ACL权限
addauth:添加认证用户
5、授权案例
world授权:setAcl /hadoop world:anyone:cdrwa
对所有用户进行授权,拥有的权限是:增删改查管理
IP授权:setAcl /hadoop ip:192.168.10.11:cdrwa
对IP为192.168.10.11用户授权
对多个用户进行授权:
setAcl /hadoop ip:192.168.10.11:cdrwa,ip:192.168.10.12:cdrwa
auth授权:
添加认证用户: addauth digest user:password
setAcl /hadoop auth:user:password
Digest授权:
通过SHA1和BASE64来计算一个密文: echo -n tealala:123456 | openssl dgst -binary -sha1 |openssl base64
setAcl /node4 digest:tealala:19yWFKnBZEez6FMDn5lBfMG1SUo=:cdrwa
ACL 超级管理员:
echo -n super:admin | openssl dgst -binary -sha1 |openssl base64
五、ZookeeperAPI
第一步、建立连接
第二步、对数据节点进行增删改查操作
第三步、关闭连接
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class ZookeeperCreate {
private String ip="localhost:2181";
private ZooKeeper zooKeeper;
@BeforeAll
public void before(){
System.out.println("before");
CountDownLatch countDownLatch = new CountDownLatch(1);
try {
zooKeeper = new ZooKeeper(ip, 5000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getState() == Event.KeeperState.SyncConnected){
System.out.println("连接创建成功");
}
countDownLatch.countDown();
System.out.println(watchedEvent.getState());
}
});
countDownLatch.await();
System.out.println(zooKeeper.getSessionId());
}catch (Exception e){
}
}
@AfterAll
public void after() throws InterruptedException {
System.out.println("after");
zooKeeper.close();
}
@Test
public void test() throws KeeperException, InterruptedException {
System.out.println("create");
//节点对路径,节点的数据,权限列表,节点类型
zooKeeper.create("/create/node1","111".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
}
@Test
public void create2() throws KeeperException, InterruptedException {
List<ACL> aclList = new ArrayList<>();
Id id = new Id("world","anyone");
aclList.add(new ACL(ZooDefs.Perms.READ,id));
zooKeeper.create("/create/node2","2222".getBytes(), aclList, CreateMode.PERSISTENT);
}
@Test
public void create3() throws KeeperException, InterruptedException {
List<ACL> aclList = new ArrayList<>();
Id id = new Id("ip","192.168.1.155");
aclList.add(new ACL(ZooDefs.Perms.READ,id));
zooKeeper.create("/create/node3","3333".getBytes(), aclList, CreateMode.PERSISTENT);
}
@Test
public void create4() throws KeeperException, InterruptedException {
zooKeeper.addAuthInfo("digest","tealala:123456".getBytes());
zooKeeper.create("/create/node4","4444".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
}
@Test
public void create5() throws KeeperException, InterruptedException {
zooKeeper.addAuthInfo("digest","tealala:123456".getBytes());
List<ACL> acls = new ArrayList<>();
Id id = new Id("auth","tealala");
acls.add(new ACL(ZooDefs.Perms.READ, id));
zooKeeper.create("/create/node5","55555".getBytes(), acls, CreateMode.PERSISTENT);
}
@Test
public void create6() throws KeeperException, InterruptedException {
String result = zooKeeper.create("/create/node5","55555".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
System.out.println(result);
}
@Test
public void create7() throws KeeperException, InterruptedException {
String result = zooKeeper.create("/create/node7","7777".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println(result);
}
@Test
public void create8() throws KeeperException, InterruptedException {
String result = zooKeeper.create("/create/node8","8888".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println(result);
}
@Test
public void create9() throws KeeperException, InterruptedException {
zooKeeper.create("/create/node9", "999999".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL, new AsyncCallback.StringCallback() {
@Override
public void processResult(int i, String path, Object ctx, String name) {
System.out.println(i);
System.out.println(name);
System.out.println(ctx);
System.out.println(path);
}
},"content");
System.out.println("finish");
}
}
这里只列举了新增节点的操作。