Zookeeper简单总结

目的

通过共享存储,实现分布式系统的任务协调。
以共享存储,data tree为基础,开发者可以在zookeeper上实现分布式锁,主从架构等。
保障AP

基本模型

存储

类文件系统,data tree。data tree 上的节点 - ZNode。ZNode 可以存储 data bytes

Znode 类型

  • PERSISTENT
  • PERSISTENT_SEQUENTIAL SEQUENTIAL的名字会在父节点下自增,如 worker-1, worker-2...
  • EPHEMERAL 临时节点,随session 失效而被删除
  • EPHEMERAL_SEQUENTIAL
  • CONTAINER 当子节点都被删除后,Container 也随即删除
  • PERSISTENT_WITH_TTL 超过TTL 未被修改,且没有子节点
  • PERSISTENT_SEQUENTIAL_WITH_TTL
Znode stat

Znode 存储的一些元数据
czxid - znode 创建的 zxid
mzxid - modified zxid
pzxid - last modified child zxid
version - count of changes of the data

Watcher

在get数据的同时,可以设置watcher,以便在节点/数据变动时收到通知。
Watcher为单次触发,被触发后会需要再次设置。
Watcher在session过期后会失效,所以连接转移后需要重新注册watcher
数据watcher - exists, getData
子节点watcher - getChildren

ZK协议

Transaction

改变ZK 状态的操作为一个transaction, transaction 具有幂等性。
每个 transaction 拥有leader 为其分配的唯一 zxid
zxid (64bits) = leader epoch (32bits) + counter (32bits)
leader epoch 在每次新leader被选举出来后更新,epoch不同即可视为不同的leader

Leader 选举

vote = (server id(voteid), zxid)

  1. 所有server以自己的server id和最近的zxid 作为vote,向其他server 进行广播
  2. 当一个server 收到一个vote 后,如果 voteZxid > myZxid || (voteZxid == myZxid && voteid > mysid),则更新自己的选票为 (voteId, voteZxid),重新进行广播
  3. 当超过quorum 的server 的选票达成一致之后,即产生新的leader. 其余server 为follower

上述过程使得拥有最新的zxid的sid最大的server 成为leader.

默认FastLeaderElection 等待时间为200ms。可能会由于网络延迟,使得某些server未接受到最长zxid的vote而认为错位的server 为leader。

Zab协议

Zookeeper Atomic Broacast protocol. zookeeper用来在server提交transaction的协议

  1. Leader 向所有 Follower 发送 PROPOSAL
  2. Follower 接受 Proposal 后,回复 Leader ACK
  3. 若收到超过quorum 的ACK (包括leader 自己),则向所有 Follower 发送 COMMIT, Follower 则执行该提案。

Leader变化

新的Leader 由于leader选取的原则,将持有最大的zxid。新leader负责将所有follower同步到最近状态,再接受新的提案。

  1. follower 状态落后leader不多,发送缺失的事务。
  2. follower 状态落后太多,直接发送 snapshot 更新整个follower 状态。

Observer

只接受提案,不参与选举。
作用:提高读请求的throughput。follower增加 -> quorum 增加 -> 写throughput下降。
开销:observer增加 -> 消息数增加

故障

Recoverable

Cilent 与server 暂时断开连接后,所有pending 的request 会收到ConnectionLossException。Client 会自动尝试重新连接其他的server。

Unrecoverable

Client的session被server关闭,或者验权失效。
可以处理好当前工作后,重启该client 解决

外部资源

client可能由于JVM停顿等原因,失去了Leadership,在没有察觉到Leadership 已经失去的情况下,访问改变外部资源,从而导致外部状态不一致。
可以通过在访问外部资源协议中,加入zxid校验,保障旧的leader 不会再新leader 之后再访问资源。

需要注意的细节

顺序保障

写顺序

所有server保证和leader的写操作的顺序一致,但是写操作不能保证在所有server上同时发生,所以不同的server的状态可能会存在短暂的不一致。

读顺序

client观测到的读的顺序也是一致的,但有状态变化有先后。

watcher

在同一个Znode 上设置大量的Watcher 会导致触发大量的通知消息。

Znode

数据上限

默认为1MB, 包括znode byte data 和子节点。

version

znode 重建后,data version 会重新计算。依靠match data version进行的操作可能不可靠。

组件

RequestProcessor

server 由 RequestProcessor 所组成的pipeline 来处理 Request object 实现相应功能

LeaderZooKeeperServer

PrepRequestProcessor -> ProposalRequestProcessor -> CommitProcessor -> ToBeAppliedRequestProcessor -> FinalRequestProcessor

ProposalRequestProcessor -> SyncRequestProcessor -> AckRequestProcessor

FollowerZooKeeperServer

FollowerRequestProcessor -> CommitProcessor -> FinalRequestProcessor
SyncRequestProcessor -> SendAckRequestProcessor

WatcherManager

管理Watcher

ExpiryQueue

SessionTrackerImpl 使用ExpiryQueue 以bucket 为单位过期session

Client

Zookeeper 提供客户端API
ClientCnxn 管理连接到server 的socket

Jute

序列化

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

推荐阅读更多精彩内容

  • 一个真正的写数据流程是怎么样的?一个真正的读数据流程是怎么样的?一个真正的同步数据流程是怎么样的?从哪里到哪里?什...
    时待吾阅读 3,997评论 0 14
  • 简介 ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实...
    jiangmo阅读 815评论 0 2
  • ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于...
    rthsfjhtrj阅读 550评论 0 1
  • zookeeper单机模式搭建Zookeeper集群及伪集群模式搭建 简介 ZooKeeper 是一个开源的分布式...
    普度众生的面瘫青年阅读 2,744评论 0 10
  • 于千万人之中 遇见你所遇见的人, 于千万年之中 时间的无涯的荒野里, 没有早一步, 也没有晚一步, 正巧赶上了。 ...
    此时节阅读 259评论 0 0