zopkeeper-curator基本操作(二)

zopkeeper-curator操作

zookeeper環境信息請參考上一篇zookeeper環境搭建

1. zookeeper節點特性

  1. 持久化節點
  2. 臨時節點
  3. 順序節點
  4. ttl和容器節點
  5. 臨時節點不能創建子節點
  6. 同一級別不能存在相同的名稱

2. 查看node節點狀態

通過客戶端登陸

/zkCli.sh -server 114.55.254.108:2181

查詢節點狀體

[zk: 114.55.254.108:2181(CONNECTED) 0] ls / 
[path, zookeeper]
[zk: 114.55.254.108:2181(CONNECTED) 1] stat /zookeeper
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1

3. curator基本操作

3.1 依賴jar包

請選用下面jar包版本,不然可能會出現版本不兼容問題,導致連接出錯

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>

3.2 建立連接

public class CuratorDemo {
    public static void main(String[] args) {
        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().
                connectString("114.55.254.108:2181,114.55.254.108:2182,114.55.254.108:2183").
                sessionTimeoutMs(5000).
                // ExponentialBackoffRetry 重試指定次數
                // ReTryOneTime 僅重試一次
                retryPolicy(new ExponentialBackoffRetry(1000,3)).
                build();
        curatorFramework.start(); //啓動
    }

3.3 增刪改查

    private static void createNode(CuratorFramework curatorFramework){
        try {
            curatorFramework.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/data/node", "test".getBytes());
            System.out.println("create node sucess");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void updateNode(CuratorFramework curatorFramework){
        try {
            curatorFramework.setData().forPath("/data/node", "update".getBytes());
            System.out.println("update node sucess");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void deleteNode(CuratorFramework curatorFramework){
        try {
            Stat stat = new Stat();
            String value = new String(curatorFramework.getData().storingStatIn(stat).forPath("/data/node"));
			//刪除時請注意version            
            curatorFramework.delete().withVersion(stat.getCversion()).forPath("/data/node");
            System.out.println("delete node sucess, value = " + value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4. ACL權限

4.1 ACL權限特性

  1. ZooKeeper 的權限控制是基於每個 znode 節點的,需要對每個節點設置權限
  2. 每個 znode 支持設置多種權限控制方案和多個權限
  3. 子節點不會繼承父節點的權限,客戶端無權訪問某節點,但可能可以訪問它的子節點

4.2 操作節點權限種類

    public interface Perms {
        int READ = 1;
        int WRITE = 2;
        int CREATE = 4;
        int DELETE = 8;
        int ADMIN = 16;
        int ALL = 31;
    }
類型 作用
create 創建節點
read 獲取節點/子節點
write 設置節點數據
delete 刪除子節點
admin 設置節點訪問控制列表權限
all 所有權限

4.3 scheme權限類型

ip/digest/world/super/auth/x509
方案 作用
方案 描述
world anyone,所有人擁有所有權限(默認)
ip 用 IP 地址認證,可以用網段表示範圍。
auth 用“用戶名:密碼”方式認證
digest 用“用戶名:密碼”+ 摘要 方式認證
super 超級管理員
x509 X.509是密碼學裏公鑰證書的格式標準

4.4 內置Ids權限類型

    public interface Ids {
        Id ANYONE_ID_UNSAFE = new Id("world", "anyone");
        Id AUTH_IDS = new Id("auth", "");
        ArrayList<ACL> OPEN_ACL_UNSAFE = new ArrayList(Collections.singletonList(new ACL(31, ANYONE_ID_UNSAFE)));
        ArrayList<ACL> CREATOR_ALL_ACL = new ArrayList(Collections.singletonList(new ACL(31, AUTH_IDS)));
        ArrayList<ACL> READ_ACL_UNSAFE = new ArrayList(Collections.singletonList(new ACL(1, ANYONE_ID_UNSAFE)));
    }

4.5 創建node設置權限

public class AclDemo {
    public static void main(String[] args) {
        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().
                connectString("114.55.254.108:2181,114.55.254.108:2182,114.55.254.108:2183").
                sessionTimeoutMs(5000).
                // ExponentialBackoffRetry 重試指定次數
                // ReTryOneTime 僅重試一次
                retryPolicy(new ExponentialBackoffRetry(1000,3)).
                build();

        curatorFramework.start(); //啓動

        try {
            List<ACL> list = new ArrayList<>();
            ACL acl = new ACL(ZooDefs.Perms.READ,new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin")));
            list.add(acl);
            curatorFramework.create().withACL(list).forPath("/acl","acl".getBytes());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

上面設置只讀權限且指定賬號密碼,在客戶端進行訪問

[zk: 114.55.254.108:2181(CONNECTED) 27] get /acl   
Authentication is not valid : /acl

通過addauth進行設置

[zk: 114.55.254.108:2181(CONNECTED) 28] addauth digest admin:admin
[zk: 114.55.254.108:2181(CONNECTED) 29] get /acl                  
acl
cZxid = 0x100000027
ctime = Tue Mar 03 23:54:39 CST 2020
mZxid = 0x100000027
mtime = Tue Mar 03 23:54:39 CST 2020
pZxid = 0x100000027
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 3
numChildren = 0

設置之後可以獲取指定node的信息,但是依然沒有其他權限,除了刪除權限,在3.4之前的版本默認都有刪除權限(添加後重新進行刪除,依然刪除成功)
3.4版本默認沒有刪除權限,但是可以在zk上配置一個超級用戶

[zk: 114.55.254.108:2181(CONNECTED) 30] set /acl acl-test
Authentication is not valid : /acl
[zk: 114.55.254.108:2181(CONNECTED) 34] delete /acl
[zk: 114.55.254.108:2181(CONNECTED) 35] ls /
[path, zookeeper, data, node1]

4.6 修改已有node權限

        try {
            List<ACL> list = new ArrayList<>();
            ACL acl = new ACL(ZooDefs.Perms.READ,new Id("digest", DigestAuthenticationProvider.generateDigest("admin:admin")));
            list.add(acl);
            curatorFramework.setACL().withACL(list).forPath("/acl");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章