参考:https://juejin.im/post/5d0bd358e51d45105e0212db
安装
目录结构
bin —> 包括了linux和window的运行程序的运行目录
conf —> zookeeper的配置zoo.cfg
contrib —> 其他一些组件和发行版本
dist-maven —> maven发布下的一些jar包
docs —> 文档
lib —> 库
recipe —> 一些应用实例
src —> zookeeper的源码,因为zookeeper是java写出来的
zoo.cfg配置
tickTime:用于计算的时间单元。比如session超时:N*tickTime
initLimit:用于集群,允许送节点连接并同步到master节点的初始化连接时间,以tickTime的倍数来表示。
syncLimit:用于集群,master主节点与从节点之间发送消息,请求和应答时间长度(心跳机制),以tickTime的倍数来表示。
dataDir:必须配置,相关数据如事务文件的存储目录
dataLogDir:日志目录,如果不指定和dataDir为同一个目录
clientPort:链接服务器的端口,默认2181
##zookeeper基本数据模型
- 基本数据模型可以理解为linux/unix的文件目录,比如/usr/local,/是根节点
- 每一个节点东都之为znode,可以有子节点,也可以有数据
- 每一个节点分为临时节点和永久节点,临时节点在客户端断开后消失
- 每一个zk节点都有各自的版本号,可以通过命令行显示节点信息
- 每当节点数据发生变化,那么节点的版本号会累加(乐观锁)
- 删除/修改果实节点,版本号不匹配则会报错
- 每一个zk节点存储的数据不宜过大,限制是1m
- 节点可以设置权限acl,可以通过权限来限制用户的访问
zookeeper数据模型的基本操作
客户端连接
- 用官方给的cli连接,运行后显示
1
2WatchedEvent state:SyncConnected type:None path:null
[zk: localhost:2181(CONNECTED) 0]
表示连接到localhost的2181端口
命令
help命令
可以看所有命令的帮助
###ls命令
- 相当于linux的ls或者ll命令,是查看某一个节点下的节点
例如:ls /是查看根节点下的节点
stat
- 相当于status,查看是某一个节点的状态信息,比如cZxid是创建后zk为节点分配的id,ctime是节点创建的时间,mZxid表示修改后的id,mtime是修改后的时间,pZxid表示子节点id,cversion表示子节点的版本,dataVersion表示当前节点数据的版本号,aclVersion表示权限版本号,dataLength数据长度等信息,numChilden表示孩子结点的个数
- 例如:
1
2
3
4
5
6
7
8
9
10
11
12[zk: localhost:2181(CONNECTED) 3] stat /zookeeper
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2
ls2命令
- 相当于ls+stat
- 也可以运行ls -s
create命令
- 创建节点的命令
持久节点
- 直接通过create path value所创建
create /xwm
表示创建/xwm节点,此时执行ls/会有zookeeper和xwm两个节点
临时节点
- create -e path value
create -e /xwm/temp
表示创建临时节点/xwm/temp,此时执行ls2 /xwm会发现下面的temp节点并且/xwm节点的版本号会增加1
当此session断开过了心跳机制的期限时间以后临时节点会被抛弃
顺序节点
- create -s path value
create -s /xwm/shun
表示创建顺序节点,第一个节点id是1,第二个是2,执行两边后的结果
[shun0000000001, shun0000000002, tmp]
set命令
- set path data [version]
给path设置data,后面可以设置版本号
如果后面的版本号不是最新的节点的版本号,则会报错,乐观锁的体现
get命令
- get [-s] [-w] path
获取某个节点的数据
delete命令
- delete [-v version] path
删除节点操作,version是版本号,乐观锁机制
getAcl
- getAcl [-s] path
获取某个节点的权限
setAcl
- setAcl [-s] [-v version] [-R] path acl
设置某个节点的权限
addauth
- addauth scheme auth
添加某个权限,比如addauth digest lee:lee
zk的作用体现
- master节点选举,主节点挂了以后,从节点就会接受工作,并且保证这个节点都是唯一的,这也是所谓的首脑模式,从而保证我们的集群是高可用的。
- 统一配置文件管理,即只需要部署一台服务器,则可以把相同的配置文件同步更新到其他所有服务器,此操作在云计算中用的特别多
- 发布与订阅,类似于消息队列mq,dubbo发布者把数据存在zonde上,订阅者会读取这个数据。
- 提供了分布式锁,分布式环境中不同进程之间争夺资源,类似于多线程问题中的锁
- 集权管理,集群中保证数据的强一致性
zk的session的基本原理
- 客户端与服务端之间的链接存在会话
- 每个会话都可以设置一个超时时间
- 心跳结束,session则过期
- session过期,则此session创建的临时节点znode会被抛弃
- 心跳机制:客户端向服务端的ping包请求
watcher机制
- 针对每个节点得操作,都会有一个监督者->watcher
- 可以理解为触发器,当节点有一些变化的时候,比如更新删除都会触发watcher事件,类似于触发器
zk中watcher是一次性的,触发后立即销毁
父节点,子节点 增删改都会出发其watcher
- 针对不同类型的操作,触发的watcher事件也不同,比如创建事件,删除事件,节点数据变化事件
命令行学习watcher
- 通过get [-w] path设置watcher
- stat [-w] path设置watcher
例如执行 stat -w /xwm,此时就给xwm设置一个watcher,当修改/xwm得时候,如set /xwm 123时,会触发一个1
WatchedEvent state:SyncConnected type:NodeDataChanged path:/xwm
格式的watcher,当再次执行set命令,则不会执行
watcher使用场景
- 统一资源配置
例如一个集群中所有的节点都一样,给他们设置watcher,当一个改变了,客户端就会收到一个watcher事件,客户端就会进行相应的操作集群中其他的机器
acl权限控制
- 针对节点可以设置相关读写等权限,目的为了保障数据安全性
- 权限permissions可以指定不同的权限范围以及角色
命令
- getAcl:获取某个节点的acl权限信息
- setAcl:设置某个节点的acl权限信息
- addauth:输入认证授权信息,注册时输入明文密码(登录)但是在zk系统里,密码是以加密的形式存在的
获取到一个节点的权限:getAcl /xwm/tmp1
2'world,'anyone
: cdrwa
- zk的acl通过[scheme:id:permissions]来构成权限列表
scheme:代表采用的某种权限机制
id:代表允许访问的用户
permissions:权限组和字符串
scheme
world:world下只有一个id,即只有一个用户,也就是anyone,那么组合写法就是world:anyone:[permissions]
auth:代表认证登录,需要注册用户权限就可以,形式为auth:user:passworld:[permissions]
digest:需要对密码加密才能访问,组合形式为digest:username:BASE64(SHA1(password)):[permissions]
auth和digest的区别就是前者是明文,后者是密文setAcl/path auth:lee:lee:cdrwa与setAcl /path digest:BASE64(SHA1(password))cdrwa是等价的,在通过addauth digest lee:lee后都能操作指定节点的权限。
ip:但设置为ip指定的ip地址,对此限制ip进行访问,比如ip:192.168.1.1:[permissions]
super:代表超级管理员,拥有所有的权限
permissions
- 权限字符串缩写crdwa
- create:创建子节点
- read:获取节点/子节点
- write:设置节点数据
- delete:删除子节点
- admin:设置权限
设置super权限
- 修改zkServer,增加super管理员
在运行Java的代码中添加1
"-Dzookeeper.DigestAuthenticationProvider.spuerDigest=hello:JD3gbdfzNg9biCKhgtpVo+3enoI="
则添加了超级管理员hello:123456
- 重启zkServer
- 登录超级管理员
1
addauth digest hello:123456
zk四字命令 four letter words
- zk可以通过它自身提供的简写命令来和服务器进行交互
- 需要nc命令,安装yum install nc
- echo [commond] | nc [ip] [port]
commond
- envi环境变量
- conf输出相关服务配置的详细信息。
- cons列出所有连接到服务器的客户端的完全的连接 / 会话的详细信息。包括“接受 / 发送”的包数量、会话 id 、操作延迟、最后的操作执行等等信息。
- dump列出未经处理的会话和临时节点。
- envi输出关于服务环境的详细信息(区别于 conf 命令)。
- reqs列出未经处理的请求
- ruok测试服务是否处于正确状态。如果确实如此,那么服务返回“imok ”,否则不做任何相应。
- stat输出关于性能和连接的客户端的列表。
- wchs列出服务器 watch 的详细信息。
- wchc通过 session 列出服务器 watch 的详细信息,它的输出是一个与watch 相关的会话的列表。
- wchp通过路径列出服务器 watch 的详细信息。它输出一个与 session相关的路径。
- mntr监控zk健康信息