1.Zookeeper连接及启停
(1)使用zookeeper安装bin目录下的./zkCli.sh连接到zookeeper服务器上,基本语法如下: ./zkCli.sh -timeout 0 -r -server ip:port 其中,-timeout表示当前会话的超时时间,zookeper依靠与客户端的心跳来判断会话是否有效,单位是毫秒 -r代表只读模式,zookeeper的只读模式指一个服务器与集群中过半机器失去连接以后,这个服务器就不在不处理客户端的请求,但我们仍然希望该服务器可以提供读服务。 -server,指定服务器ip地址和端口号 -s,顺序节点 -e,临时节点 (13)close,关闭当前连接 (14)history,查看历史执行指令 (15)redo,重复执行指令 ./zkCli.sh -server localhost:2181 (2)ZK启停 > 启动ZK服务: bin/zkServer.sh start > 查看ZK服务状态: bin/zkServer.sh status > 停止ZK服务: bin/zkServer.sh stop > 重启ZK服务: bin/zkServer.sh restart
▼zookeeper学习教程
2.Zookeeper基本操作
1) 创建节点 格式:create [-s] [-e] path data acl 其中"-s"表示创建一个"有序"节点,"-e"表示创建一个临时节点.默认为持久性节点 ->create -s /test null ->create /test null 如下为包括ACL的例子: ->create -s /test null digest:test:Kk3Nr5X06NH+XdlGMyOrULgK/mo=:rwcda 创建一个path为"/test"的节点,值为"null",ACL授权方式为"digest",其中授权的用户名:密码为"test:Kk3Nr5X06NH+XdlGMyOrULgK/mo=",ACL的权限列表为"r""w""c""d""a". "digest"授权方式表示client方位此节点数据,需要指定用户名和密码,可以参考zookeeper中DigestAuthenticationProvider.generateDigest(String ipName)方法;通过向此方法指定原始的用户名和密码即可获得"digest"之后的字符串,比如传入"test:test",将会得到"test:V28q/NynI4JI3Rk54h0r8O5kMug=",其内部原理是将"密码"部分进行MD5 + sha1操作.再zkCli.sh指令上你需要传递digest之后的字符串. 其中ACL的授权方式有很多种,你可以在ZooDefs类中找到更多的信息. 最后一个参数为权限列表,r表示"read",w表示"write",c表示"create",d表示"delete",a表示"admin" 2) 获取节点数据 格式:get path -> get /test -e cZxid = 0x5b ctime = Mon Sep 16 14:14:06 CST 2013 mZxid = 0x5b mtime = Mon Sep 16 14:14:06 CST 2013 pZxid = 0x67 cversion = 7 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 2 numChildren = 5 你可以从结果列表中,获得所有的节点信息. 3) 查看子节点列表 指令: ls /path 4) 设置节点值 格式: set path data [version] -> set /test 1313131 -1 其中值需要为字符串,版本号可以通过2)中的指令获取,如果版本号为"-1"表示更新时忽略版本校验. 5) 删除所有节点 格式: rmr path -> rmr /test 将会删除"/test"以及其下的所有子节点. 6) 设置ACL 格式: setAcl path acl -> setAcl /test digest:test:Kk3Nr5X06NH+XdlGMyOrULgK/mo=:rwcda 和create指令非常相似. 7) 删除节点 格式: delete path [version] -> delete /test -1 需要注意的是,如果此path下还有子节点,将导致删除失败.这是和"rmr"指令的区别. 8) 添加授权信息 格式: addauth schema auth -> addauth digest test:test 只有授权之后,才能够访问那些具有ACL控制的节点数据.注意"auth"信息为原始的用户名和密码,而不是经过DigestAuthenticationProvider签名之后的. 如果使用了错误的授权信息,可能导致"Authentication is not valid : ".
3.使用ACL控制Zookeeper
zookeeper使用ACL来控制对znode(zookeeper的数据节点)的访问权限。ACL的实现方式和unix的文件权限类似:用不同位来代表不同的操作限制和组限制。与标准unix权限不同的是,zookeeper的节点没有三种域——用户,组,其他。zookeeper里没有节点的所有者的概念。取而代之的是,一个由ACL指定的id集合和其相关联的权限。 注意,一个ACL只从属于一个特定的znode。对这个znode子节点也是无效的。例如,如果/app
只有被ip172.16.16.1的读权限,/app/status
有被所有人读的权限,那么/app/status
可以被所有人读,ACL权限不具有递归性。 zookeeper支持插件式认证方式,id使用scheme:id
的形式。scheme
是id对应的类型方式,例如ip:172.16.16.1
就是一个地址为172.16.16.1的主机id。 当客户端连接zookeeper并且认证自己,zookeeper就在这个与客户端的连接中关联所有与客户端一致的id。当客户端访问某个znode时,znode的ACL会重新检查这些id。ACL的表达式为(scheme:expression,perms)
。expression
就是特殊的scheme,例如,(ip:19.22.0.0/16, READ)
就是把任何以19.22开头的ip地址的客户端赋予读权限。
ZooKeeper支持下列权限:
CREATE:允许创建子节点
READ:允许获得节点数据并列出所有子节点
WRITE:允许设置节点上的数据
DELETE:允许删除子节点
ADMIN:允许设置权限
CREATE和DELETE操作是更细的粒度上的WRITE操作。有一种特殊的情况:
你想要A获得操作zookeeper上某个znode的权限,但是不可以对其子节点进行CREATE和DELETE。
只CREATE不DELETE:某个客户端在上一级目录上通过发送创建请求创建了一个zookeeper节点。你希望所有客户端都可以在这个节点上添加,但是只有创建者可以删除。(这就类似于文件的APPEND权限)
Zookeeper提供的权限信息表:
权限 | 描述 | setAcl中的简写 |
write | 能够设置znode的值 | w |
read | 能够读取znode的值和列出它的children znode | r |
create | 能够创建children znode | c |
delete | 能够删除children znode | d |
admin | 能够执行setAcl即设置访问控制列表 | a |
all | 所有权限 | wrcda |
zookeeper没有文件所有者的概念,但有ADMIN权限。在某种意义上说,ADMIN权限指定了所谓的所有者。zookeeper虽然不支持查找权限(在目录上的执行权限虽然不能列出目录内容,却可以查找),但每个客户端都隐含着拥有查找权限。这样你可以查看节点状态,但仅此而已。(这有个问题,如果你在不存在的节点上调用了zoo_exists(),你将无权查看)
内建ACL模式ZooKeeper有下列内建模式:
world 有独立id,anyone,代表任何用户。
auth 不使用任何id,代表任何已经认证过的用户
digest 之前使用了格式为
username:password
的字符串来生成一个MD5哈希表作为ACL ID标识。在空文档中发送username:password
来完成认证。现在的ACL表达式格式为username:base64
, 用SHA1编码密码。ip 用客户端的ip作为ACL ID标识。ACL表达式的格式为
addr/bits
,addr中最有效的位匹配上主机ip最有效的位。
setAcl 二种模式:
一种是setAcl /path digest:username:encrypedpwd:crwda 用这种方式时,encrypedpwd用户必须是密文,
另一种方式是先addauth digest:usrname:password 先把授权信息加入上下文,这里password用的是明文,然后再setAcl /path auth:username:password:crdwa
所以如果在cli控制台测试,强烈建议用第二种方式,否则象上图中的方式用错了方式,pwd-b1在zk中被认为是密文,要解密出来几乎不可能,所以设置后,相当于这个节点就废了,因为你不知道密码,要操作该节点时,提供不了正确的认证信息)
权限组合的测试结果:
要修改某个节点的ACL属性,必须具有read、admin二种权限
要删除某个节点下的子节点,必须具有对父节点的read权限,以及父节点的delete权限
4.使用shell操作Zookeeper
1.查看哪个节点被选择作为follower或者leader
echo stat | nc 127.0.0.1 2181|grep Mode |
2.测试服务是否启动(返回imok表示已经启动)
echo ruok | nc 127.0.0.1 2181 |
3.查看服务配置的详细信息
echo conf | nc 127.0.0.1 2181 |
4.查看服务环境的详细信息
echo envi | nc 127.0.0.1 2181 |
5.列出未经处理的会话和临时节点
echo dump | nc 127.0.0.1 2181 |
6.查看连接到服务端的客户端信息
echo cons | nc 127.0.0.1 2181 |
7.查看未经处理的请求
echo reqs | nc 127.0.0.1 2181 |
8.查看服务的watch详细信息
echo wchs | nc 127.0.0.1 2181 |
9.服务运行信息
echo mntr|nc 127.0.0.1 2181 |
参考: