Zookeeper进阶

ZooKeeper是一个分布式的、开源的、分布式应用协调服务。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。

Zookeeper在分布式系统中的应用

  • master选举
  • 同一配置文件维护
  • 发布订阅
  • 分布式锁
  • 集群管理,保证数据强一致性

zookeeper Session

一般来说,我们使用zookeeper是集群形式,client和zookeeper集群建立一个会话session。在这个会话session当中,client其实是随机与其中一个zk节点建立的链接,并且互发心跳。zk集群负责管理这个session,并且在所有的节点上维护这个session的信息,包括这个session中定义的临时数据和监视点watcher。
每个session都有一个过期时间
zookeeper的Session一般分为4个状态,NO_CONNECTED, CONNECTING ,CONNECTED,CLOSE;

当客户端没有建立连接的时候 即是 NO_CONNECTED , 当客户端正在建立连接的时候CONNECTING,已经连接上 CONNECTED, 连接关闭 CLOSE。
参考 :https://blog.csdn.net/jeff_fangji/article/details/43916359

ls  {path}   查看{path} 下的目录信息
ls2 {path}   查看{path} 下的目录信息和状态信息 (ls+stat)
stat {path} 查看{path} 目录的状态信息
get {path} 查看{path} 下的data 以及状态信息
######
cZxid = 0x0   节点id
ctime = Thu Jan 01 08:00:00 CST 1970  创建时间
mZxid = 0x0   修改后的id
mtime = Thu Jan 01 08:00:00 CST 1970  修改时间
pZxid = 0x0  子节点id
cversion = -1   子节点的版本
dataVersion = 0    当前节点数据版本号
aclVersion = 0       权限版本,权限发生变化会改变 
ephemeralOwner = 0x0    持久节点是0x0 ,临时节点不是
dataLength = 0   数据长度
numChildren = 1  子节点个数

《Zookeeper进阶》

  • 超时之后并不会马上删除临时节点,要等到心跳发现断开后,才会删除临时节点
stat path [watch]
set path data [version]   设置某一个目录的值,version做乐观锁,version No is not valid : /zhongc

ls path [watch]
delquota [-n|-b] path
ls2 path [watch]
setAcl path acl
setquota -n|-b val path
history
redo cmdno
printwatches on|off
delete path [version]     删除一个节点,可以使用版本号做乐观锁
sync path
listquota path
rmr path
get path [watch]
create [-s] [-e] path data acl     -e 临时节点,-s 顺序节点
addauth scheme auth
quit
getAcl path
close
connect host:port

zookeeper 的 watcher 特性

  • 针对每一个节点,zk都会对他有一个监督者(触发器)。watcher是一个事件,当监控某一个节点发生了变化,就会触发一个watcher事件
  • 在zk中watcher是一次性的,触发一次立即销毁
  • 父节点,子节点 增删改都会触发watcher,针对不同的操作,触发的watcher事件也不相同
  • watcher事件的类型
  1. 创建父节点 触发 NodeCreated
stat /zwatch watch 

[zk: localhost:2181(CONNECTED) 19] create /zwatch 123

WATCHER::
WatchedEvent state:SyncConnected type:NodeCreated path:/zwatch
Created /zwatch

2.修改父节点数据触发 NodeDataChanged

get /zwatch watch

[zk: localhost:2181(CONNECTED) 22] set /zwatch 999

WATCHER::
WatchedEvent state:SyncConnected type:NodeDataChanged path:/zwatch
cZxid = 0x1b
ctime = Tue Apr 24 23:16:39 CST 2018

3.删除节点会触发 NodeDeleted

get /zwatch swtch

[zk: localhost:2181(CONNECTED) 24] delete /zwatch

WATCHER::
WatchedEvent state:SyncConnected type:NodeDeleted path:/zwatch

4.创建和删除子节点 触发 NodeChildrenChanged ,修改子节点数据不会触发父节点watcher

ls /zhongc watchet

[zk: localhost:2181(CONNECTED) 2] create -s /zhongc/sec 66

WATCHER::
WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/zhongc
Created /zhongc/sec0000000006

zookeeper 的 ACL 权限控制

  • ACL命令行
getAcl
setAcl
addauth scheme auth  授权认证
[zk: localhost:2181(CONNECTED) 13] create /xyz data
[zk: localhost:2181(CONNECTED) 15] getAcl /xyz
'world,'anyone
: cdrwa
  • ACL是由 [scheme:id:permissions ] 来构成权限列表的,scheme是代表采用的某种权限机制,id代表允许访问的用户,permissions代表权限组合字符串

  • scheme
    1.world:world下只有一个id,即只有一个用户,也就是anyone,那么组合的写法就是 world:anyone:[permissions]
    2.auth: auth 代表认证登录,需要注册用户有权限才可以。写法是:auth:user:passworld:[permissions]
    3.digest: 和auth类似,只不过是密码要加密。写法是 digest:username:BASE64(SHA1(passworld)):[permissions]
    4.ip: 真对IP进行限制,指定IP可以访问。写法是 ip:192.169.1.11:[permissions]
    5.super:超级管理员,拥有所有权限。修改配置

权限的构成 permissions

权限字符串缩写 crdwa

  • c:CREATE 创建当前节点的子节点
  • r:READ 获取当前节点下的目录,数据
  • w: WRITE 设置节点数据
  • d:DELETE 删除子节点
  • a:ADMIN 修改权限

zk中的权限是每一个节点相互独立的,不存在父子节点间的继承权限的关系

  • acl之word权限操作
getAcl 获取权限信息,使用create 创建节点,会被赋予默认权限
setAcl /xyz/a world:anyone:crwa   设置节点权限,

《Zookeeper进阶》

  • acl之auth与digest权限操作

在使用auth之前,必须先使用addauth添加一个用户,然后才可以setAcl,在setAcl的时候无论指定什么username和password都不会生效。都会保持和addauth一样的用户名和密码。然后断开连接,在重新连接,再次访问刚才设置权限的节点,会发现没有权限,这个时候再使用addauth进行登录,才可以访问刚才设置权限的节点。digest和auth同理,只不过密码是密文,而且使用digest不需要先登录,就可以设置权限。

addauth digest zhongc:123456  添加用户
setAcl /names/zhongc auth:zhongc:1234567:crw
setAcl /names/zhongc auth:crw
  • acl之ip权限操作
setAcl /ip ip:192.168.0.102:crwad
  • acl之super权限操作
修改 zkServer.sh ,修改启动脚本
然后addauth degist super:123456 登录设置的超级管理员账号
  • ACL的使用场景
    开发测试环境隔离
    生产环境指定ip访问

zookeeper 的 四字命令

zookeeper可以根据自身提供的简写命令来和服务器交互,需要用到nc命令,所以需要先安装 nc 。

yun install nc
    原文作者:我叫了了
    原文地址: https://www.jianshu.com/p/0334dd12b05a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞