资讯动态

小白必看!ZAB与Raft协议彻底搞懂(无论文黑话,附时序图)

发布时间:2026/9/14 20:14:31 来源:尧图企业网站定制
作为刚接触分布式的小白是不是每次看到“ZAB协议”“Raft协议”就头大一堆专业术语脑裂、日志复制、Leader选举看得云里雾里找了很多资料要么太晦涩要么全是论文原文根本看不懂今天这篇文章全程避开所有黑话用“大白话极简时序图”把ZAB和Raft协议的核心逻辑、实现流程讲得明明白白小白看完直接入门再也不用怕被问起这两个协议先给大家一个核心结论记下来看完文章回头看瞬间通透ZAB和Raft本质都是“让多台机器保持数据一致”的工具核心逻辑完全一样——选一个老大Leader老大统一发号施令小弟Follower跟着学过半小弟确认后操作才生效从根上避免出错。两者的区别就像“定制款衣服”和“通用款衣服”ZAB是给ZooKeeper量身定做的Raft是通用款谁都能用而且更容易看懂、更容易实现。前置必懂1个问题1个核心机制不懂这个后面全白看1. 为什么需要这两个协议分布式系统就是“多台机器一起干活”比如我们常用的ZooKeeper、etcd都是多台机器组成的集群。问题来了多台机器怎么保证大家的数据一样比如你在A机器上写了一条数据B机器和C机器怎么同步如果没有协议约束A写了“123”B写了“456”C没同步数据就乱了这就是分布式系统的“一致性问题”。ZAB和Raft就是解决这个问题的“规则”——让所有机器按同一个顺序、做同一个操作永远保持数据一致。2. 核心防错机制过半投票杜绝脑裂小白最容易懵的“脑裂”其实很简单网络断了集群被分成两部分每部分都以为自己是“唯一的集群”各自选老大各自写数据最后数据冲突系统崩溃。而ZAB和Raft都用了同一个“防脑裂神器”——过半投票。举个例子3台机器的集群必须至少2台过半认可才能选老大、才能确认操作如果网络断成1台和2台1台的那部分没有过半就不敢选老大、不敢写数据只能等着网络恢复这样就不会出现两个老大也就不会脑裂。记住不管是选老大还是写数据必须“过半确认”这是两个协议的底层逻辑也是最核心的知识点。先学最容易的Raft协议小白首选好懂易记Raft协议是斯坦福大学搞出来的设计初衷就是“让普通人能看懂、能实现”现在很多主流系统etcd、TiKV都在用它小白先学它再看ZAB会轻松很多。Raft的核心就是把“保持数据一致”拆成3件简单的事选老大、同步数据、老大挂了怎么办每一步都很直白。1. Raft的3个节点身份一眼分清Raft里的每台机器只有3种身份没有复杂逻辑Follower小弟最基础的身份不主动做事只听老大的话接收老大的指令同步数据Candidate竞选者小弟觉得老大挂了就主动站出来想当老大Leader老大唯一能接收客户端写请求的节点负责给小弟同步数据维持秩序。2. Raft选举流程像“竞选班长”超简单用一张纯文字时序图一步一步看比看论文简单10倍关键点总结记下来所有节点一开始都是小弟等老大的“心跳”老大每隔几十毫秒发一次信号说自己还活着谁先等超时150~300ms随机的避免大家同时竞选谁就变成竞选者竞选者给自己投一票然后向其他节点要投票拿到“过半”投票就当老大老大当选后持续发心跳告诉大家“我还在别竞选”。3. Raft写数据流程老大说了算小弟跟着学客户端要写数据只能找老大小弟不接收写请求流程同样用时序图看懂关键点总结客户端写数据只发给老大老大先把数据写到自己的“日志本”日志相当于记录所有操作防止丢数据老大把日志发给所有小弟小弟写完日志告诉老大“收到了”老大收到“过半”小弟的回复就确认“数据没问题”然后自己先生效数据再通知小弟也生效最后回复客户端“写成功”。4. 老大挂了怎么办自动恢复不用手动操作很简单老大挂了就没有心跳了小弟们会再次触发“超时竞选”重新选一个新老大新老大当选后会把自己的日志同步给所有小弟确保大家数据一致然后继续对外服务全程自动不用人管。再看ZAB协议ZooKeeper专属和Raft很像ZAB协议是专门给ZooKeeper设计的相当于“ZooKeeper的专属定制款”核心逻辑和Raft几乎一样只是一些细节不同小白不用怕跟着看就懂。ZAB没有像Raft那样把“身份”拆得那么细它的核心只有两个阶段崩溃恢复选老大同步数据、原子广播正常写数据。1. ZAB的核心标识ZXID选老大的“资历证明”ZAB选老大不搞Raft的“超时竞选”而是看一个“资历编号”——ZXID这个编号是全局唯一的格式很简单ZXID 高32位epoch年代号 低32位counter事务编号简单理解ZXID越大说明这台机器的数据越新、资历越老选老大的规则只有一条——谁的ZXID最大谁当老大。比如节点A的ZXID是0x100000005节点B的是0x100000003节点C的是0x100000004那节点A的ZXID最大直接当老大。2. ZAB选举流程比资历不比速度同样用时序图一眼看懂关键点总结集群启动或者老大挂了所有节点就进入“找老大”状态Looking每个节点都把自己的ZXID广播出去互相比较谁的ZXID最大谁就被过半节点认可直接当老大不用超时不用竞选投票只比“谁的数据最新”简单直接。3. ZAB写数据流程原子广播和Raft几乎一样ZAB写数据的流程和Raft逻辑完全一致只是消息名字不一样时序图看这里关键点总结和Raft的区别只是消息名字不同Raft用AppendEntriesZAB用PROPOSE→ACK→COMMIT核心逻辑完全一样老大统一接收请求复制给过半小弟确认后提交保证所有节点数据一致。4. ZAB崩溃恢复老大挂了怎么同步数据ZAB的崩溃恢复比Raft更精细一点核心是“让所有小弟和新老大的数据完全对齐”流程很简单新老大当选后先收集所有小弟的最新日志对比自己的日志分3种情况同步小弟日志少了给小弟补发缺失的日志DIFF同步小弟日志多了让小弟删除多余的日志TRUNC截断小弟和老大差距太大给小弟发全量数据SNAP快照同步所有节点数据完全一致后进入“原子广播”阶段正常对外服务。小白必背ZAB与Raft核心区别一张表分清看完上面的流程很多小白会问既然两者这么像到底区别在哪一张表总结不用记复杂的记关键几点就够了对比维度Raft协议通用款ZAB协议ZooKeeper专属设计目标易理解、易实现通用所有场景专为ZooKeeper设计追求高吞吐、快恢复选主依据随机超时过半投票谁先竞选谁易当选ZXID最大数据最新比资历不比赛速核心标识term任期号ZXIDepochcounter写请求消息AppendEntries一次广播PROPOSE→ACK→COMMIT三次交互适用场景etcd、TiKV等分布式存储/协调系统ZooKeeper分布式锁、配置管理小白总结看完这3句彻底入门ZAB和Raft核心都是“单Leader过半确认”目的是让多台机器数据一致杜绝脑裂Raft像“竞选制”简单好懂、通用小白先学它再看ZAB很轻松ZAB像“资历制”是ZooKeeper的专属协议选主看数据新旧写请求流程和Raft几乎一样。看到这里相信你已经彻底搞懂ZAB和Raft协议了如果还有不懂的地方评论区留言我会一一回复最后求个三连点赞收藏关注后续会持续更新分布式小白入门干货帮大家避开踩坑轻松入门

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价