极客视点
极客时间编辑部
极客时间编辑部
113243 人已学习
免费领取
课程目录
已完结/共 3766 讲
2020年09月 (90讲)
时长 05:33
2020年08月 (93讲)
2020年07月 (93讲)
时长 05:51
2020年06月 (90讲)
2020年05月 (93讲)
2020年04月 (90讲)
2020年03月 (92讲)
时长 04:14
2020年02月 (87讲)
2020年01月 (91讲)
时长 00:00
2019年12月 (93讲)
2019年11月 (89讲)
2019年10月 (92讲)
2019年09月 (90讲)
时长 00:00
2019年08月 (91讲)
2019年07月 (92讲)
时长 03:45
2019年06月 (90讲)
2019年05月 (99讲)
2019年04月 (114讲)
2019年03月 (122讲)
2019年02月 (102讲)
2019年01月 (104讲)
2018年12月 (98讲)
2018年11月 (105讲)
时长 01:23
2018年10月 (123讲)
时长 02:06
2018年09月 (119讲)
2018年08月 (123讲)
2018年07月 (124讲)
2018年06月 (119讲)
时长 02:11
2018年05月 (124讲)
时长 03:16
2018年04月 (120讲)
2018年03月 (124讲)
2018年02月 (112讲)
2018年01月 (124讲)
时长 02:30
时长 02:34
2017年12月 (124讲)
时长 03:09
2017年11月 (120讲)
2017年10月 (86讲)
时长 03:18
时长 03:31
时长 04:25
极客视点
15
15
1.0x
00:00/05:15
登录|注册

一文了解ZooKeeper设计原理

讲述:初明明大小:4.81M时长:05:15
来源:架构之美
你好,欢迎收听极客视点。
为了减轻分布式应用程序所承担的协调任务, ZooKeeper 应运而生,它常被用于分布式协调、元数据管理、实现高可用、分布式锁等场景中。近日,奈学教育创始人兼 CEO 孙玄在其个人公众号“架构之美”发文,对 ZooKeeper 的设计原理进行了详细分析,以帮助开发者更好地理解与学习 ZooKeeper 。以下为重点内容。

ZooKeeper 集群架构与读写机制

在 ZooKeeper 集群中,服务器角色分为领导者(leader)和学习者(learner),后者又分为观察者(observer)和跟随者(follower),具体功能如下:
领导者:为客户端提供读写功能,负责投票的发起和决议。集群中只有领导者才能接受写服务。
跟随者:为客户端提供读服务,如果是写服务则转发给领导者。跟随者在选举过程中进行投票。
观察者:为客户端提供读服务,如果是写服务就转发给领导者。观察者不参与领导者的选举投票,也不参与写的过半原则机制。
此外,还有一个独立于 Zookeeper 集群的角色:客户端(client),是连接 Zookeeper 集群的使用者、请求的发起者。一个 ZooKeeper 集群可能会有多个客户端,客户端能任意连接其中一台 ZooKeeper 节点,并读取数据,但所有的客户端都只能向领导者节点去写数据,
在 ZooKeeper 的选举中,如果过半的节点都选一个节点作为领导者,那么这个节点就会是领导者节点。正因如此,在 ZooKeeper 集群中,只要有过半的节点是存活的,那么这个 ZooKeeper 就可以正常提供服务。所以在搭建 ZooKeeper 集群时,通常会使用奇数台,这样做比较节约机器。比如安装一个 6 台的 ZooKeeper 集群,如果其中 3 台宕机,就会导致集群不可用。以这样的情况来看,安装 6 台和安装 5 台的效果是一样的,所以安装 5 台比较合适。

Zookeeper 特点

一致性:客户端无论连接到集群中的哪个节点,读到的数据都是一样的。
实时性:ZooKeeper 保证客户端在一定的时间间隔内获得结果,包括成功和失败。但由于网络延迟原因,ZooKeeper 不能保证两台客户端同时得到刚更新的消息。如果都需要最新的消息,就需要调用 sync() 接口。
原子性:领导者在同步数据时会保证事务性,要么都成功,要么都失败。
顺序性:一台服务器上如果消息 a 在消息 b 前发布,那么所有服务器上的消息 a 都是在消息 b 前发布的。

Zookeeper 如何保证数据一致性

在 ZooKeeper 的诸多特点中,你可能最好奇的是,Zookeeper 的数据一致性。ZooKeeper 通过 ZAB 协议来进行 ZooKeeper 集群间的数据同步,保证数据的一致性。
ZooKeeper 写数据的机制是客户端把写请求发送给领导者节点,领导者节点再将数据通过 Proposal 请求发送给所有节点(包括自己)。所有节点接收数据后都会写到本地磁盘上,之后发送 ACK 请求给领导者。领导者只要接收到过半节点的请求,就会发送 commit 消息给各个节点。各个节点再把消息放入内存(以保证高性能),该消息就会用户可见了。
这时,如果 ZooKeeper 想保证数据一致性,就需要考虑如下两种情况。情况一:领导者执行了 commit,还没来得及给跟随者发送 commit 时,领导者宕机了,那该如何保证消息一致性?情况二:客户端把消息写到领导者节点了,但领导者还没发送 Proposal 消息给其他节点就宕机了。在领导者恢复期间,此消息又该如何处理?

1. ZAB 的崩溃恢复机制

针对情况一,当领导者宕机后,ZooKeeper 会选举出新的领导者节点,新的领导者节点启动后,会到磁盘上检查是否存在没有进行 commit 的消息,如果存在,就继续检查其他跟随者有没有对这条消息进行 commit,如果有过半节点对这条消息进行了 ACK,但没有 commit,那么新的领导者就要完成 commit 的操作。

2. ZAB 恢复中删除数据机制

针对情况二,客户端将消息写到领导者节点了,但领导者还没发送 Proposal 消息就宕机了。这时对于用户来说,这条消息是写失败的。假设一段时间后,领导者节点恢复了,而这时它的角色就变成了跟随者。它在检查自己磁盘时会发现自己有一条消息没有进行 commit,这时,它会检测消息的编号。因为每条消息都有编号,由高 32 位和低 32 位组成,高 32 位是用来体现是否发生过领导者切换的,低 32 位用来展示消息顺序。当上述跟随者检测消息编号时,它会根据高 32 位知道目前领导者已经切换过了,所以就把当前的消息删除,然后与新领导者同步数据,这样就保证了数据的一致性。
以上就是今天的内容,希望对你理解 ZooKeeper 有所帮助。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 小斧
    领导者:为客户端提供读写功能,负责投票的发起和决议。集群中只有领导者才能接受写服务。 跟随者:为客户端提供读服务,如果是写服务则转发给领导者。跟随者在选举过程中进行投票。 观察者:为客户端提供读服务,如果是写服务就转发给领导者。观察者不参与领导者的选举投票,也不参与写的过半原则机制。
    2
    4
  • Jialin
    服务节点在两阶段提交过程中为什么要先写磁盘后写内存呢,随机写磁盘不是性能不好吗
    3
    1
  • J.Smile
    果然很精炼!
    1
  • simple_孙
    所有情况一是不是存在丢数据的情况,已经给客户端返回成功了,但是新的领导者节点发现还没有过半提交,这条数据就会丢失了。
  • 妥协
    领导者proposal请求时,既然是过半写机制,那怎么能保证一致性,就是客户端无论连接到集群中哪个节点,读到的数据都是一样的? 节点写数据写磁盘,是只是写到page cache,还是fsync到磁盘呢?如果是前者,也是存在丢数据可能的,崩溃恢复时领导者切换,怎么commit之前未完成commit的消息;如果是后者,性能是不是太差了?
  • 又双叒叕是一年啊
    不错
  • 秦时灬明月
    很好
收起评论
大纲
固定大纲
ZooKeeper 集群架构与读写机制
Zookeeper 特点
Zookeeper 如何保证数据一致性
1. ZAB 的崩溃恢复机制
2. ZAB 恢复中删除数据机制
显示
设置
留言
7
收藏
99+
沉浸
阅读
分享
手机端
快捷键
回顶部