目录
基本数据模型
- 是一个树形结构,类似前端开发中的tree.js组件,zk的数据模型也可以理解为linux的文件目录:/usr/local/…
- 每一个节点都称之为znode,它可以有子节点,也可以有数据
- 每个节点分为临时节点和永久节点,临时节点在客户端断开后消失
- 每个zk节点都有各自的版本号,可以通过命令行来显示节点信息
- 每当节点数据发生变化,那么该节点的版本号会累加(乐观锁)
- 删除、修改过时节点,版本号不匹配则会报错
- 每个zk节点存储的数据不宜过大,几K即可
- 节点可以设置权限acl,可以通过权限来限制用户的访问
数据模型的基本操作
客户端连接
1 | ./zkServer.sh start |
查看znode结构
1 | ls |
关闭客户端连接
关闭客户端一般直接Ctrl+C即可。
zk的作用体用
- master节点选举,主节点挂了以后,从节点就会接受工作,并且保证这个节点是唯一的,这也是所谓首脑模式,从而保证我们的集群是高可用的。
- 统一配置文件管理,即只需要部署一台服务器,则可以把相同的配置文件同步更新到其他所有服务器,此操作在云计算中用的特别多。
- 发布与订阅,类似消息队列MQ(amq,rmq…),dubbo发布者把数据存在znode上,订阅者会读取这个数据。
- 提供分布式锁,分布式环境中不同进程之间争夺资源,类似于多线程中的锁。
- 集群管理,集群中保证数据的强一致性。
zk常用命令行操作
- 通过
./zkCli.sh打开zk的客户端进行命令行后台。 - ls与ls2:ls是查看节点的信息,而ls2则是ls+stat命令的整合命令。
- get与stat:get是获取节点的数据,并且会打印出节点的信息,stat则是直接打印节点信息,我们来看下节点信息中包含了什么
1 | cZxid # 节点创建后,zk为这个节点分配的id |
- create:语法create [-s] [-e] path data acl;-e为临时节点,-s为顺序节点
- set:语法set path data [version];version主要用于乐观锁
- delete:语法delete path [version];version语义与set一致
zk特性
Session的基本原理
- 客户端与服务端之间的连接存在会话
- 每个会话都可以设置一个超时时间
- 心跳结束,session则过期
- Session过期,则临时节点znode会被抛弃
- 心跳机制:客户端向服务端的ping包请求
Watcher机制
- 针对每个节点的操作,都会有一个监督者->wather
- 当监控的某个对象(znode)发生了变化,则出发watcher事件
- zk中的watcher是一次性的,触发后立即销毁
- 父节点,子节点增删改都能够触发其watcher
- 针对不同类型的操作,触发的watcher事件也不同:
- (子)节点创建事件
- (子)节点删除事件
- (子)节点数据变化事件
Watcher命令行学习
- 通过get path [watch]设置watcher
- 父节点增删改操作都可以触发watcher
- 子节点增删改操作也都可以触发watcher
watcher事件类型
父节点
- 创建父节点触发:NodeCreated,可以通过stat path [watch]来给指定path绑定事件,path不存在也可以提前创建事件。
- 修改父节点数据触发:NodeDataChanged,也可以利用get path [watch]来绑定事件。
- 删除父节点触发:NodeDeleted。
- ls为父节点设置watcher,创建子节点触发:NodeChildrenChanged
- ls为父节点设置watcher,删除子节点触发:NodeChildrenChanged
- ls为父节点设置watcher,修改子节点不触发事件,需要把子节点当成父节点来进行事件绑定
watcher使用场景
- 统一资源配置
ACL(ACCESS CONTROL LISTS)权限控制
- 针对节点可以设置相关读写等权限,目的为了保障数据安全性
- 权限permissions可以指定不同的权限范围以及角色
ACL命令行
- getAcl:获取某个节点的acl权限信息,语法 getAcl path
- setAcl:设置某个节点的acl权限信息,语法 setAcl path acl
- addauth:输入认证授权信息,注册时输入明文密码(登录),但是在zk的系统里,密码是以加密的形式存在的。语法:addauth scheme auth
ACL的构成
- zk的acl通过[scheme:ip:permissions]来构成权限列表
- scheme:代表采用的某种权限机制
- ip:代表允许访问的用户ip
- permissions:权限组合字符
Scheme
- world:world下只有一个id,即只要一个用户,也就是anyone,那么组合的写法就是world:anayone:[permissions]
- auth:代表认证登录,需要注册用户有权限就可以,形式为auth:user:password:[permissions]
- digest:需要对密码加密才能访问,组合形式为:digest:username:BASE64(SHA1(password)):[permissions]
简而言之,auth与digest的区别就是,前者明文,后者密文setAcl /path auth:lee:lee:cdrwa与setAcl /path digest:lee:BASE64(SHA1(
password))cdrwa是等价的,在通过addauth digest lee:lee后都能操作指定节点的权限
- ip:当设置为ip指定的ip地址,此时限制ip进行访问,比如ip:192.168.1.1:[permissions]
- super:代表超级管理员,拥有所有的权限
使用super是要进行两步
1.修改zkServer.sh增加super管理员,在文件中搜索nohup,增加如下代码-Dzookeeper.DigestAuthenticationProvider.superDigest=username:password
2.重启zkServer.sh
Permissions
权限字符串缩写:crdwa
- create:创建子节点
- read:获取节点、子节点
- write:设置节点数据
- delete:删除子节点
- admin:设置权限
ALC的常用使用场景
- 开发/测试环境分离,开发者无权限操作测试库的节点,只能看
- 生产环境上控制指定ip的服务可以访问相关节点,防止混乱
zk四字命令Four Letter Words
- zk可以通过它自身提供的简写命令来和服务器进行交互
- 需要使用到nc命令,安装:yum install nc
- echo [command] | nc [ip] [port]
四字命令简介
- stat 查看zk的状态信息,以及是否standalone mode
- ruok 查看当前zkserver是否启动,返回imok。
- dump 列出未经处理的会话和临时节点
- conf 查看服务器配置
- cons 展示连接到服务器的客户端信息
- envi 环境变量
- mntr 监控zk健康信息
- wchs 展示watch的信息
- wchc与wchp: session与watch及path与watch信息,注意3.4.10版本以上默认是不开启这两个命令,需要从zoo.conf文件中添加
4lw.commands.whitelist
zk集群搭建
- zk集群,主从节点,心跳机制(选举模式)