1 zookeeper的安装及配置
参考我的文章第5.1小结
2 命令行方式访问
help用法帮助
2.1 创建节点
语法格式
create [-s] [-e] path data acl
2.1.1 创建临时节点
create -e 路径 数据
create -e /my-ephemeral-node my-ephemeral-testdata
第二个客户端也能看到刚刚创建的临时节点
测试-e参数的临时性
关闭第一个客户端链接
关闭后从第二个客户端看不到临时节点啦
2.1.2 创建永久节点
create -e 路径 数据
create /my-persistent-node my-persistent-testdata
2.1.3 创建有序节点
create -s -e 路径 数据
create -s -e /my-sequential-node my-sequential-data1
create -s -e /my-sequential-node my-sequential-data2
create -s -e /my-sequential-node my-sequential-data3
2.1.4 acl访问控制
create -s -e 路径 数据 acl
acl的语法格式是 权限检验策略:用户:权限
- 权限检验策略即scheme有五种类型:world、auth、digest、IP、super
- 用户:可以通过
addauth digest 用户:密码
任何人的话是anyone - 权限:crdwa,分别表示create,read,delete,write,admin
# 创建一个用户zhangsan,密码123456
addauth digest zhangsan:123456
# 创建一个用户lisi,密码123456
addauth digest lisi:123456
2.1.4.1 world策略
默认策略是world策略,固定用户是anyone,相当于全部都能访问
create /mynode mynode-testdata world:anyone:crdwa
delete /mynode
2.1.4.2 auth策略
auth检验策略表示给认证通过的所有用户设置acl权限
addauth digest zhangsan:123456
create /mynode mynode-testdata auth:zhangsan:crdwa
delete /mynode
另一个客户端需要添加相应用户才能链接
2.1.4.3 digest策略
与auth类似,但是auth只保证了用户名正确即可,digest可以把密码一起搭进去送命
@Test
public void testDigest() throws NoSuchAlgorithmException {
String digest = DigestAuthenticationProvider.generateDigest("zhangsan:123456");
System.out.println(digest);
}
把输出的字符串加到我们的用户中
create /mynode mynode-testdata digest:zhangsan:jA/7JI9gsuLp0ZQn5J5dcnDQkHA=:crdwa
另一个客户端链接不上,添加相应用户,并且密码经过digest算法换算后正确才能够访问
2.1.4.4 ip策略
指定ip进行访问
create /mynode mynode-testdata ip:192.168.245.210:crdwa
ip换成192.168.245.210就ok
2.1.4.5 super策略
super策略指定的用户具有类似linux root用户的权限,可以操作任何znode节点
先产生个用户密码
@Test
public void testDigest() throws NoSuchAlgorithmException {
String digest = DigestAuthenticationProvider.generateDigest("admin:123456");
System.out.println(digest);
}
zk启动是加入参数
-Dzookeeper.DigestAuthenticationProvider.superDigest=admin:0uek/hZ/V9fgiM35b0Z2226acMQ=
编辑启动脚本
cd /root/app/zookeeper-3.4.6/bin
# 直接跳转到110行进行编辑
vim +110 zkServer.sh
"-Dzookeeper.DigestAuthenticationProvider.superDigest=admin:0uek/hZ/V9fgiM35b0Z2226acMQ=" \
重启zk后,通过jinfo查看是否启动成功
测试
在node1的客户端创建一个znode
在第二个客户端,有两个可以访问刚刚添加的znode,一个是创建时指定的zhangsan:123456用户,另一个就是super 策略指定的admin用户
2.2. 获取节点信息
语法格式:
get path [watch]
get /my-ephemeral-node
2.3 修改节点的数据
语法格式:
set path data [version]
set /my-ephemeral-node my-ephemeral-testdata-modified
set 后dataVersion+1
再set一次看看 dataVersioni再+1
2.4 删除节点
语法格式:
delete path [version]
3 java api方式
创建一个maven工程,在pom.xml文件中导入zookeeper依赖jar包
<!--junit依赖包-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!--zookeeper依赖包-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
3.1 创建节点
3.1.1 创建临时节点
public class TestZookeeper implements Watcher{
public static ZooKeeper zooKeeper;
@Test
public void testCreate() throws IOException, KeeperException, InterruptedException {
String path = "/my-ephemeral-node";
zooKeeper = new ZooKeeper("192.168.245.210:2181",60000, new TestZookeeper());
zooKeeper.exists(path, true);
// 创建临时节点
zooKeeper.create(path, "my-ephemeral-testdata".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
}
@Override
public void process(WatchedEvent watchedEvent) {
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
if (Event.EventType.NodeCreated == watchedEvent.getType()) {
System.out.println("Node create success");
}
}
}
}
3.1.2 创建永久节点
public class TestZookeeper implements Watcher{
public static ZooKeeper zooKeeper;
@Test
public void testCreate() throws IOException, KeeperException, InterruptedException {
String path = "/my-persistent-node";
zooKeeper = new ZooKeeper("192.168.245.210:2181",60000, new TestZookeeper());
zooKeeper.exists(path, true);
// 创建永久节点
zooKeeper.create(path, "my-persistent-testdata".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
@Override
public void process(WatchedEvent watchedEvent) {
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
if (Event.EventType.NodeCreated == watchedEvent.getType()) {
System.out.println("Node create success");
}
}
}
}
3.1.3 创建有序节点
public class TestZookeeper implements Watcher{
public static ZooKeeper zooKeeper;
@Test
public void testCreate() throws IOException, KeeperException, InterruptedException {
String path = "/my-sequential-node";
zooKeeper = new ZooKeeper("192.168.245.210:2181",60000, new TestZookeeper());
zooKeeper.exists(path, true);
// 创建有序节点
zooKeeper.create(path, "my-sequential-data1".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
zooKeeper.create(path, "my-sequential-data2".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
zooKeeper.create(path, "my-sequential-data3".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
}
@Override
public void process(WatchedEvent watchedEvent) {
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
if (Event.EventType.NodeCreated == watchedEvent.getType()) {
System.out.println("Node create success");
}
}
}
}
3.1.4.1 world策略
public class TestZookeeper implements Watcher{
public static ZooKeeper zooKeeper;
@Test
public void testCreate() throws IOException, KeeperException, InterruptedException {
String path = "/mynode";
zooKeeper = new ZooKeeper("192.168.245.210:2181",60000, new TestZookeeper());
zooKeeper.exists(path, true);
// world
zooKeeper.create(path, "mynode-testdata".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
@Override
public void process(WatchedEvent watchedEvent) {
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
if (Event.EventType.NodeCreated == watchedEvent.getType()) {
System.out.println("Node create success");
}
}
}
}
3.4.1.2 auth策略
public class TestZookeeper implements Watcher{
public static ZooKeeper zooKeeper;
@Test
public void testCreate() throws IOException, KeeperException, InterruptedException {
String path = "/mynode";
zooKeeper = new ZooKeeper("192.168.245.210:2181",60000, new TestZookeeper());
zooKeeper.exists(path, true);
// auth
zooKeeper.addAuthInfo("digest","zhangsan:123456".getBytes());
Id id = new Id();
id.setId("zhangsan");
id.setScheme("auth");
ACL acl = new ACL();
acl.setId(id);
acl.setPerms(ZooDefs.Perms.ALL);
List<ACL> acls = new ArrayList<>();
acls.add(acl);
zooKeeper.create(path, "mynode-testdata".getBytes(), acls, CreateMode.PERSISTENT);
}
@Override
public void process(WatchedEvent watchedEvent) {
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
if (Event.EventType.NodeCreated == watchedEvent.getType()) {
System.out.println("Node create success");
}
}
}
}
3.4.1.3 digest策略
public class TestZookeeper implements Watcher{
public static ZooKeeper zooKeeper;
@Test
public void testCreate() throws IOException, KeeperException, InterruptedException {
String path = "/mynode";
zooKeeper = new ZooKeeper("192.168.245.210:2181",60000, new TestZookeeper());
zooKeeper.exists(path, true);
// digest
Id id = new Id();
id.setId("zhangsan:jA/7JI9gsuLp0ZQn5J5dcnDQkHA=");
id.setScheme("digest");
ACL acl = new ACL();
acl.setId(id);
acl.setPerms(ZooDefs.Perms.ALL);
List<ACL> acls = new ArrayList<>();
acls.add(acl);
zooKeeper.create(path, "mynode-testdata".getBytes(), acls, CreateMode.PERSISTENT);
}
@Override
public void process(WatchedEvent watchedEvent) {
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
if (Event.EventType.NodeCreated == watchedEvent.getType()) {
System.out.println("Node create success");
}
}
}
}
3.4.1.4 ip策略
public class TestZookeeper implements Watcher{
public static ZooKeeper zooKeeper;
@Test
public void testCreate() throws IOException, KeeperException, InterruptedException {
String path = "/mynode";
zooKeeper = new ZooKeeper("192.168.245.210:2181",60000, new TestZookeeper());
zooKeeper.exists(path, true);
// ip
Id id = new Id();
id.setId("192.168.245.210");
id.setScheme("ip");
ACL acl = new ACL();
acl.setId(id);
acl.setPerms(ZooDefs.Perms.ALL);
List<ACL> acls = new ArrayList<>();
acls.add(acl);
zooKeeper.create(path, "mynode-testdata".getBytes(), acls, CreateMode.PERSISTENT);
}
@Override
public void process(WatchedEvent watchedEvent) {
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
if (Event.EventType.NodeCreated == watchedEvent.getType()) {
System.out.println("Node create success");
}
}
}
}
zkCli.sh -server 192.168.245.210
3.4.1.5 super策略
老老实实参照命令行的把。。
3.2 获取节点信息
@Test
public void testGet() throws IOException, KeeperException, InterruptedException {
String path = "/my-ephemeral-node";
zooKeeper = new ZooKeeper("192.168.245.210:2181",60000, new TestZookeeper());
byte[] data = zooKeeper.getData(path, null, null);
String result = new String(data);
System.out.println(result);
}
3.3 修改节点的数据
@Test
public void testUpdate() throws IOException, KeeperException, InterruptedException {
String path = "/my-ephemeral-node";
zooKeeper = new ZooKeeper("192.168.245.210:2181",60000, new TestZookeeper());
zooKeeper.setData(path, "my-ephemeral-testdata-modified".getBytes(), -1);
// 再次获取节点内容
byte[] data = zooKeeper.getData(path, null, null);
String result = new String(data);
System.out.println(result);
}
2.4 删除节点
@Test
public void testDelete() throws IOException, KeeperException, InterruptedException {
String path = "/my-ephemeral-node";
zooKeeper = new ZooKeeper("192.168.245.210:2181",60000, new TestZookeeper());
zooKeeper.exists(path, true);
zooKeeper.delete(path,-1);
}
@Override
public void process(WatchedEvent watchedEvent) {
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
if (Event.EventType.NodeDeleted == watchedEvent.getType()) {
System.out.println("Node deleted");
}
}
}