当前访客身份:游客 [ 登录  | 注册加入尚学堂]
直播

我来了!

拥有积分:3900
尚学堂雄起!!威武。。。

博客分类

笔记中心

课题中心

提问中心

答题中心

解答题中心

ZooKeeper中的写操作细节(一)

我来了! 发表于 2年前 (2014-11-11 11:05:42)  |  评论(0)  |  阅读次数(613)| 0 人收藏此文章,   我要收藏   

     ZooKeeper是专门为分布式系统提供高可用的、高性能的协作服务的,因此为了保证它的写操作,ZooKeeper采用的经典的两阶段提交协议,把写操作当作一个事务来处理。本文主要讨论该协议中的第一阶段,即事务的准备阶段。ZooKeeper的准备阶段主要就是判断该操作在当前环境下能否执行。显然,这一操作只能由当前的Leader来处理,应为Leader握有整个系统最有最全的数据。那么就让我们来研究一下Leader是如何判断各种写操作的可信性吧!

     1.创建节点操作(OpCode.create)

a.根据sessionId判断创建者当前是否还有效

b.判断新节点路径是否在有效(语义)

c.根据创建者的权限来更改爱新节点的权限列表

d.根据新节点的父节点的权限列表来判断创建者是否有权创建该节点

e.如果新节点是sequential,则更新新节点的path

f.验证新节点的path

g.判断节点path是否存在,如果已存在则创建失败

h.如果父节点是ephemeral的话,则它不能有子节点,即不能创建新节点

f.更新父节点的状态信息(子节点数、版本号等)


      2.删除节点操作(OpCode.delete)

a.根据sessionId判断创建者当前是否还有效

b.判断新节点路径是否在有效(语义)

c.判断节点是否存在

d.根据节点的父节点的权限列表来判断操作者是否有权删除该节点

e.判断操作者拥有该节点的信息是否是最新的,否则不能删除该节点

f.如果该节点还有子节点,则不能删除该节点

g.更新父节点的状态信息(子节点数、版本号等)


      3.更新节点值操作(OpCode.setData)

a.根据sessionId判断创建者当前是否还有效

b.判断节点是否存在

c.根据节点的权限列表来判断操作者是否有权修改该节点的值

d.判断操作者拥有该节点的信息是否是最新的,否则不能修改该节点的值

e.更新父节点的状态信息(子节点数、版本号等)


       4.更新节点ACL操作(OpCode.setACL)

a.根据sessionId判断创建者当前是否还有效

b.根据创建者的权限来更改新设置的节点的权限列表

c.判断节点是否存在

d.根据节点的权限列表来判断创建者是否有权更新该节点ACL

e.判断操作者拥有该节点的信息是否是最新的,否则不能更新该节点ACL

f.更新父节点的状态信息(子节点数、版本号等)

      5.创建session操作(OpCode.createSeesion)


      6.关闭session操作(OpCode.closeSeesion)


         在修改已存在节点信息的时候,我们发现验证中会有这样一步:判断操作者拥有该节点的信息是否是最新的,否则不能更新该节点ACL,这是为什么呢?这是因为客户之所以修改节点的信息,是由于它不能“容忍”节点处于该状态,也就要千方百计的修改节点状态,如果该节点已经不再这个状态的话,再修改是没有意义的。


分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
声明:博客文章版权属于原创作者,受法律保护。如果侵犯了您的权利,请联系管理员,我们将及时删除!
(邮箱:webmaster#sxt.cn(#换为@))
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183