zookeeper之会话、数据模型与节点类型与特性、版本

会话

Session是指客户端会话,在讲解客户端会话之前,我们先来了解下客户端连接。在ZooKeeper中,一个客户端连接是指客户端和ZooKeeper服务器之间的TCP长连接。ZooKeeper对外的服务端口默认是2181,客户端启动时,首先会与服务器建立一个TCP连接,从第一次连接建立开始,客户端会话的生命周期也开始了,通过这个连接,客户端能够通过心跳检测和服务器保持有效的会话,也能够向ZooKeeper服务器发送请求并接受响应,同时还能通过该连接接收来自服务器的Watch事件通知。Session的SessionTimeout值用来设置一个客户端会话的超时时间。当由于服务器压力太大、网络故障或是客户端主动断开连接等各种原因导致客户端连接断开时,只要在SessionTimeout规定的时间内能够重新连接上集群中任意一台服务器,那么之前创建的会话仍然有效。

zookeeper数据模型

zookeeper中主要是采用类似文件系统或者说树的结构模式作为数据模型,命名符合常规文件系统规范,每个目录称zNode节点,并且会有一个唯一的路径标识。

每个znode还可以包含数据和子节点znode,临时的节点不能有子节点。同时,znode中的数据还带有多个版本,所以查询的时候需要带上该版本号。 客户端还可以设置该节点是否设置watcher,来监视它。

关于watcher不清楚的可以看我的这篇文章:
//todo

节点类型与特性

zookeeper的节点是有生命周期的,因此节点的类型能决定不同的生命周期。其类型分为:

1.持久化节点(Persistent)

2.临时节点(EPHEMERAL)

3.顺序节点(SEQUENTIAL )

更具体地在节点地创建中,一般都会组合使用,所以能生成以下四种类型:
1.持久节点(PERSISTENT)
持久节点就是指节点创建后,无论客户端地会话是否还存在或失效就消失,除非主动删除。

2.持久顺序节点(PERSISTENT_SEQUENTIAL)
这种节点作为父节点都会为它的子节点维护一个时序,会记录每个子节点创建的先后顺序。客户端可以根据这个特性,在创建的时候设置这个属性,来作为新的节点名。这个数字的后缀的上限是整形的最大值。

3.临时节点(EPHEMERAL)
这个与持久化节点正好相反,生命周期是根据客户端的会话进行绑定的。如果会话失效,而不是连接断开,就会失效。另外临时节点不能创建子节点。

4.临时顺序节点(EPHEMERAL_SEQUENTIAL)
临时顺序节点的特性和临时节点一致,同时是在临时节点的基础上,添加了顺序的特性。

关于节点的状态

每个节点都是有状态的,zookeeper会为每个节点维护以下的一些状态信息,可以通过get来获得。

czxid:创建节点的事务的zxid
mzxid:对znode最近修改的zxid
ctime:以距离时间原点(epoch)的毫秒数表示的znode创建时间
mtime:以距离时间原点(epoch)的毫秒数表示的znode最近修改时间
version:znode数据的修改次数
cversion:znode子节点修改次数
aversion:znode的ACL修改次数
ephemeralOwner:如果znode是临时节点,则指示节点所有者的会话ID;如果不是临时节点,则为零。
dataLength:znode数据长度。
numChildren:znode子节点个数。

关于节点的版本===可以保证分布式数据的原子操作
Zookeeper会为每个Znode维护一个叫作Stat的数据结构,结构如图:存在三个版本信息:

version:znode数据的修改次数
cversion:znode子节点修改次数
aversion:znode的ACL修改次数

version是表示对数据节点数据内容的变更次数,强调的是变更次数,因此就算数据内容的值没有发生变化,version的值也会递增。

Zookeeper的版本作用就是类似于乐观锁机制,用于实现乐观锁机制的“写入校验”.看源码:


image.png

从上边的逻辑,我们可以看到,当对数据节点状态进行改变时,首先要进行数据节点版本检查,如果首先获得当前请求的版本,然后再从数据积累获取当前服务器上该数据的最新版本,如果version=-1,则客户端不要求使用乐观锁,可以忽略此版本检查,如果不是-1,就进行检查,匹配才进行数据变更,否则抛出异常。

总之在我看来就是使用乐观锁的写入校验,获取到的版本号跟自己的对比,相等就加一,有点类似CAS算法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • 转自:https://www.jianshu.com/p/84ad63127cd1作者:Jeffbond 简介 Z...
    小北觅阅读 930评论 0 8
  • 数据模型: Zookeeper通过分层名称空间来管理数据,和文件系统类型,唯一的不同点是每个znode既可以创建c...
    AStreet阅读 1,108评论 0 0
  • 序言   Apache ZooKeeper是由集群(节点组)使用的一种服务,用于在自身之间协调,并通过稳健的同步技...
    抄无止境阅读 1,021评论 0 1
  • Zookeeper 是什么? ZooKeeper是一种分布式协调服务,用于管理大型主机。在分布式环境中协调和管理服...
    泛轻舟gen阅读 3,381评论 0 1
  • 21日晚上,我给老爸打电话,电话中的有一大半内容是我向爸爸倾述了对冬霞和贝佳的不满,满满的都是情绪和牢骚。 爸爸只...
    大道至简3阅读 106评论 0 0