前面使用 Docker安装了 Zookeeper。我们可以通过/bin/zkServer.sh这个脚本进行服务器的相关操作:
docker进入启动好的 Zookeeper服务:
[root@centos7 ~]# docker exec -it 9bb8ce0a893f /bin/bash
root@9bb8ce0a893f:/apache-zookeeper-3.6.3-bin#
我们可以通过 /bin/zkCli.sh 这个脚本进行与服务器之间的相关操作。
使用 zkCli.sh -server ip:端口 连接到 ZooKeeper服务。
root@9bb8ce0a893f:/apache-zookeeper-3.6.3-bin/bin# zkCli.sh -server 192.168.198.110:2181
Connecting to 192.168.198.110:2181
连接成功后,系统会输出 ZooKeeper 的相关环境以及配置信息。 便可以使用命令与 ZK服务进行交互了。比如:
ls命令:查看目录下的节点信息
命令格式:ls [-s] [-w] [-R] path
[zk: 192.168.198.110:2181(CONNECTED) 9] ls /zookeeper
[config, quota]
[zk: 192.168.198.110:2181(CONNECTED) 10] ls -s /zookeeper
[config, quota]
cZxid = 0x0
ctime = Thu Jan 01 00:00:00 UTC 1970
mZxid = 0x0
mtime = Thu Jan 01 00:00:00 UTC 1970
pZxid = 0x0
cversion = -2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2
[zk: 192.168.198.110:2181(CONNECTED) 11] ls -R /zookeeper
/zookeeper
/zookeeper/config
/zookeeper/quota
stat命令:查看节点状态。
命令格式:stat [-w] path
[zk: 192.168.198.110:2181(CONNECTED) 12] stat /zookeeper
cZxid = 0x0
ctime = Thu Jan 01 00:00:00 UTC 1970
mZxid = 0x0
mtime = Thu Jan 01 00:00:00 UTC 1970
pZxid = 0x0
cversion = -2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2

create命令:创建节点,默认持久节点
命令格式:create [-s] [-e] [-c] [-t ttl] path [data] [acl]
Znode一般分为 4种类型:
1)创建持久节点
[zk: 192.168.198.110:2181(CONNECTED) 12] create /p_node1
Created /p_node1
2)创建临时节点
[zk: 192.168.198.110:2181(CONNECTED) 5] create -e /p_node1/e_node1
Created /p_node1/e_node1
[zk: 192.168.198.110:2181(CONNECTED) 7] create -e /p_node1/e_node2 "node data"
Created /p_node1/e_node2

3)创建顺序节点
注意:可设置的节点路径会被重命名为序列数。不设置时节点序列数前缀0开始
[zk: 192.168.198.110:2181(CONNECTED) 13] create -s /p_node2/
Node does not exist: /p_node2/
[zk: 192.168.198.110:2181(CONNECTED) 15] create /p_node2
Created /p_node2
[zk: 192.168.198.110:2181(CONNECTED) 16] create -s /p_node2/
Created /p_node2/0000000000
[zk: 192.168.198.110:2181(CONNECTED) 17] create -s /p_node2/
Created /p_node2/0000000001
[zk: 192.168.198.110:2181(CONNECTED) 18] create -s /p_node2/seq_
Created /p_node2/seq_0000000002
[zk: 192.168.198.110:2181(CONNECTED) 19] create -s /p_node2/seq_
Created /p_node2/seq_0000000003
4)创建ttl节点
语法:create create ‐t 过期时间 /节点路径 节点数据
[zk: 192.168.198.110:2181(CONNECTED) 25] create -t 10 /p_node1/ttl_node
KeeperErrorCode = Unimplemented for /p_node1/ttl_node
[zk: 192.168.198.110:2181(CONNECTED) 27] ls -R /p_node1
/p_node1
/p_node1/e_node1
/p_node1/e_node2
set命令:修改节点内容
命令格式:set [-s] [-v version] path data
[zk: 192.168.198.110:2181(CONNECTED) 36] set /p_node1/e_node1 "set data1"
[zk: 192.168.198.110:2181(CONNECTED) 37] set -s /p_node1/e_node1 "set data2"
cZxid = 0x6c
ctime = Fri May 13 09:55:49 UTC 2022
mZxid = 0x80
mtime = Fri May 13 10:15:46 UTC 2022
pZxid = 0x6c
cversion = 0
dataVersion = 6
aclVersion = 0
ephemeralOwner = 0x100002513c80001
dataLength = 9
numChildren = 0
get命令:获取节点/文件内容
命令格式:get [-s] [-w] path
[zk: 192.168.198.110:2181(CONNECTED) 38] get /p_node1/e_node1
set data2
[zk: 192.168.198.110:2181(CONNECTED) 39] get -s /p_node1/e_node1
set data2
cZxid = 0x6c
ctime = Fri May 13 09:55:49 UTC 2022
mZxid = 0x80
mtime = Fri May 13 10:15:46 UTC 2022
pZxid = 0x6c
cversion = 0
dataVersion = 6
aclVersion = 0
ephemeralOwner = 0x100002513c80001
dataLength = 9
numChildren = 0
1)delete命令
delete命令:只能删除没有子节点的节点。如果其有子节点时,无法删除
命令格式:delete [-v version] path
2)deleteall命令
deleteall命令:级联删除该节点和子节点。
命令格式:deleteall path [-b batch size]
[zk: 192.168.198.110:2181(CONNECTED) 43] delete /p_node2/seq_0000000002
[zk: 192.168.198.110:2181(CONNECTED) 44] ls -R /p_node2
/p_node2
/p_node2/0000000000
/p_node2/0000000001
/p_node2/seq_0000000003
[zk: 192.168.198.110:2181(CONNECTED) 45] deleteall /p_node2
[zk: 192.168.198.110:2181(CONNECTED) 46] ls -R /p_node2
Node does not exist: /p_node2
其他命令:
Zookeeper采用 ACL(Access Control Lists)策略来进行权限控制,类似于UNIX文件系统的权限控制。目的为了保障数据安全性
Zookeeper 的 ACL(Access Control List),分为三个维度:scheme、id、permission。
通常表示为:scheme:id:permission来构成权限列表。
1)scheme:权限策略
2) id:用户
id 是验证模式,不同的 scheme,id 的值也不一样。默认为anyone。
3)permission:权限
Zookeeper定义了五种权限:
CREATE、READ、WRITE、DELETE、ADMIN 也就是增、删、改、查、管理权限,这 5 种权限简写为 crwda(即单词的首字符缩写)。
getAcl命令:查看指定节点 ACL信息
命令格式:getAcl [-s] path
[zk: 192.168.198.110:2181(CONNECTED) 15] getAcl /p_node1
'world,'anyone
: cdrwa
[zk: 192.168.198.110:2181(CONNECTED) 17] getAcl -s /p_node1
'world,'anyone
: cdrwa
cZxid = 0x67
ctime = Fri May 13 09:53:38 UTC 2022
mZxid = 0x67
mtime = Fri May 13 09:53:38 UTC 2022
pZxid = 0x83
cversion = 6
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 0
setAcl命令:设置指定节点的ACL 信息
命令格式:setAcl [-s] [-v version] [-R] path acl
[zk: 192.168.198.110:2181(CONNECTED) 21] create /testAcl
Created /testAcl
# 设置该节点的 acl 权限
[zk: 192.168.198.110:2181(CONNECTED) 22] setAcl /testAcl world:anyone:crwa
[zk: 192.168.198.110:2181(CONNECTED) 23] getAcl /testAcl
'world,'anyone
: crwa
# 创建子节点
[zk: 192.168.198.110:2181(CONNECTED) 24] create /testAcl/xyz " xyz-data"
Created /testAcl/xyz
# 由于没有 d 权限,所以提示无法删除
[zk: 192.168.198.110:2181(CONNECTED) 25] delete /testAcl/xyz
Insufficient permission : /testAcl/xyz
addauth命令:添加认证用户
命令格式:addauth scheme auth
我们创建一个用户,并分配权限:
[zk: 192.168.198.110:2181(CONNECTED) 27] addauth digest charge_admin:123456 crwda
[zk: 192.168.198.110:2181(CONNECTED) 28] addauth digest charge_crw:123456 crw
给某个节点,设置用户,用户只能在分配的权限内操作。
# 添加一个用户
[zk: 192.168.198.110:2181(CONNECTED) 13] addauth digest user1:123456
# 给节点设置用户权限
[zk: 192.168.198.110:2181(CONNECTED) 14] setAcl /testAcl auth:user1:123456:crwa
# 查看节点权限,密码是以密文的形式存储的
[zk: 192.168.198.110:2181(CONNECTED) 15] getAcl /testAcl
'digest,'user1:HYGa7IZRm2PUBFiFFu8xY2pPP/s=
: crwa
[zk: 192.168.198.110:2181(CONNECTED) 16] create /testAcl/ztest "data"
Created /testAcl/ztest
# 由于用户没有 d 权限,所以提示无法删除
[zk: 192.168.198.110:2181(CONNECTED) 17] delete /testAcl/ztest
Insufficient permission : /testAcl/ztest
没有权限,我们 quit退出,重新进入客户端,操作 /testAcl节点。
#没有用户权限无法访问
[zk: 192.168.198.110:2181(CONNECTED) 0] ls /testAcl
Insufficient permission : /testAcl
[zk: 192.168.198.110:2181(CONNECTED) 1] create /testAcl/ztest2
Insufficient permission : /testAcl/ztest2
# 重新新增权限后可以访问了
[zk: 192.168.198.110:2181(CONNECTED) 2] addauth digest user1:123456
[zk: 192.168.198.110:2181(CONNECTED) 3] create /testAcl/ztest2
Created /testAcl/ztest2
[zk: 192.168.198.110:2181(CONNECTED) 4] ls -R /testAcl
/testAcl
/testAcl/xyz
/testAcl/ztest
/testAcl/ztest2
# 由于用户没有 d 权限,所以提示无法删除
[zk: 192.168.198.110:2181(CONNECTED) 5] delete /testAcl/ztest2
Insufficient permission : /testAcl/ztest2
# 由于用户没有该节点的权限,所以提示无法删除
[zk: 192.168.198.110:2181(CONNECTED) 7] addauth digest charge_crw:123456
[zk: 192.168.198.110:2181(CONNECTED) 8] delete /testAcl/ztest2
Insufficient permission : /testAcl/ztest2
[zk: 192.168.198.110:2181(CONNECTED) 9] addauth digest charge_admin:123456
[zk: 192.168.198.110:2181(CONNECTED) 10] delete /testAcl/ztest2
Insufficient permission : /testAcl/ztest2
权限策略 scheme相关命令,查看参考文章。
Zookeeper中一个常用的功能是 Watcher(事件监听器),它允许用户在指定节点上注册 Watcher(可针对感兴趣的事件注册监听),并且在一些感兴趣的特定事件发生的时候,Watcher会被触发,Zookeeper服务端会将事件通知到感兴趣的客户端上去,该机制是Zookeeper实现分布式协调服务的重要特性。
监听机制:客户端可以监听节点的变化,当节点发生改变时,将触发相应的事件。当事件被触发时,客户端会收到一个数据包,说明节点已经改变。
监听节点目录变化:监听节点的子节点变化,当子节点发生改变时触发。
命令格式:ls -w path
#创建节点
[zk: 192.168.198.110:2181(CONNECTED) 13] create /watch_node
Created /watch_node
#监听节点目录变化
[zk: 192.168.198.110:2181(CONNECTED) 14] ls -w /watch_node
[]
[zk: 192.168.198.110:2181(CONNECTED) 15] create /watch_node/w1 data1
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/watch_node
Created /watch_node/w1
[zk: 192.168.198.110:2181(CONNECTED) 17] create /watch_node/w2 data2
Created /watch_node/w2
一次性监听,触发后会被删除,无法再次触发。
监听节点数据变化:当该节点数据发生改变时触发。子节点的数据变化不会触发。
命令格式:get -w path
# 监听节点数据变化
[zk: 192.168.198.110:2181(CONNECTED) 18] get -w /watch_node
null
[zk: 192.168.198.110:2181(CONNECTED) 19] set /watch_node data
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/watch_node
[zk: 192.168.198.110:2181(CONNECTED) 20] set /watch_node data2
一次性监听,触发后会被删除,无法再次触发。
在 Zookeeper 3.6.0版本之后,客户端可以在节点上创建永久监听,永久监听在被触发后不会被删除。
命令格式:addWatch [-m mode] path
永久监听在创建时可以通过 -m 指定模式,模式分为两种:
[zk: 192.168.198.110:2181(CONNECTED) 29] create /watch_node2
# 监听节点 PERSISTENT
[zk: 192.168.198.110:2181(CONNECTED) 30] addWatch -m PERSISTENT /watch_node2
[zk: 192.168.198.110:2181(CONNECTED) 31] set /watch_node2 data1
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/watch_node2
[zk: 192.168.198.110:2181(CONNECTED) 32] create /watch_node2/w1 data
WATCHER::Created /watch_node2/w1
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/watch_node2
#子节点的数据变化不会触发
[zk: 192.168.198.110:2181(CONNECTED) 33] set /watch_node2/w1 data1
[zk: 192.168.198.110:2181(CONNECTED) 34] delete /watch_node2/w1
WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/watch_node2
[zk: 192.168.198.110:2181(CONNECTED) 39] create /watch_node3
# 监听节点 PERSISTENT_RECURSIVE
[zk: 192.168.198.110:2181(CONNECTED) 40] addWatch -m PERSISTENT_RECURSIVE /watch_node3
[zk: 192.168.198.110:2181(CONNECTED) 41] set /watch_node3 data1
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/watch_node3
[zk: 192.168.198.110:2181(CONNECTED) 42] create /watch_node3/w1
WATCHER::
WatchedEvent state:SyncConnected type:NodeCreated path:/watch_node3/w1
Created /watch_node3/w1
#子节点的数据变化也会触发
[zk: 192.168.198.110:2181(CONNECTED) 43] set /watch_node3/w1 data1
WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/watch_node3/w1
[zk: 192.168.198.110:2181(CONNECTED) 44] delete /watch_node3/w1
WATCHER::
WatchedEvent state:SyncConnected type:NodeDeleted path:/watch_node3/w1
Zookeeper 支持某些特定的四字命令与其交互,用户获取 zookeeper 服务的当前状态及相关信息,用户在客户端可以通过 telenet 或者 nc(netcat) 向 zookeeper 提交相应的命令。
四字命令格式:echo [command] | nc [ip] [port]
需要开启四字命令和安装 nc。
1)开启四字命令
如果出现 stat is not executed because it is not in the whitelist. 白名单问题表示有可能配置中未开启四字命令。
root@9bb8ce0a893f:/apache-zookeeper-3.6.3-bin# ls /conf/
configuration.xsl log4j.properties zoo.cfg zoo_sample.cfg
在 zoo.cfg 文件里加入配置项让这些指令放行
#开启四字命令
4lw.commands.whitelist=*
2)安装 nc
# centos
yum install nc
ZooKeeper 常用四字命令主要如下:

参考文章:
– 求知若饥,虚心若愚。
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g
我有一个问题。我想从另一个ruby脚本运行一个ruby脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密
有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/
我正在构建一个应用程序,想知道是否将未使用的对象设置为nil是生产级编码中的常见做法。我知道这只是垃圾收集器的提示,并不总是处理对象。 最佳答案 根据这个thread如果您使用完一个成员对象,将其设置为nil将引发被引用对象被垃圾回收。如果它是局部变量,方法exit将做同样的事情。也就是说,如果您要求将成员显式设置为nil,我会质疑您的设计。 关于ruby-将对象设置为nil是否很常见?,我们在StackOverflow上找到一个类似的问题: https://
如何在Ruby的if语句中检查bash命令的返回值(true/false)。我想要这样的东西,if("/usr/bin/fswscell>/dev/null2>&1")has_afs="true"elsehas_afs="false"end它会提示以下错误含义,它总是返回true。(irb):5:warning:stringliteralincondition正确的语法是什么?更新:/usr/bin/fswscell寻找afs安装和运行状态。它会抛出这样的字符串,Thisworkstationbelongstocell如果afs没有运行,命令以状态1退出 最
在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa
关于SSHkit-Github它说:Allbackendssupporttheexecute(*args),test(*args)&capture(*args)来自SSHkit-Rubydoc,我明白execute实际上是test的别名?test之间有什么区别?,execute,capture在Capistrano/SSHKit中我应该什么时候使用? 最佳答案 执行只是执行命令。使用非0退出引发错误。测试方法的行为与execute完全相同,但是它返回bool值(true如果命令以0退出,而false否则)。它通常用于控制任务中的流程
我最近与一位同事讨论了以下Ruby语法:value=ifa==0"foo"elsifa>42"bar"else"fizz"end我个人并没有看到太多这种逻辑,但我的同事指出,这实际上是一种相当普遍的Rubyism。我试着用谷歌搜索这个主题,但没有找到任何文章、页面或SO问题来讨论它,这让我相信这可能是一种非常实际的技术。然而,另一位同事发现语法令人困惑,而是将上面的逻辑写成这样:ifa==0value="foo"elsifa>42value="bar"elsevalue="fizz"end缺点是value=的重复声明和隐式elsenil的丢失,如果我们想使用它的话。这也感觉它与Ruby