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 子节点个数
- 超时之后并不会马上删除临时节点,要等到心跳发现断开后,才会删除临时节点
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事件的类型
- 创建父节点 触发 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 设置节点权限,
- 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