From c138b527137f56bb4a4e1b0c007aa844b105001e Mon Sep 17 00:00:00 2001 From: luoxiang <2806718453@qq.com> Date: Sat, 25 May 2019 10:13:23 +0800 Subject: [PATCH] =?UTF-8?q?zookeeper=E5=B8=B8=E7=94=A8shell=E6=93=8D?= =?UTF-8?q?=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/Zookeeper/curator/pom.xml | 12 ++ notes/Zookeeper常用Shell命令.md | 226 ++++++++++++++++++++++++++-- pictures/zookeeper-super.png | Bin 0 -> 28910 bytes 3 files changed, 228 insertions(+), 10 deletions(-) create mode 100644 code/Zookeeper/curator/pom.xml create mode 100644 pictures/zookeeper-super.png diff --git a/code/Zookeeper/curator/pom.xml b/code/Zookeeper/curator/pom.xml new file mode 100644 index 0000000..bfcd36a --- /dev/null +++ b/code/Zookeeper/curator/pom.xml @@ -0,0 +1,12 @@ + + + 4.0.0 + + com.heibaiying + curator + 1.0 + + + \ No newline at end of file diff --git a/notes/Zookeeper常用Shell命令.md b/notes/Zookeeper常用Shell命令.md index 76b0553..57da0f9 100644 --- a/notes/Zookeeper常用Shell命令.md +++ b/notes/Zookeeper常用Shell命令.md @@ -2,17 +2,43 @@ ## 一、节点增删改查 -### 1.1 help命令 +### 1.1 启动服务和连接服务 + +```shell +# 启动服务 +bin/zkServer.sh start + +#连接服务 不指定服务地址则默认连接到localhost:2181 +zkCli.sh -server hadoop001:2181 +``` + +### 1.2 help命令 使用help命令可以查看所有支持的命令及其格式。 -### 1.2 查看节点列表 +### 1.3 查看节点列表 + +查看节点列表有`ls path`和 `ls2 path`两个命令,后者是前者的增强,不仅可以查看指定路径下所有节点的列表,还可以查看当前节点的信息。 ```shell -ls path +[zk: localhost:2181(CONNECTED) 0] ls / +[cluster, controller_epoch, brokers, storm, zookeeper, admin, ...] +[zk: localhost:2181(CONNECTED) 1] ls2 / +[cluster, controller_epoch, brokers, storm, zookeeper, admin, ....] +cZxid = 0x0 +ctime = Thu Jan 01 08:00:00 CST 1970 +mZxid = 0x0 +mtime = Thu Jan 01 08:00:00 CST 1970 +pZxid = 0x130 +cversion = 19 +dataVersion = 0 +aclVersion = 0 +ephemeralOwner = 0x0 +dataLength = 0 +numChildren = 11 ``` -### 1.3 新增节点 +### 1.4 新增节点 ```shell create [-s] [-e] path data acl #其中-s为有序节点,-e临时节点 @@ -42,7 +68,7 @@ Created /c0000000024 Created /tmp ``` -### 1.4 查看节点 +### 1.5 查看节点 #### 1. 获取节点数据 @@ -102,9 +128,9 @@ dataLength = 6 numChildren = 0 ``` -### 1.5 更新节点 +### 1.6 更新节点 -更改节点和新增节点都是`set命令`,可以直接进行修改,如下: +更新节点的命令是`set`,可以直接进行修改,如下: ```shell [zk: localhost:2181(CONNECTED) 33] set /hadoop 345 @@ -128,7 +154,7 @@ numChildren = 0 version No is not valid : /hadoop #无效的版本号 ``` -### 1.6 删除节点 +### 1.7 删除节点 删除节点的语法如下: @@ -145,13 +171,193 @@ version No is not valid : /hadoop #无效的版本号 [zk: localhost:2181(CONNECTED) 38] ``` +要想删除某个节点及其所有后代节点,可以使用递归删除,命令为`rmr path`。 + +## 二、监听器 + +### 2.1 get path [watch] + +使用`get path [watch]`注册的监听器能够在节点内容发生改变的时候,向客户端发出通知。需要注意的是zookeeper的触发器是一次性的(One-time trigger),即触发一次后就会立即失效。 + +```shell +[zk: localhost:2181(CONNECTED) 4] get /hadoop watch +[zk: localhost:2181(CONNECTED) 5] set /hadoop 45678 +WATCHER:: +WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop #节点值改变 +``` + +### 2.2 stat path [watch] + +使用`stat path [watch]`注册的监听器能够在节点状态发生改变的时候,向客户端发出通知。 + +```shell +[zk: localhost:2181(CONNECTED) 7] stat /hadoop watch +[zk: localhost:2181(CONNECTED) 8] set /hadoop 112233 +WATCHER:: +WatchedEvent state:SyncConnected type:NodeDataChanged path:/hadoop #节点值改变 +``` + +### 2.3 ls\ls2 path [watch] + +使用`ls path [watch]`或`ls2 path [watch]`注册的监听器能够监听该节点下所有**子节点**的增加和删除操作。 + +```shell +[zk: localhost:2181(CONNECTED) 9] ls /hadoop watch +[] +[zk: localhost:2181(CONNECTED) 10] create /hadoop/yarn "aaa" +WATCHER:: +WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/hadoop +``` +## 三、权限管理 + +### 3.1 设置与查看权限 + +想要给某个节点设置权限(ACL),有以下两个可选的命令: + +```shell + # 1.给已有节点赋予权限 + setAcl path acl + + # 2.在创建节点时候指定权限 + create [-s] [-e] path data acl +``` + +查看指定节点的权限命令如下: + +```shell +getAcl path +``` + +### 3.2 权限组成 + +Zookeeper的权限由[scheme : id :permissions]三部分组成,其中Schemes和Permissions内置的可选项分别如下: + +Permissions可选项: + +- CREATE:允许创建子节点; +- READ:允许从节点获取数据并列出其子节点; +- WRITE:允许为节点设置数据; +- DELETE:允许删除子节点; +- ADMIN:允许为节点设置权限。 + +Schemes可选项: + +- world:默认模式, 所有客户端都拥有指定权限。world下只有一个id选项,就是anyone,通常组合写法为`world:anyone:[permissons]`; +- auth:只有经过认证的用户, 才拥有指定的权限。通常组合写法为`auth:user:password:[permissons]`,使用这种模式时,你需要先进行登录,之后采用auth模式时,user和password都将使用登录的用户名和密码; +- digest:只有经过认证的用户, 才拥有指定的权限。通常组合写法为`auth:user:BASE64(SHA1(password)):[permissons]`,这种形式下的密码必须通过SHA1和BASE64进行双重加密; +- ip:限制只有特定IP的客户端才拥有指定的权限。通常组成写法为`ip:182.168.0.168:[permissions]`; +- super:代表超级管理员,拥有所有的权限,需要修改Zookeeper启动脚本进行配置。 -## 五、 zookeeper 四字命令 +### 3.3 添加认证信息 + +可以使用如下所示的命令为当前Session添加用户认证信息,等价于登录操作。 + +```shell +# 格式 +addauth scheme auth + +#示例:添加用户名为heibai,密码为root的用户认证信息 +addauth digest heibai:root +``` + + + +### 3.4 权限设置示例 + +#### 1. world模式 + +world是一种默认的模式,即创建时如果不指定权限,则默认的权限就是world。 + +```shell +[zk: localhost:2181(CONNECTED) 32] create /hadoop 123 +Created /hadoop +[zk: localhost:2181(CONNECTED) 33] getAcl /hadoop +'world,'anyone #默认的权限 +: cdrwa +[zk: localhost:2181(CONNECTED) 34] setAcl /hadoop world:anyone:cwda # 修改节点,不允许所有客户端读 +.... +[zk: localhost:2181(CONNECTED) 35] get /hadoop +Authentication is not valid : /hadoop # 权限不足 + +``` + +#### 2. auth模式 + +```shell +[zk: localhost:2181(CONNECTED) 36] addauth digest heibai:heibai # 登录 +[zk: localhost:2181(CONNECTED) 37] setAcl /hadoop auth::cdrwa # 设置权限 +[zk: localhost:2181(CONNECTED) 38] getAcl /hadoop # 获取权限 +'digest,'heibai:sCxtVJ1gPG8UW/jzFHR0A1ZKY5s= #用户名和密码(密码经过加密处理),注意返回的权限类型是digest +: cdrwa + +#用户名和密码都是使用登录的用户名和密码,即使你在创建权限时候进行指定也是无效的 +[zk: localhost:2181(CONNECTED) 39] setAcl /hadoop auth:root:root:cdrwa #指定用户名和密码为root +[zk: localhost:2181(CONNECTED) 40] getAcl /hadoop +'digest,'heibai:sCxtVJ1gPG8UW/jzFHR0A1ZKY5s= #无效,使用的用户名和密码依然还是heibai +: cdrwa + +``` + +#### 3. digest模式 + +```shell +[zk:44] create /spark "spark" digest:heibai:sCxtVJ1gPG8UW/jzFHR0A1ZKY5s=:cdrwa #指定用户名和加密后的密码 +[zk:45] getAcl /spark #获取权限 +'digest,'heibai:sCxtVJ1gPG8UW/jzFHR0A1ZKY5s= # 返回的权限类型是digest +: cdrwa +``` + +到这里你可以发现使用auth模式设置的权限和使用digest模式设置的权限,在最终结果上,得到的权限模式都是`digest`。某种程度上,你可以把auth模式理解成是digest模式的一种简便实现。因为在digest模式下,每次设置都需要书写用户名和加密后的密码,这是比较繁琐的,采用auth模式,则可以在登录一次后就可以不用重复书写了。 + +#### 4. ip模式 + +限定只有特定的ip才能访问。 + +```shell +[zk: localhost:2181(CONNECTED) 46] create /hive "hive" ip:192.168.0.108:cdrwa +[zk: localhost:2181(CONNECTED) 47] get /hive +Authentication is not valid : /hive # 当前主机已经不能访问 +``` + +这里可以使用限定IP的主机客户端进行访问,也可以使用下面的super模式配置超级管理员进行访问。 + +#### 5. super模式 + +需要修改启动脚本`zkServer.sh`,在指定位置添加管理员账户和密码信息: + +```shell +"-Dzookeeper.DigestAuthenticationProvider.superDigest=heibai:sCxtVJ1gPG8UW/jzFHR0A1ZKY5s=" +``` + +![zookeeper-super](D:\BigData-Notes\pictures\zookeeper-super.png) + +修改完成后需要使用`zkServer.sh restart`重启服务,此时再次访问限制IP的节点: + +```shell +[zk: localhost:2181(CONNECTED) 0] get /hive #访问受限 +Authentication is not valid : /hive +[zk: localhost:2181(CONNECTED) 1] addauth digest heibai:heibai # 登录(添加认证信息) +[zk: localhost:2181(CONNECTED) 2] get /hive #成功访问 +hive +cZxid = 0x158 +ctime = Sat May 25 09:11:29 CST 2019 +mZxid = 0x158 +mtime = Sat May 25 09:11:29 CST 2019 +pZxid = 0x158 +cversion = 0 +dataVersion = 0 +aclVersion = 0 +ephemeralOwner = 0x0 +dataLength = 4 +numChildren = 0 +``` + +## 四、 zookeeper 四字命令 | 命令 | 功能描述 | | ---- | ------------------------------------------------------------ | @@ -167,7 +373,7 @@ version No is not valid : /hadoop #无效的版本号 > 更多四字命令可以参阅官方文档:https://zookeeper.apache.org/doc/current/zookeeperAdmin.html -使用前需要使用 `yum install nc` 安装 nc 命令: +使用前需要使用 `yum install nc` 安装 nc 命令,使用示例如下: ```shell [root@hadoop001 bin]# echo stat | nc localhost 2181 diff --git a/pictures/zookeeper-super.png b/pictures/zookeeper-super.png new file mode 100644 index 0000000000000000000000000000000000000000..7e2c96507133ec26656f97218bb07745cb1c2085 GIT binary patch literal 28910 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