基本操作命令
带sh结尾的就是shell脚本得命令 清理的命令:zkCleanup.sh 客户端的命令:zkCli.sh 环境的配置:zkEnv.sh 服务端的配置:ZkServer.sh
常用的命令是增删改查
1:如何去判断zookeeper是真得启动:
通过status来查出standalone就是单机版得启动。
2:连接到客户端,默认得就是连接到localhost:如果连接得zookeeper不在我的本地,可以这样去连接。
3:man:列出当前zookeeper可用得命令:
ls /path:列出根节点下得所有节点:zookeeper是个树形结构。
ls2 /path:除了详情以外,还会列出子节点。
get /path:把当前节点的数据拿出来
stat:是status得缩写,列出节点状态得详情信息 :stat /path: path是节点路径。stat /:从根节点查找,可以列出当前节点得状态信息。
cZxid:创建节点得id
ctime:节点得创建时间。
mZxid:修改节点得id。
mtime:修改节点得时间
pZxid:子节点得id [最新插入子节点得id]。
cversion:子节点得版本(每操作一次子节点,它得cversion就会加1。
dataversion:当前节点得数据版本 数据版本号 每操作一次节点得值,按照每次加1得递增得。
aclversion:每改一次权限,这里也会增加1。
ephemeralowner:是否是临时节点
dataLength:数据得长度,它得长度是由父 节点得长度加上子节点得长度组成得长度。
numchildren:子节点得个数。
注意:加粗得都是运用乐观锁来实现的,来控制节点数据得完整性。
4:如果在一个子节点新创建一个子节点得话:
用stat查出得结果信息是最后一个节点得id,最新节点得id,因为最新插入得节点有可能最新被操作,它这里做了一个简单得优化
delquota [-n|-b] path:删除设置节点的配额 setquota -n| -b val path:设置某个节点得配额
n:代表配置该节点下面的子节点的个数
b:代表是path设置的数据大小
listquota path:列出某个path得配额
配额是限制子节点的个数和当前节点的数据的大小
history:列出客户端的11条命令
printwatches:是否动态的去打印监听器
create:新增节点 create [-s] [-e] path data acl:acl代表得是权限 [-s有顺序的,-e:临时的节点]
[]:代表的是可选的,代表可以不写
新增节点就有节点的类型:
永久节点:一旦创建,你不去手动的删除它,那么它在zookeeper上一直会存在。
永久顺序节点:
临时节点:当会话结束后(一旦断开客户端),这个节点就会自动被删掉,档期按会话 有效,临时节点在分布式锁里面非常有用。
临时顺序节点:
注意:在创建节点的时候不能递归创建,不能像linux中加个-p去递归的创建。
每个节点都需要一级一级的去创建。
creata /node noder-data:默认创建的节点就是永久的节点。
会话结束的话,再进行连接的话,这个节点还在的。
永久顺序节点:create -s /abc/bbb/ccc ccc-data,下面创建的都是永久的节点。
ccc-data:这个值得类型是byte。写得时候是字符串,但是存储得时候转成byte来存储
节点得名称是不能重复的。
临时节点:create -e /node/temp temp-data:当我主动退出会话的话,会把当前的node节点下的temp节点给主动删除掉。
注意:临时节点只能创建到永久节点的下面,临时节点不能创建临时节点,临时的节点不能有孩子,临时的节点也不能创建永久节点。
会话关闭的时候:在登录进来的时候,临时的节点就没了。
临时节点只能建到最后一层。
临时节点的用途:比如我这里用了分布式的锁,我刚好删除分布式锁的时候,突然之间出现了问题(突然之间断电的话),这里就没有成功,然后这把锁就没有删掉,也就是这个人一直没有把这把锁释放开,然后等锁的一直没有拿到,然后这里就形成了死锁了。如果是临时节点的话就好办了,当你断开会话的时候,就把锁给释放开了。所以说临时节点能够避免高性能的死锁的问题,这就是临时节点的好处。
分布式锁:相当于有很多个节点,去同时获取同一把锁,其中一个拿到的话,用完要释放锁,其他的节点才能够用。
临时的顺序节点:create -e -s /node/temp1 temp1-data,后面 的数字是一共为9个数字的这样的列表。
临时的顺序节点:也是通过顺序来解决一些的常规的问题,比如可以找到临时节点中最小的序号的节点,让它来获取锁,操作完再释放,释放完让它的次节点来获取锁来进行操作,这样就可以保证在分布式的执行的过程中锁的执行是有顺序的,因为只有最小的节点才能拿到锁。
close:关闭客户端,quit:退出客户端
当退出再登录客户端查看之后所有的顺序的临时节点全部释放掉了
删除一个永久节点:delete /abc/bbb/ccc0000000004 [version]
如果不指定版本的话,会按照节点的名称去删,
delete path [version]:在删除的时候可以指定版本的删除。仍然不支持递归删除。
它其实这里使用了乐观锁,version版本:每当操作一次这个节点,它的版本号会增加1
比如现在有两个并发操作,并发的去删除这个节点,有一个节点删除成功的话,它就会实现乐观锁,就是把它自身的版本号加1,第二个再来删的时候就发现版本号不对了。
所以说第二个就删除不成功。这里使用乐观锁来保持这个节点的一致性。
什么是乐观锁:举个例子,因为第一次用version的时候,版本号已经控制了dataVersion的值,他会把dataVersion变为3,然后再继续对version为2操作的时候就会失败,因为这两个是并发的操作,这时就可以保证这个节点的数据的一致性。
整个version的操作是原子的。这个是由zookeeper去控制的。
set:命令用来设置某个节点的值也可以修改某个节点的值。
xxx [watch]:命令,代表事件的监听:Watcher/watch [zookeeper的监听是一致性的,整个事件的注册是一致性的,注册一次使用一次,如果想要监听其他的动作的话,还需要注册]
ls path [watch]
get path [watch]
stat path [watch]:这里即使是失败了,但是监听已经注册上去了,创建了一个path这时就被监听到了。如果zookeeper版本为4的话 stat /greer watcher
syncConnected:代表成功的连上了zookeeper。
NodeCreated:代表创建成功了。
监听这个节点的变化。
stat:注册节点的监听,创建/修改/删除都可以注册监听。
ls -w /path:注册一个节点监听器:ls -w /path:一样可以监听到。ls不能监听到节点的创建。
注册节点删除监听,改和创建能注册,但是监听不了。
get -w /path:注册监听,创建节点的时候这个事件没有被触发。删除和设置节点都会触发。
注册节点删除和修改事件的监听,但是创建能注册但是没监听。
总结:上面监听的只是父节点,子节点的监听如下:这个是监听的父节点,子节点发生改变的话,监听的是父节点。
ls只能监听下的子节点,不能监听下下子节点
删除也会触发,但是修改时不会触发:
注意:每次命令操作path都必须是绝对路径。
权限控制命令:ACL(Access Control List:访问控制列表)
权限控制命令在整个开发中用的非常多.
比如我有两个节点:不同的权限可以访问不同的节点,可以通过这个路径来授权。
让其能够访问哪些节点。
/admin:管理员只能访问/admin这个路径下的节点
/customer:普通用户只能访问/customer这个路径下的节点。
getAcl:获取某个节点的权限
setAcl:设置 某个节点的权限 setAcl /acl-node/abc world:anyone:ca
addauth:注册用户 addauth digest 用户名:密码
整个的权限ACL是由[schema:id:permissions]
schema:是一种权限的机制。
在schema权限的机制一共有三种。
world:配置下只有一个id,就是anyone,代表的是任何人。组合写法:[world:anyone:permissions]
默认使用的是world。
auth:认证登录,需要有一个注册的 用户才能够操作。格式:auth:user:password:permissions,用这种方式设置好之后也是密文,默认的是使用
Base64(sha1(password))
digest:和auth差不多,但是在设置密码的受必须是密文 Base64(sha1(password))
用的最多的是使用时digest。
在开发中可以使用ip来限制:某一台机器的ip才能够操作这个目录。
格式:ip:ip地址:permissions
如果操作auth和digest:必须要有一个注册用户
super:代表超级管理员,比如一个节点挂了,它去修复。
创建节点的时候可以指定acl: create [-s] [-e] path data acl
默认的schema是world,anyone:代表的是所有的每个人。
权限是cdrwa:[permissions]
c:create
d:delete
r:read
w:write
a:admin:管理员的权限。
查询的权限就没有了
使用auth,如果使用它的话,需要登录注册的,这时密码就是加密的了。
本来用的是auth,但是它给转成digest得schema。
使用digest:也需要注册的。和auth是一样的,只是一个是明文,一个是密文。
总结 :上面的设置的节点的权限只是针对当前的节点的权限是有效的,子节点的权限是无效的。权限不会进行传递的。
创建节点可以指定权限的,可以指定使用哪种schema的格式去创建。如果一个用户登录了,还没有退出的话,可以使用匿名的方式去创建:就是当前登录的用户来进行校验。如果退出的话,还需要登录,注册再创建节点。第一次代表注册,第二次代表登录。
四字命令
运维用来排错和监控来做得命令