ZooKeeper分布式一致性协议详解:ZAB协议与其他共识算法
-
- 一、ZooKeeper的ZAB协议
-
- 1.1 ZAB协议概述
- 1.2 ZAB协议的核心特性
- 1.3 ZXID:全局有序的事务ID
- 1.4 ZAB协议的两种模式
-
- 模式1:消息广播模式
- 模式2:崩溃恢复模式
- 二、常见的分布式一致性协议
-
- 2.1 Paxos协议
-
- 核心角色
- Basic Paxos流程
- 2.2 Raft协议
-
- Raft的三个核心子问题
- Raft角色状态转换
- Raft与ZAB的对比
- 2.3 Gossip协议
-
- Gossip传播方式
- 2.4 2PC/3PC协议
-
- 2PC流程
- 三、主流一致性协议对比
-
- 3.1 协议特性对比表
- 3.2 容错能力对比
- 3.3 应用场景对比
- 四、ZAB与Raft的深度对比
-
- 4.1 相同点
- 4.2 不同点
- 4.3 ZXID vs Raft Term + Index
- 五、协议选择指南
-
- 5.1 根据需求选择协议
- 5.2 系统选型参考
- 六、总结
-
- 6.1 ZooKeeper的ZAB协议
- 6.2 一致性协议发展脉络
- 6.3 一句话总结
|
🌺The Begin🌺点点关注,收藏不迷路🌺 |
摘要:分布式一致性协议是保证分布式系统数据一致性的核心机制。ZooKeeper采用了自己设计的ZAB(ZooKeeper Atomic Broadcast)协议。本文将深入剖析ZAB协议的设计原理,并与Paxos、Raft、Gossip等其他常见一致性协议进行对比,帮助读者全面理解分布式一致性领域的核心技术。
一、ZooKeeper的ZAB协议
1.1 ZAB协议概述
ZooKeeper采用的分布式一致性协议是ZAB(ZooKeeper Atomic Broadcast,原子广播)协议。这是一个为ZooKeeper专门设计的支持崩溃恢复的原子广播协议。
#mermaid-svg-T1zrL8FpWqrtx11O{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-T1zrL8FpWqrtx11O .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-T1zrL8FpWqrtx11O .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-T1zrL8FpWqrtx11O .error-icon{fill:#552222;}#mermaid-svg-T1zrL8FpWqrtx11O .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-T1zrL8FpWqrtx11O .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-T1zrL8FpWqrtx11O .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-T1zrL8FpWqrtx11O .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-T1zrL8FpWqrtx11O .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-T1zrL8FpWqrtx11O .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-T1zrL8FpWqrtx11O .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-T1zrL8FpWqrtx11O .marker{fill:#333333;stroke:#333333;}#mermaid-svg-T1zrL8FpWqrtx11O .marker.cross{stroke:#333333;}#mermaid-svg-T1zrL8FpWqrtx11O svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-T1zrL8FpWqrtx11O p{margin:0;}#mermaid-svg-T1zrL8FpWqrtx11O .edge{stroke-width:3;}#mermaid-svg-T1zrL8FpWqrtx11O .section–1 rect,#mermaid-svg-T1zrL8FpWqrtx11O .section–1 path,#mermaid-svg-T1zrL8FpWqrtx11O .section–1 circle,#mermaid-svg-T1zrL8FpWqrtx11O .section–1 polygon,#mermaid-svg-T1zrL8FpWqrtx11O .section–1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .section–1 text{fill:#ffffff;}#mermaid-svg-T1zrL8FpWqrtx11O .node-icon–1{font-size:40px;color:#ffffff;}#mermaid-svg-T1zrL8FpWqrtx11O .section-edge–1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .edge-depth–1{stroke-width:17;}#mermaid-svg-T1zrL8FpWqrtx11O .section–1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled,#mermaid-svg-T1zrL8FpWqrtx11O .disabled circle,#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:lightgray;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:#efefef;}#mermaid-svg-T1zrL8FpWqrtx11O .section-0 rect,#mermaid-svg-T1zrL8FpWqrtx11O .section-0 path,#mermaid-svg-T1zrL8FpWqrtx11O .section-0 circle,#mermaid-svg-T1zrL8FpWqrtx11O .section-0 polygon,#mermaid-svg-T1zrL8FpWqrtx11O .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-T1zrL8FpWqrtx11O .section-0 text{fill:black;}#mermaid-svg-T1zrL8FpWqrtx11O .node-icon-0{font-size:40px;color:black;}#mermaid-svg-T1zrL8FpWqrtx11O .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-T1zrL8FpWqrtx11O .edge-depth-0{stroke-width:14;}#mermaid-svg-T1zrL8FpWqrtx11O .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled,#mermaid-svg-T1zrL8FpWqrtx11O .disabled circle,#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:lightgray;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:#efefef;}#mermaid-svg-T1zrL8FpWqrtx11O .section-1 rect,#mermaid-svg-T1zrL8FpWqrtx11O .section-1 path,#mermaid-svg-T1zrL8FpWqrtx11O .section-1 circle,#mermaid-svg-T1zrL8FpWqrtx11O .section-1 polygon,#mermaid-svg-T1zrL8FpWqrtx11O .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .section-1 text{fill:black;}#mermaid-svg-T1zrL8FpWqrtx11O .node-icon-1{font-size:40px;color:black;}#mermaid-svg-T1zrL8FpWqrtx11O .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .edge-depth-1{stroke-width:11;}#mermaid-svg-T1zrL8FpWqrtx11O .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled,#mermaid-svg-T1zrL8FpWqrtx11O .disabled circle,#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:lightgray;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:#efefef;}#mermaid-svg-T1zrL8FpWqrtx11O .section-2 rect,#mermaid-svg-T1zrL8FpWqrtx11O .section-2 path,#mermaid-svg-T1zrL8FpWqrtx11O .section-2 circle,#mermaid-svg-T1zrL8FpWqrtx11O .section-2 polygon,#mermaid-svg-T1zrL8FpWqrtx11O .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .section-2 text{fill:#ffffff;}#mermaid-svg-T1zrL8FpWqrtx11O .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-T1zrL8FpWqrtx11O .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .edge-depth-2{stroke-width:8;}#mermaid-svg-T1zrL8FpWqrtx11O .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled,#mermaid-svg-T1zrL8FpWqrtx11O .disabled circle,#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:lightgray;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:#efefef;}#mermaid-svg-T1zrL8FpWqrtx11O .section-3 rect,#mermaid-svg-T1zrL8FpWqrtx11O .section-3 path,#mermaid-svg-T1zrL8FpWqrtx11O .section-3 circle,#mermaid-svg-T1zrL8FpWqrtx11O .section-3 polygon,#mermaid-svg-T1zrL8FpWqrtx11O .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .section-3 text{fill:black;}#mermaid-svg-T1zrL8FpWqrtx11O .node-icon-3{font-size:40px;color:black;}#mermaid-svg-T1zrL8FpWqrtx11O .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .edge-depth-3{stroke-width:5;}#mermaid-svg-T1zrL8FpWqrtx11O .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled,#mermaid-svg-T1zrL8FpWqrtx11O .disabled circle,#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:lightgray;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:#efefef;}#mermaid-svg-T1zrL8FpWqrtx11O .section-4 rect,#mermaid-svg-T1zrL8FpWqrtx11O .section-4 path,#mermaid-svg-T1zrL8FpWqrtx11O .section-4 circle,#mermaid-svg-T1zrL8FpWqrtx11O .section-4 polygon,#mermaid-svg-T1zrL8FpWqrtx11O .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .section-4 text{fill:black;}#mermaid-svg-T1zrL8FpWqrtx11O .node-icon-4{font-size:40px;color:black;}#mermaid-svg-T1zrL8FpWqrtx11O .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .edge-depth-4{stroke-width:2;}#mermaid-svg-T1zrL8FpWqrtx11O .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled,#mermaid-svg-T1zrL8FpWqrtx11O .disabled circle,#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:lightgray;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:#efefef;}#mermaid-svg-T1zrL8FpWqrtx11O .section-5 rect,#mermaid-svg-T1zrL8FpWqrtx11O .section-5 path,#mermaid-svg-T1zrL8FpWqrtx11O .section-5 circle,#mermaid-svg-T1zrL8FpWqrtx11O .section-5 polygon,#mermaid-svg-T1zrL8FpWqrtx11O .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .section-5 text{fill:black;}#mermaid-svg-T1zrL8FpWqrtx11O .node-icon-5{font-size:40px;color:black;}#mermaid-svg-T1zrL8FpWqrtx11O .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .edge-depth-5{stroke-width:-1;}#mermaid-svg-T1zrL8FpWqrtx11O .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled,#mermaid-svg-T1zrL8FpWqrtx11O .disabled circle,#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:lightgray;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:#efefef;}#mermaid-svg-T1zrL8FpWqrtx11O .section-6 rect,#mermaid-svg-T1zrL8FpWqrtx11O .section-6 path,#mermaid-svg-T1zrL8FpWqrtx11O .section-6 circle,#mermaid-svg-T1zrL8FpWqrtx11O .section-6 polygon,#mermaid-svg-T1zrL8FpWqrtx11O .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .section-6 text{fill:black;}#mermaid-svg-T1zrL8FpWqrtx11O .node-icon-6{font-size:40px;color:black;}#mermaid-svg-T1zrL8FpWqrtx11O .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .edge-depth-6{stroke-width:-4;}#mermaid-svg-T1zrL8FpWqrtx11O .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled,#mermaid-svg-T1zrL8FpWqrtx11O .disabled circle,#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:lightgray;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:#efefef;}#mermaid-svg-T1zrL8FpWqrtx11O .section-7 rect,#mermaid-svg-T1zrL8FpWqrtx11O .section-7 path,#mermaid-svg-T1zrL8FpWqrtx11O .section-7 circle,#mermaid-svg-T1zrL8FpWqrtx11O .section-7 polygon,#mermaid-svg-T1zrL8FpWqrtx11O .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .section-7 text{fill:black;}#mermaid-svg-T1zrL8FpWqrtx11O .node-icon-7{font-size:40px;color:black;}#mermaid-svg-T1zrL8FpWqrtx11O .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .edge-depth-7{stroke-width:-7;}#mermaid-svg-T1zrL8FpWqrtx11O .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled,#mermaid-svg-T1zrL8FpWqrtx11O .disabled circle,#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:lightgray;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:#efefef;}#mermaid-svg-T1zrL8FpWqrtx11O .section-8 rect,#mermaid-svg-T1zrL8FpWqrtx11O .section-8 path,#mermaid-svg-T1zrL8FpWqrtx11O .section-8 circle,#mermaid-svg-T1zrL8FpWqrtx11O .section-8 polygon,#mermaid-svg-T1zrL8FpWqrtx11O .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .section-8 text{fill:black;}#mermaid-svg-T1zrL8FpWqrtx11O .node-icon-8{font-size:40px;color:black;}#mermaid-svg-T1zrL8FpWqrtx11O .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .edge-depth-8{stroke-width:-10;}#mermaid-svg-T1zrL8FpWqrtx11O .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled,#mermaid-svg-T1zrL8FpWqrtx11O .disabled circle,#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:lightgray;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:#efefef;}#mermaid-svg-T1zrL8FpWqrtx11O .section-9 rect,#mermaid-svg-T1zrL8FpWqrtx11O .section-9 path,#mermaid-svg-T1zrL8FpWqrtx11O .section-9 circle,#mermaid-svg-T1zrL8FpWqrtx11O .section-9 polygon,#mermaid-svg-T1zrL8FpWqrtx11O .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .section-9 text{fill:black;}#mermaid-svg-T1zrL8FpWqrtx11O .node-icon-9{font-size:40px;color:black;}#mermaid-svg-T1zrL8FpWqrtx11O .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .edge-depth-9{stroke-width:-13;}#mermaid-svg-T1zrL8FpWqrtx11O .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled,#mermaid-svg-T1zrL8FpWqrtx11O .disabled circle,#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:lightgray;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:#efefef;}#mermaid-svg-T1zrL8FpWqrtx11O .section-10 rect,#mermaid-svg-T1zrL8FpWqrtx11O .section-10 path,#mermaid-svg-T1zrL8FpWqrtx11O .section-10 circle,#mermaid-svg-T1zrL8FpWqrtx11O .section-10 polygon,#mermaid-svg-T1zrL8FpWqrtx11O .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .section-10 text{fill:black;}#mermaid-svg-T1zrL8FpWqrtx11O .node-icon-10{font-size:40px;color:black;}#mermaid-svg-T1zrL8FpWqrtx11O .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .edge-depth-10{stroke-width:-16;}#mermaid-svg-T1zrL8FpWqrtx11O .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled,#mermaid-svg-T1zrL8FpWqrtx11O .disabled circle,#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:lightgray;}#mermaid-svg-T1zrL8FpWqrtx11O .disabled text{fill:#efefef;}#mermaid-svg-T1zrL8FpWqrtx11O .section-root rect,#mermaid-svg-T1zrL8FpWqrtx11O .section-root path,#mermaid-svg-T1zrL8FpWqrtx11O .section-root circle,#mermaid-svg-T1zrL8FpWqrtx11O .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-T1zrL8FpWqrtx11O .section-root text{fill:#ffffff;}#mermaid-svg-T1zrL8FpWqrtx11O .section-root span{color:#ffffff;}#mermaid-svg-T1zrL8FpWqrtx11O .section-2 span{color:#ffffff;}#mermaid-svg-T1zrL8FpWqrtx11O .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-T1zrL8FpWqrtx11O .edge{fill:none;}#mermaid-svg-T1zrL8FpWqrtx11O .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-T1zrL8FpWqrtx11O :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
ZAB协议
消息广播模式
写请求转发
事务提案生成
过半确认机制
提交通知
崩溃恢复模式
Leader选举
数据同步
状态对齐
1.2 ZAB协议的核心特性
| 原子性 | 所有事务要么全部成功,要么全部失败 | 保证数据完整性 |
| 顺序性 | 事务按ZXID全局有序执行 | 保证操作顺序 |
| 可恢复性 | Leader故障后能自动恢复 | 保证服务可用性 |
| 一致性 | 所有节点最终看到相同数据 | 保证数据一致 |
1.3 ZXID:全局有序的事务ID
ZAB协议通过ZXID保证事务的全局顺序:
// ZXID结构:64位
public class Zxid {
private long epoch; // 高32位:Leader纪元
private long counter; // 低32位:事务计数器
// 示例:0x100000001
// epoch = 1, counter = 1
}
1.4 ZAB协议的两种模式
模式1:消息广播模式
Follower3
Follower2
Follower1
Leader
客户端
Follower3
Follower2
Follower1
Leader
客户端
#mermaid-svg-32SvN5J7mUm9x8JN{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-32SvN5J7mUm9x8JN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-32SvN5J7mUm9x8JN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-32SvN5J7mUm9x8JN .error-icon{fill:#552222;}#mermaid-svg-32SvN5J7mUm9x8JN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-32SvN5J7mUm9x8JN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-32SvN5J7mUm9x8JN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-32SvN5J7mUm9x8JN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-32SvN5J7mUm9x8JN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-32SvN5J7mUm9x8JN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-32SvN5J7mUm9x8JN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-32SvN5J7mUm9x8JN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-32SvN5J7mUm9x8JN .marker.cross{stroke:#333333;}#mermaid-svg-32SvN5J7mUm9x8JN svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-32SvN5J7mUm9x8JN p{margin:0;}#mermaid-svg-32SvN5J7mUm9x8JN .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-32SvN5J7mUm9x8JN text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-32SvN5J7mUm9x8JN .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-32SvN5J7mUm9x8JN .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-32SvN5J7mUm9x8JN .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-32SvN5J7mUm9x8JN .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-32SvN5J7mUm9x8JN #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-32SvN5J7mUm9x8JN .sequenceNumber{fill:white;}#mermaid-svg-32SvN5J7mUm9x8JN #sequencenumber{fill:#333;}#mermaid-svg-32SvN5J7mUm9x8JN #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-32SvN5J7mUm9x8JN .messageText{fill:#333;stroke:none;}#mermaid-svg-32SvN5J7mUm9x8JN .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-32SvN5J7mUm9x8JN .labelText,#mermaid-svg-32SvN5J7mUm9x8JN .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-32SvN5J7mUm9x8JN .loopText,#mermaid-svg-32SvN5J7mUm9x8JN .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-32SvN5J7mUm9x8JN .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-32SvN5J7mUm9x8JN .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-32SvN5J7mUm9x8JN .noteText,#mermaid-svg-32SvN5J7mUm9x8JN .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-32SvN5J7mUm9x8JN .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-32SvN5J7mUm9x8JN .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-32SvN5J7mUm9x8JN .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-32SvN5J7mUm9x8JN .actorPopupMenu{position:absolute;}#mermaid-svg-32SvN5J7mUm9x8JN .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-32SvN5J7mUm9x8JN .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-32SvN5J7mUm9x8JN .actor-man circle,#mermaid-svg-32SvN5J7mUm9x8JN line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-32SvN5J7mUm9x8JN :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
收到过半ACK
写请求
生成Proposal
分配ZXID
PROPOSAL
PROPOSAL
PROPOSAL
ACK
ACK
COMMIT
COMMIT
COMMIT
成功
模式2:崩溃恢复模式
#mermaid-svg-GROFSUXR3W0bGpdY{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GROFSUXR3W0bGpdY .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GROFSUXR3W0bGpdY .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GROFSUXR3W0bGpdY .error-icon{fill:#552222;}#mermaid-svg-GROFSUXR3W0bGpdY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GROFSUXR3W0bGpdY .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GROFSUXR3W0bGpdY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GROFSUXR3W0bGpdY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GROFSUXR3W0bGpdY .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GROFSUXR3W0bGpdY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GROFSUXR3W0bGpdY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GROFSUXR3W0bGpdY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GROFSUXR3W0bGpdY .marker.cross{stroke:#333333;}#mermaid-svg-GROFSUXR3W0bGpdY svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GROFSUXR3W0bGpdY p{margin:0;}#mermaid-svg-GROFSUXR3W0bGpdY .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-GROFSUXR3W0bGpdY .cluster-label text{fill:#333;}#mermaid-svg-GROFSUXR3W0bGpdY .cluster-label span{color:#333;}#mermaid-svg-GROFSUXR3W0bGpdY .cluster-label span p{background-color:transparent;}#mermaid-svg-GROFSUXR3W0bGpdY .label text,#mermaid-svg-GROFSUXR3W0bGpdY span{fill:#333;color:#333;}#mermaid-svg-GROFSUXR3W0bGpdY .node rect,#mermaid-svg-GROFSUXR3W0bGpdY .node circle,#mermaid-svg-GROFSUXR3W0bGpdY .node ellipse,#mermaid-svg-GROFSUXR3W0bGpdY .node polygon,#mermaid-svg-GROFSUXR3W0bGpdY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GROFSUXR3W0bGpdY .rough-node .label text,#mermaid-svg-GROFSUXR3W0bGpdY .node .label text,#mermaid-svg-GROFSUXR3W0bGpdY .image-shape .label,#mermaid-svg-GROFSUXR3W0bGpdY .icon-shape .label{text-anchor:middle;}#mermaid-svg-GROFSUXR3W0bGpdY .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GROFSUXR3W0bGpdY .rough-node .label,#mermaid-svg-GROFSUXR3W0bGpdY .node .label,#mermaid-svg-GROFSUXR3W0bGpdY .image-shape .label,#mermaid-svg-GROFSUXR3W0bGpdY .icon-shape .label{text-align:center;}#mermaid-svg-GROFSUXR3W0bGpdY .node.clickable{cursor:pointer;}#mermaid-svg-GROFSUXR3W0bGpdY .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GROFSUXR3W0bGpdY .arrowheadPath{fill:#333333;}#mermaid-svg-GROFSUXR3W0bGpdY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GROFSUXR3W0bGpdY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GROFSUXR3W0bGpdY .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GROFSUXR3W0bGpdY .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GROFSUXR3W0bGpdY .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GROFSUXR3W0bGpdY .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GROFSUXR3W0bGpdY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GROFSUXR3W0bGpdY .cluster text{fill:#333;}#mermaid-svg-GROFSUXR3W0bGpdY .cluster span{color:#333;}#mermaid-svg-GROFSUXR3W0bGpdY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GROFSUXR3W0bGpdY .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GROFSUXR3W0bGpdY rect.text{fill:none;stroke-width:0;}#mermaid-svg-GROFSUXR3W0bGpdY .icon-shape,#mermaid-svg-GROFSUXR3W0bGpdY .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GROFSUXR3W0bGpdY .icon-shape p,#mermaid-svg-GROFSUXR3W0bGpdY .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GROFSUXR3W0bGpdY .icon-shape rect,#mermaid-svg-GROFSUXR3W0bGpdY .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GROFSUXR3W0bGpdY .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GROFSUXR3W0bGpdY .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GROFSUXR3W0bGpdY :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
ZXID最大
ZXID较小
DIFF
SNAP
TRUNC
Leader故障
进入LOOKING状态
发起Leader选举
比较ZXID
成为新Leader
成为Follower
收集Follower的lastZxid
决定同步方式
增量同步
全量同步
回滚多余事务
集群恢复服务
二、常见的分布式一致性协议
2.1 Paxos协议
Paxos是分布式一致性协议的鼻祖,由Leslie Lamport于1990年提出。
核心角色
| Proposer(提议者) | 提出提案 |
| Acceptor(接受者) | 投票决定是否接受提案 |
| Learner(学习者) | 学习已确定的提案 |
Basic Paxos流程
Acceptor3
Acceptor2
Acceptor1
Proposer2
Proposer1
Acceptor3
Acceptor2
Acceptor1
Proposer2
Proposer1
#mermaid-svg-fOsjsm7tLMLRMM9g{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fOsjsm7tLMLRMM9g .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fOsjsm7tLMLRMM9g .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fOsjsm7tLMLRMM9g .error-icon{fill:#552222;}#mermaid-svg-fOsjsm7tLMLRMM9g .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fOsjsm7tLMLRMM9g .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fOsjsm7tLMLRMM9g .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fOsjsm7tLMLRMM9g .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fOsjsm7tLMLRMM9g .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fOsjsm7tLMLRMM9g .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fOsjsm7tLMLRMM9g .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fOsjsm7tLMLRMM9g .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fOsjsm7tLMLRMM9g .marker.cross{stroke:#333333;}#mermaid-svg-fOsjsm7tLMLRMM9g svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fOsjsm7tLMLRMM9g p{margin:0;}#mermaid-svg-fOsjsm7tLMLRMM9g .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-fOsjsm7tLMLRMM9g text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-fOsjsm7tLMLRMM9g .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-fOsjsm7tLMLRMM9g .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-fOsjsm7tLMLRMM9g .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-fOsjsm7tLMLRMM9g .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-fOsjsm7tLMLRMM9g #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-fOsjsm7tLMLRMM9g .sequenceNumber{fill:white;}#mermaid-svg-fOsjsm7tLMLRMM9g #sequencenumber{fill:#333;}#mermaid-svg-fOsjsm7tLMLRMM9g #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-fOsjsm7tLMLRMM9g .messageText{fill:#333;stroke:none;}#mermaid-svg-fOsjsm7tLMLRMM9g .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-fOsjsm7tLMLRMM9g .labelText,#mermaid-svg-fOsjsm7tLMLRMM9g .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-fOsjsm7tLMLRMM9g .loopText,#mermaid-svg-fOsjsm7tLMLRMM9g .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-fOsjsm7tLMLRMM9g .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-fOsjsm7tLMLRMM9g .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-fOsjsm7tLMLRMM9g .noteText,#mermaid-svg-fOsjsm7tLMLRMM9g .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-fOsjsm7tLMLRMM9g .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-fOsjsm7tLMLRMM9g .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-fOsjsm7tLMLRMM9g .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-fOsjsm7tLMLRMM9g .actorPopupMenu{position:absolute;}#mermaid-svg-fOsjsm7tLMLRMM9g .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-fOsjsm7tLMLRMM9g .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-fOsjsm7tLMLRMM9g .actor-man circle,#mermaid-svg-fOsjsm7tLMLRMM9g line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-fOsjsm7tLMLRMM9g :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
阶段1: Prepare
阶段2: Accept
Prepare(1)
Prepare(1)
Prepare(1)
Promise(无)
Promise(无)
Promise(无)
Accept(1, value)
Accept(1, value)
Accept(1, value)
Accepted
Accepted
Accepted
Paxos的缺点:
- 理解难度大:被称为"难于理解的协议"
- 实现复杂:工程实现困难
- 活锁问题:多个Proposer可能互相阻塞
2.2 Raft协议
Raft是为了解决Paxos难以理解的问题而设计的,将共识问题分解为三个相对独立的子问题。
Raft的三个核心子问题
#mermaid-svg-9OXPinA3l46Zl4KB{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9OXPinA3l46Zl4KB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9OXPinA3l46Zl4KB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9OXPinA3l46Zl4KB .error-icon{fill:#552222;}#mermaid-svg-9OXPinA3l46Zl4KB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9OXPinA3l46Zl4KB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9OXPinA3l46Zl4KB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9OXPinA3l46Zl4KB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9OXPinA3l46Zl4KB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9OXPinA3l46Zl4KB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9OXPinA3l46Zl4KB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9OXPinA3l46Zl4KB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9OXPinA3l46Zl4KB .marker.cross{stroke:#333333;}#mermaid-svg-9OXPinA3l46Zl4KB svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9OXPinA3l46Zl4KB p{margin:0;}#mermaid-svg-9OXPinA3l46Zl4KB .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-9OXPinA3l46Zl4KB .cluster-label text{fill:#333;}#mermaid-svg-9OXPinA3l46Zl4KB .cluster-label span{color:#333;}#mermaid-svg-9OXPinA3l46Zl4KB .cluster-label span p{background-color:transparent;}#mermaid-svg-9OXPinA3l46Zl4KB .label text,#mermaid-svg-9OXPinA3l46Zl4KB span{fill:#333;color:#333;}#mermaid-svg-9OXPinA3l46Zl4KB .node rect,#mermaid-svg-9OXPinA3l46Zl4KB .node circle,#mermaid-svg-9OXPinA3l46Zl4KB .node ellipse,#mermaid-svg-9OXPinA3l46Zl4KB .node polygon,#mermaid-svg-9OXPinA3l46Zl4KB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9OXPinA3l46Zl4KB .rough-node .label text,#mermaid-svg-9OXPinA3l46Zl4KB .node .label text,#mermaid-svg-9OXPinA3l46Zl4KB .image-shape .label,#mermaid-svg-9OXPinA3l46Zl4KB .icon-shape .label{text-anchor:middle;}#mermaid-svg-9OXPinA3l46Zl4KB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9OXPinA3l46Zl4KB .rough-node .label,#mermaid-svg-9OXPinA3l46Zl4KB .node .label,#mermaid-svg-9OXPinA3l46Zl4KB .image-shape .label,#mermaid-svg-9OXPinA3l46Zl4KB .icon-shape .label{text-align:center;}#mermaid-svg-9OXPinA3l46Zl4KB .node.clickable{cursor:pointer;}#mermaid-svg-9OXPinA3l46Zl4KB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9OXPinA3l46Zl4KB .arrowheadPath{fill:#333333;}#mermaid-svg-9OXPinA3l46Zl4KB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9OXPinA3l46Zl4KB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9OXPinA3l46Zl4KB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9OXPinA3l46Zl4KB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9OXPinA3l46Zl4KB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9OXPinA3l46Zl4KB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9OXPinA3l46Zl4KB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9OXPinA3l46Zl4KB .cluster text{fill:#333;}#mermaid-svg-9OXPinA3l46Zl4KB .cluster span{color:#333;}#mermaid-svg-9OXPinA3l46Zl4KB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9OXPinA3l46Zl4KB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9OXPinA3l46Zl4KB rect.text{fill:none;stroke-width:0;}#mermaid-svg-9OXPinA3l46Zl4KB .icon-shape,#mermaid-svg-9OXPinA3l46Zl4KB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9OXPinA3l46Zl4KB .icon-shape p,#mermaid-svg-9OXPinA3l46Zl4KB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9OXPinA3l46Zl4KB .icon-shape rect,#mermaid-svg-9OXPinA3l46Zl4KB .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9OXPinA3l46Zl4KB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9OXPinA3l46Zl4KB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9OXPinA3l46Zl4KB :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
Raft协议分解
领导者选举
共识
日志复制
安全性
Raft角色状态转换
#mermaid-svg-4hvcZN91Tt26YHvJ{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4hvcZN91Tt26YHvJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4hvcZN91Tt26YHvJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4hvcZN91Tt26YHvJ .error-icon{fill:#552222;}#mermaid-svg-4hvcZN91Tt26YHvJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4hvcZN91Tt26YHvJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4hvcZN91Tt26YHvJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4hvcZN91Tt26YHvJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4hvcZN91Tt26YHvJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4hvcZN91Tt26YHvJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4hvcZN91Tt26YHvJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4hvcZN91Tt26YHvJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4hvcZN91Tt26YHvJ .marker.cross{stroke:#333333;}#mermaid-svg-4hvcZN91Tt26YHvJ svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4hvcZN91Tt26YHvJ p{margin:0;}#mermaid-svg-4hvcZN91Tt26YHvJ defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-4hvcZN91Tt26YHvJ g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-4hvcZN91Tt26YHvJ g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-4hvcZN91Tt26YHvJ g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-4hvcZN91Tt26YHvJ g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-4hvcZN91Tt26YHvJ g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-4hvcZN91Tt26YHvJ .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-4hvcZN91Tt26YHvJ .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-4hvcZN91Tt26YHvJ .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-4hvcZN91Tt26YHvJ .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-4hvcZN91Tt26YHvJ .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-4hvcZN91Tt26YHvJ .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-4hvcZN91Tt26YHvJ .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-4hvcZN91Tt26YHvJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4hvcZN91Tt26YHvJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4hvcZN91Tt26YHvJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4hvcZN91Tt26YHvJ .edgeLabel .label text{fill:#333;}#mermaid-svg-4hvcZN91Tt26YHvJ .label div .edgeLabel{color:#333;}#mermaid-svg-4hvcZN91Tt26YHvJ .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-4hvcZN91Tt26YHvJ .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-4hvcZN91Tt26YHvJ .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-4hvcZN91Tt26YHvJ .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-4hvcZN91Tt26YHvJ .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-4hvcZN91Tt26YHvJ .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4hvcZN91Tt26YHvJ .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4hvcZN91Tt26YHvJ #statediagram-barbEnd{fill:#333333;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4hvcZN91Tt26YHvJ .cluster-label,#mermaid-svg-4hvcZN91Tt26YHvJ .nodeLabel{color:#131300;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-4hvcZN91Tt26YHvJ .note-edge{stroke-dasharray:5;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram-note text{fill:black;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram-note .nodeLabel{color:black;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagram .edgeLabel{color:red;}#mermaid-svg-4hvcZN91Tt26YHvJ #dependencyStart,#mermaid-svg-4hvcZN91Tt26YHvJ #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-4hvcZN91Tt26YHvJ .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4hvcZN91Tt26YHvJ :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
选举超时
获得多数票
发现更高任期Leader
发现更高任期
Follower
Candidate
Leader
Raft与ZAB的对比
| 提出时间 | 2007年 | 2013年 |
| 设计目标 | ZooKeeper专用 | 通用共识算法 |
| 领导者选举 | 基于ZXID和myid | 基于任期和日志索引 |
| 日志复制 | 两阶段提交变种 | Leader Append-Only |
| 成员变更 | 支持 | 支持(联合共识) |
2.3 Gossip协议
Gossip是一种最终一致性协议,不是强一致性协议,主要用于服务发现和元数据传播。
Gossip传播方式
#mermaid-svg-CwTKK1KSXy4usX2s{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-CwTKK1KSXy4usX2s .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-CwTKK1KSXy4usX2s .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-CwTKK1KSXy4usX2s .error-icon{fill:#552222;}#mermaid-svg-CwTKK1KSXy4usX2s .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-CwTKK1KSXy4usX2s .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-CwTKK1KSXy4usX2s .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-CwTKK1KSXy4usX2s .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-CwTKK1KSXy4usX2s .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-CwTKK1KSXy4usX2s .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-CwTKK1KSXy4usX2s .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-CwTKK1KSXy4usX2s .marker{fill:#333333;stroke:#333333;}#mermaid-svg-CwTKK1KSXy4usX2s .marker.cross{stroke:#333333;}#mermaid-svg-CwTKK1KSXy4usX2s svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-CwTKK1KSXy4usX2s p{margin:0;}#mermaid-svg-CwTKK1KSXy4usX2s .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-CwTKK1KSXy4usX2s .cluster-label text{fill:#333;}#mermaid-svg-CwTKK1KSXy4usX2s .cluster-label span{color:#333;}#mermaid-svg-CwTKK1KSXy4usX2s .cluster-label span p{background-color:transparent;}#mermaid-svg-CwTKK1KSXy4usX2s .label text,#mermaid-svg-CwTKK1KSXy4usX2s span{fill:#333;color:#333;}#mermaid-svg-CwTKK1KSXy4usX2s .node rect,#mermaid-svg-CwTKK1KSXy4usX2s .node circle,#mermaid-svg-CwTKK1KSXy4usX2s .node ellipse,#mermaid-svg-CwTKK1KSXy4usX2s .node polygon,#mermaid-svg-CwTKK1KSXy4usX2s .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-CwTKK1KSXy4usX2s .rough-node .label text,#mermaid-svg-CwTKK1KSXy4usX2s .node .label text,#mermaid-svg-CwTKK1KSXy4usX2s .image-shape .label,#mermaid-svg-CwTKK1KSXy4usX2s .icon-shape .label{text-anchor:middle;}#mermaid-svg-CwTKK1KSXy4usX2s .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-CwTKK1KSXy4usX2s .rough-node .label,#mermaid-svg-CwTKK1KSXy4usX2s .node .label,#mermaid-svg-CwTKK1KSXy4usX2s .image-shape .label,#mermaid-svg-CwTKK1KSXy4usX2s .icon-shape .label{text-align:center;}#mermaid-svg-CwTKK1KSXy4usX2s .node.clickable{cursor:pointer;}#mermaid-svg-CwTKK1KSXy4usX2s .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-CwTKK1KSXy4usX2s .arrowheadPath{fill:#333333;}#mermaid-svg-CwTKK1KSXy4usX2s .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-CwTKK1KSXy4usX2s .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-CwTKK1KSXy4usX2s .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CwTKK1KSXy4usX2s .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-CwTKK1KSXy4usX2s .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CwTKK1KSXy4usX2s .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-CwTKK1KSXy4usX2s .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-CwTKK1KSXy4usX2s .cluster text{fill:#333;}#mermaid-svg-CwTKK1KSXy4usX2s .cluster span{color:#333;}#mermaid-svg-CwTKK1KSXy4usX2s div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-CwTKK1KSXy4usX2s .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-CwTKK1KSXy4usX2s rect.text{fill:none;stroke-width:0;}#mermaid-svg-CwTKK1KSXy4usX2s .icon-shape,#mermaid-svg-CwTKK1KSXy4usX2s .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-CwTKK1KSXy4usX2s .icon-shape p,#mermaid-svg-CwTKK1KSXy4usX2s .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-CwTKK1KSXy4usX2s .icon-shape rect,#mermaid-svg-CwTKK1KSXy4usX2s .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-CwTKK1KSXy4usX2s .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-CwTKK1KSXy4usX2s .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-CwTKK1KSXy4usX2s :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
随机选择
随机选择
随机选择
随机选择
随机选择
随机选择
节点A
节点B
节点C
节点D
节点E
节点F
节点G
Gossip的应用场景:
- Cassandra:节点状态传播
- Redis Cluster:集群元数据同步
- Consul:服务发现
2.4 2PC/3PC协议
两阶段提交和三阶段提交是传统的分布式事务协议。
2PC流程
参与者2
参与者1
协调者
参与者2
参与者1
协调者
#mermaid-svg-JZDJ3OHi9DoN2iuN{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-JZDJ3OHi9DoN2iuN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-JZDJ3OHi9DoN2iuN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-JZDJ3OHi9DoN2iuN .error-icon{fill:#552222;}#mermaid-svg-JZDJ3OHi9DoN2iuN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-JZDJ3OHi9DoN2iuN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-JZDJ3OHi9DoN2iuN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-JZDJ3OHi9DoN2iuN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-JZDJ3OHi9DoN2iuN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-JZDJ3OHi9DoN2iuN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-JZDJ3OHi9DoN2iuN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-JZDJ3OHi9DoN2iuN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-JZDJ3OHi9DoN2iuN .marker.cross{stroke:#333333;}#mermaid-svg-JZDJ3OHi9DoN2iuN svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-JZDJ3OHi9DoN2iuN p{margin:0;}#mermaid-svg-JZDJ3OHi9DoN2iuN .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-JZDJ3OHi9DoN2iuN text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-JZDJ3OHi9DoN2iuN .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-JZDJ3OHi9DoN2iuN .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-JZDJ3OHi9DoN2iuN .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-JZDJ3OHi9DoN2iuN .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-JZDJ3OHi9DoN2iuN #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-JZDJ3OHi9DoN2iuN .sequenceNumber{fill:white;}#mermaid-svg-JZDJ3OHi9DoN2iuN #sequencenumber{fill:#333;}#mermaid-svg-JZDJ3OHi9DoN2iuN #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-JZDJ3OHi9DoN2iuN .messageText{fill:#333;stroke:none;}#mermaid-svg-JZDJ3OHi9DoN2iuN .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-JZDJ3OHi9DoN2iuN .labelText,#mermaid-svg-JZDJ3OHi9DoN2iuN .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-JZDJ3OHi9DoN2iuN .loopText,#mermaid-svg-JZDJ3OHi9DoN2iuN .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-JZDJ3OHi9DoN2iuN .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-JZDJ3OHi9DoN2iuN .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-JZDJ3OHi9DoN2iuN .noteText,#mermaid-svg-JZDJ3OHi9DoN2iuN .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-JZDJ3OHi9DoN2iuN .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-JZDJ3OHi9DoN2iuN .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-JZDJ3OHi9DoN2iuN .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-JZDJ3OHi9DoN2iuN .actorPopupMenu{position:absolute;}#mermaid-svg-JZDJ3OHi9DoN2iuN .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-JZDJ3OHi9DoN2iuN .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-JZDJ3OHi9DoN2iuN .actor-man circle,#mermaid-svg-JZDJ3OHi9DoN2iuN line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-JZDJ3OHi9DoN2iuN :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
阶段1: 准备
阶段2: 提交
准备请求
准备请求
就绪
就绪
提交
提交
完成
完成
2PC的缺点:
- 同步阻塞:参与者等待协调者指令
- 单点问题:协调者故障导致集群不可用
- 脑裂风险:网络分区时可能不一致
三、主流一致性协议对比
3.1 协议特性对比表
| ZAB | 强一致性 | 单一Leader | 高 | 半数节点 | ZooKeeper |
| Paxos | 强一致性 | 多Proposer | 中 | 半数节点 | Chubby |
| Raft | 强一致性 | 单一Leader | 高 | 半数节点 | etcd, Consul |
| Gossip | 最终一致性 | 无 | 极高 | 任意 | Cassandra |
| 2PC | 强一致性 | 协调者 | 低 | 无 | 数据库事务 |
3.2 容错能力对比
#mermaid-svg-reo37pIv8GUuDIMg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-reo37pIv8GUuDIMg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-reo37pIv8GUuDIMg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-reo37pIv8GUuDIMg .error-icon{fill:#552222;}#mermaid-svg-reo37pIv8GUuDIMg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-reo37pIv8GUuDIMg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-reo37pIv8GUuDIMg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-reo37pIv8GUuDIMg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-reo37pIv8GUuDIMg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-reo37pIv8GUuDIMg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-reo37pIv8GUuDIMg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-reo37pIv8GUuDIMg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-reo37pIv8GUuDIMg .marker.cross{stroke:#333333;}#mermaid-svg-reo37pIv8GUuDIMg svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-reo37pIv8GUuDIMg p{margin:0;}#mermaid-svg-reo37pIv8GUuDIMg .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-reo37pIv8GUuDIMg .cluster-label text{fill:#333;}#mermaid-svg-reo37pIv8GUuDIMg .cluster-label span{color:#333;}#mermaid-svg-reo37pIv8GUuDIMg .cluster-label span p{background-color:transparent;}#mermaid-svg-reo37pIv8GUuDIMg .label text,#mermaid-svg-reo37pIv8GUuDIMg span{fill:#333;color:#333;}#mermaid-svg-reo37pIv8GUuDIMg .node rect,#mermaid-svg-reo37pIv8GUuDIMg .node circle,#mermaid-svg-reo37pIv8GUuDIMg .node ellipse,#mermaid-svg-reo37pIv8GUuDIMg .node polygon,#mermaid-svg-reo37pIv8GUuDIMg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-reo37pIv8GUuDIMg .rough-node .label text,#mermaid-svg-reo37pIv8GUuDIMg .node .label text,#mermaid-svg-reo37pIv8GUuDIMg .image-shape .label,#mermaid-svg-reo37pIv8GUuDIMg .icon-shape .label{text-anchor:middle;}#mermaid-svg-reo37pIv8GUuDIMg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-reo37pIv8GUuDIMg .rough-node .label,#mermaid-svg-reo37pIv8GUuDIMg .node .label,#mermaid-svg-reo37pIv8GUuDIMg .image-shape .label,#mermaid-svg-reo37pIv8GUuDIMg .icon-shape .label{text-align:center;}#mermaid-svg-reo37pIv8GUuDIMg .node.clickable{cursor:pointer;}#mermaid-svg-reo37pIv8GUuDIMg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-reo37pIv8GUuDIMg .arrowheadPath{fill:#333333;}#mermaid-svg-reo37pIv8GUuDIMg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-reo37pIv8GUuDIMg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-reo37pIv8GUuDIMg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-reo37pIv8GUuDIMg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-reo37pIv8GUuDIMg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-reo37pIv8GUuDIMg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-reo37pIv8GUuDIMg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-reo37pIv8GUuDIMg .cluster text{fill:#333;}#mermaid-svg-reo37pIv8GUuDIMg .cluster span{color:#333;}#mermaid-svg-reo37pIv8GUuDIMg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-reo37pIv8GUuDIMg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-reo37pIv8GUuDIMg rect.text{fill:none;stroke-width:0;}#mermaid-svg-reo37pIv8GUuDIMg .icon-shape,#mermaid-svg-reo37pIv8GUuDIMg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-reo37pIv8GUuDIMg .icon-shape p,#mermaid-svg-reo37pIv8GUuDIMg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-reo37pIv8GUuDIMg .icon-shape rect,#mermaid-svg-reo37pIv8GUuDIMg .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-reo37pIv8GUuDIMg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-reo37pIv8GUuDIMg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-reo37pIv8GUuDIMg :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
协议实现
容错能力
半数机制
多数派
多数派
任意数量
3节点集群
容忍1节点故障
5节点集群
容忍2节点故障
ZAB
Raft
Paxos
Gossip
任意节点故障不影响
3.3 应用场景对比
| ZooKeeper | ZAB | 专为协调服务设计,支持Watch机制 |
| etcd | Raft | 简单易懂,实现清晰 |
| Consul | Raft + Gossip | Raft保证强一致,Gossip用于服务发现 |
| Cassandra | Gossip | 追求高可用和最终一致性 |
| Google Chubby | Paxos | 最早的大规模Paxos实现 |
四、ZAB与Raft的深度对比
由于ZAB和Raft都是目前广泛应用的领导者为中心的共识协议,下面详细对比两者的异同。
4.1 相同点
#mermaid-svg-ahKc3bWpMEtYw2XB{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ahKc3bWpMEtYw2XB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ahKc3bWpMEtYw2XB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ahKc3bWpMEtYw2XB .error-icon{fill:#552222;}#mermaid-svg-ahKc3bWpMEtYw2XB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ahKc3bWpMEtYw2XB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ahKc3bWpMEtYw2XB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ahKc3bWpMEtYw2XB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ahKc3bWpMEtYw2XB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ahKc3bWpMEtYw2XB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ahKc3bWpMEtYw2XB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ahKc3bWpMEtYw2XB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ahKc3bWpMEtYw2XB .marker.cross{stroke:#333333;}#mermaid-svg-ahKc3bWpMEtYw2XB svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ahKc3bWpMEtYw2XB p{margin:0;}#mermaid-svg-ahKc3bWpMEtYw2XB .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-ahKc3bWpMEtYw2XB .cluster-label text{fill:#333;}#mermaid-svg-ahKc3bWpMEtYw2XB .cluster-label span{color:#333;}#mermaid-svg-ahKc3bWpMEtYw2XB .cluster-label span p{background-color:transparent;}#mermaid-svg-ahKc3bWpMEtYw2XB .label text,#mermaid-svg-ahKc3bWpMEtYw2XB span{fill:#333;color:#333;}#mermaid-svg-ahKc3bWpMEtYw2XB .node rect,#mermaid-svg-ahKc3bWpMEtYw2XB .node circle,#mermaid-svg-ahKc3bWpMEtYw2XB .node ellipse,#mermaid-svg-ahKc3bWpMEtYw2XB .node polygon,#mermaid-svg-ahKc3bWpMEtYw2XB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ahKc3bWpMEtYw2XB .rough-node .label text,#mermaid-svg-ahKc3bWpMEtYw2XB .node .label text,#mermaid-svg-ahKc3bWpMEtYw2XB .image-shape .label,#mermaid-svg-ahKc3bWpMEtYw2XB .icon-shape .label{text-anchor:middle;}#mermaid-svg-ahKc3bWpMEtYw2XB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ahKc3bWpMEtYw2XB .rough-node .label,#mermaid-svg-ahKc3bWpMEtYw2XB .node .label,#mermaid-svg-ahKc3bWpMEtYw2XB .image-shape .label,#mermaid-svg-ahKc3bWpMEtYw2XB .icon-shape .label{text-align:center;}#mermaid-svg-ahKc3bWpMEtYw2XB .node.clickable{cursor:pointer;}#mermaid-svg-ahKc3bWpMEtYw2XB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ahKc3bWpMEtYw2XB .arrowheadPath{fill:#333333;}#mermaid-svg-ahKc3bWpMEtYw2XB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ahKc3bWpMEtYw2XB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ahKc3bWpMEtYw2XB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ahKc3bWpMEtYw2XB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ahKc3bWpMEtYw2XB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ahKc3bWpMEtYw2XB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ahKc3bWpMEtYw2XB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ahKc3bWpMEtYw2XB .cluster text{fill:#333;}#mermaid-svg-ahKc3bWpMEtYw2XB .cluster span{color:#333;}#mermaid-svg-ahKc3bWpMEtYw2XB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ahKc3bWpMEtYw2XB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ahKc3bWpMEtYw2XB rect.text{fill:none;stroke-width:0;}#mermaid-svg-ahKc3bWpMEtYw2XB .icon-shape,#mermaid-svg-ahKc3bWpMEtYw2XB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ahKc3bWpMEtYw2XB .icon-shape p,#mermaid-svg-ahKc3bWpMEtYw2XB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ahKc3bWpMEtYw2XB .icon-shape rect,#mermaid-svg-ahKc3bWpMEtYw2XB .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ahKc3bWpMEtYw2XB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ahKc3bWpMEtYw2XB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ahKc3bWpMEtYw2XB :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
ZAB与Raft的共同特性
单一Leader
写请求由Leader处理
多数派确认
需要过半节点确认
日志复制
所有变更记录在日志
顺序保证
全局有序的事务
4.2 不同点
| 领导者选举 | 基于ZXID和myid | 基于任期和日志索引 |
| 日志结构 | ZXID包含epoch和counter | 任期+日志索引 |
| 心跳机制 | 基于ACK响应 | 定期AppendEntries RPC |
| 成员变更 | 支持动态变更 | 支持联合共识 |
| 设计目标 | 原子广播 | 共识算法 |
4.3 ZXID vs Raft Term + Index
// ZAB的ZXID
public class ZAB_Zxid {
long epoch; // 高32位:Leader纪元
long counter; // 低32位:事务计数器
}
// Raft的Term + Index
public class Raft_LogEntry {
long term; // 领导者任期
long index; // 日志索引
byte[] data; // 事务数据
}
五、协议选择指南
5.1 根据需求选择协议
| 强一致性+高性能 | ZAB / Raft | 领导者模型,效率高 |
| 高可用+最终一致 | Gossip | 无中心,可用性极高 |
| 数据强一致+易实现 | Raft | 理解简单,工程实现多 |
| 已有ZooKeeper生态 | ZAB | 与ZooKeeper无缝集成 |
| 分布式事务 | 2PC/3PC | 传统数据库事务 |
5.2 系统选型参考
#mermaid-svg-BfyD4icu3bOqYiXH{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-BfyD4icu3bOqYiXH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-BfyD4icu3bOqYiXH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-BfyD4icu3bOqYiXH .error-icon{fill:#552222;}#mermaid-svg-BfyD4icu3bOqYiXH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-BfyD4icu3bOqYiXH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-BfyD4icu3bOqYiXH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-BfyD4icu3bOqYiXH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-BfyD4icu3bOqYiXH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-BfyD4icu3bOqYiXH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-BfyD4icu3bOqYiXH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-BfyD4icu3bOqYiXH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-BfyD4icu3bOqYiXH .marker.cross{stroke:#333333;}#mermaid-svg-BfyD4icu3bOqYiXH svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-BfyD4icu3bOqYiXH p{margin:0;}#mermaid-svg-BfyD4icu3bOqYiXH .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-BfyD4icu3bOqYiXH .cluster-label text{fill:#333;}#mermaid-svg-BfyD4icu3bOqYiXH .cluster-label span{color:#333;}#mermaid-svg-BfyD4icu3bOqYiXH .cluster-label span p{background-color:transparent;}#mermaid-svg-BfyD4icu3bOqYiXH .label text,#mermaid-svg-BfyD4icu3bOqYiXH span{fill:#333;color:#333;}#mermaid-svg-BfyD4icu3bOqYiXH .node rect,#mermaid-svg-BfyD4icu3bOqYiXH .node circle,#mermaid-svg-BfyD4icu3bOqYiXH .node ellipse,#mermaid-svg-BfyD4icu3bOqYiXH .node polygon,#mermaid-svg-BfyD4icu3bOqYiXH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-BfyD4icu3bOqYiXH .rough-node .label text,#mermaid-svg-BfyD4icu3bOqYiXH .node .label text,#mermaid-svg-BfyD4icu3bOqYiXH .image-shape .label,#mermaid-svg-BfyD4icu3bOqYiXH .icon-shape .label{text-anchor:middle;}#mermaid-svg-BfyD4icu3bOqYiXH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-BfyD4icu3bOqYiXH .rough-node .label,#mermaid-svg-BfyD4icu3bOqYiXH .node .label,#mermaid-svg-BfyD4icu3bOqYiXH .image-shape .label,#mermaid-svg-BfyD4icu3bOqYiXH .icon-shape .label{text-align:center;}#mermaid-svg-BfyD4icu3bOqYiXH .node.clickable{cursor:pointer;}#mermaid-svg-BfyD4icu3bOqYiXH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-BfyD4icu3bOqYiXH .arrowheadPath{fill:#333333;}#mermaid-svg-BfyD4icu3bOqYiXH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-BfyD4icu3bOqYiXH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-BfyD4icu3bOqYiXH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BfyD4icu3bOqYiXH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-BfyD4icu3bOqYiXH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BfyD4icu3bOqYiXH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-BfyD4icu3bOqYiXH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-BfyD4icu3bOqYiXH .cluster text{fill:#333;}#mermaid-svg-BfyD4icu3bOqYiXH .cluster span{color:#333;}#mermaid-svg-BfyD4icu3bOqYiXH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-BfyD4icu3bOqYiXH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-BfyD4icu3bOqYiXH rect.text{fill:none;stroke-width:0;}#mermaid-svg-BfyD4icu3bOqYiXH .icon-shape,#mermaid-svg-BfyD4icu3bOqYiXH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-BfyD4icu3bOqYiXH .icon-shape p,#mermaid-svg-BfyD4icu3bOqYiXH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-BfyD4icu3bOqYiXH .icon-shape rect,#mermaid-svg-BfyD4icu3bOqYiXH .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-BfyD4icu3bOqYiXH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-BfyD4icu3bOqYiXH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-BfyD4icu3bOqYiXH :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
是
否
是
否
是
否
开始选择
需要强一致性?
领导者模型?
Gossip协议Cassandra/Redis Cluster
需要简单实现?
Paxos实现复杂但理论完备
Raftetcd/Consul
ZABZooKeeper
六、总结
6.1 ZooKeeper的ZAB协议
ZooKeeper采用的ZAB协议是一个专为原子广播设计的共识协议,具有以下特点:
6.2 一致性协议发展脉络
#mermaid-svg-PWMcPASvr0UEnxZt{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PWMcPASvr0UEnxZt .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PWMcPASvr0UEnxZt .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PWMcPASvr0UEnxZt .error-icon{fill:#552222;}#mermaid-svg-PWMcPASvr0UEnxZt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PWMcPASvr0UEnxZt .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PWMcPASvr0UEnxZt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PWMcPASvr0UEnxZt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PWMcPASvr0UEnxZt .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PWMcPASvr0UEnxZt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PWMcPASvr0UEnxZt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PWMcPASvr0UEnxZt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PWMcPASvr0UEnxZt .marker.cross{stroke:#333333;}#mermaid-svg-PWMcPASvr0UEnxZt svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PWMcPASvr0UEnxZt p{margin:0;}#mermaid-svg-PWMcPASvr0UEnxZt .edge{stroke-width:3;}#mermaid-svg-PWMcPASvr0UEnxZt .section–1 rect,#mermaid-svg-PWMcPASvr0UEnxZt .section–1 path,#mermaid-svg-PWMcPASvr0UEnxZt .section–1 circle,#mermaid-svg-PWMcPASvr0UEnxZt .section–1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .section–1 text{fill:#ffffff;}#mermaid-svg-PWMcPASvr0UEnxZt .node-icon–1{font-size:40px;color:#ffffff;}#mermaid-svg-PWMcPASvr0UEnxZt .section-edge–1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .edge-depth–1{stroke-width:17;}#mermaid-svg-PWMcPASvr0UEnxZt .section–1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PWMcPASvr0UEnxZt .lineWrapper line{stroke:#ffffff;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled,#mermaid-svg-PWMcPASvr0UEnxZt .disabled circle,#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:lightgray;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:#efefef;}#mermaid-svg-PWMcPASvr0UEnxZt .section-0 rect,#mermaid-svg-PWMcPASvr0UEnxZt .section-0 path,#mermaid-svg-PWMcPASvr0UEnxZt .section-0 circle,#mermaid-svg-PWMcPASvr0UEnxZt .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-PWMcPASvr0UEnxZt .section-0 text{fill:black;}#mermaid-svg-PWMcPASvr0UEnxZt .node-icon-0{font-size:40px;color:black;}#mermaid-svg-PWMcPASvr0UEnxZt .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-PWMcPASvr0UEnxZt .edge-depth-0{stroke-width:14;}#mermaid-svg-PWMcPASvr0UEnxZt .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-PWMcPASvr0UEnxZt .lineWrapper line{stroke:black;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled,#mermaid-svg-PWMcPASvr0UEnxZt .disabled circle,#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:lightgray;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:#efefef;}#mermaid-svg-PWMcPASvr0UEnxZt .section-1 rect,#mermaid-svg-PWMcPASvr0UEnxZt .section-1 path,#mermaid-svg-PWMcPASvr0UEnxZt .section-1 circle,#mermaid-svg-PWMcPASvr0UEnxZt .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .section-1 text{fill:black;}#mermaid-svg-PWMcPASvr0UEnxZt .node-icon-1{font-size:40px;color:black;}#mermaid-svg-PWMcPASvr0UEnxZt .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .edge-depth-1{stroke-width:11;}#mermaid-svg-PWMcPASvr0UEnxZt .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PWMcPASvr0UEnxZt .lineWrapper line{stroke:black;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled,#mermaid-svg-PWMcPASvr0UEnxZt .disabled circle,#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:lightgray;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:#efefef;}#mermaid-svg-PWMcPASvr0UEnxZt .section-2 rect,#mermaid-svg-PWMcPASvr0UEnxZt .section-2 path,#mermaid-svg-PWMcPASvr0UEnxZt .section-2 circle,#mermaid-svg-PWMcPASvr0UEnxZt .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .section-2 text{fill:#ffffff;}#mermaid-svg-PWMcPASvr0UEnxZt .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-PWMcPASvr0UEnxZt .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .edge-depth-2{stroke-width:8;}#mermaid-svg-PWMcPASvr0UEnxZt .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PWMcPASvr0UEnxZt .lineWrapper line{stroke:#ffffff;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled,#mermaid-svg-PWMcPASvr0UEnxZt .disabled circle,#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:lightgray;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:#efefef;}#mermaid-svg-PWMcPASvr0UEnxZt .section-3 rect,#mermaid-svg-PWMcPASvr0UEnxZt .section-3 path,#mermaid-svg-PWMcPASvr0UEnxZt .section-3 circle,#mermaid-svg-PWMcPASvr0UEnxZt .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .section-3 text{fill:black;}#mermaid-svg-PWMcPASvr0UEnxZt .node-icon-3{font-size:40px;color:black;}#mermaid-svg-PWMcPASvr0UEnxZt .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .edge-depth-3{stroke-width:5;}#mermaid-svg-PWMcPASvr0UEnxZt .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PWMcPASvr0UEnxZt .lineWrapper line{stroke:black;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled,#mermaid-svg-PWMcPASvr0UEnxZt .disabled circle,#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:lightgray;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:#efefef;}#mermaid-svg-PWMcPASvr0UEnxZt .section-4 rect,#mermaid-svg-PWMcPASvr0UEnxZt .section-4 path,#mermaid-svg-PWMcPASvr0UEnxZt .section-4 circle,#mermaid-svg-PWMcPASvr0UEnxZt .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .section-4 text{fill:black;}#mermaid-svg-PWMcPASvr0UEnxZt .node-icon-4{font-size:40px;color:black;}#mermaid-svg-PWMcPASvr0UEnxZt .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .edge-depth-4{stroke-width:2;}#mermaid-svg-PWMcPASvr0UEnxZt .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PWMcPASvr0UEnxZt .lineWrapper line{stroke:black;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled,#mermaid-svg-PWMcPASvr0UEnxZt .disabled circle,#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:lightgray;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:#efefef;}#mermaid-svg-PWMcPASvr0UEnxZt .section-5 rect,#mermaid-svg-PWMcPASvr0UEnxZt .section-5 path,#mermaid-svg-PWMcPASvr0UEnxZt .section-5 circle,#mermaid-svg-PWMcPASvr0UEnxZt .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .section-5 text{fill:black;}#mermaid-svg-PWMcPASvr0UEnxZt .node-icon-5{font-size:40px;color:black;}#mermaid-svg-PWMcPASvr0UEnxZt .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .edge-depth-5{stroke-width:-1;}#mermaid-svg-PWMcPASvr0UEnxZt .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PWMcPASvr0UEnxZt .lineWrapper line{stroke:black;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled,#mermaid-svg-PWMcPASvr0UEnxZt .disabled circle,#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:lightgray;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:#efefef;}#mermaid-svg-PWMcPASvr0UEnxZt .section-6 rect,#mermaid-svg-PWMcPASvr0UEnxZt .section-6 path,#mermaid-svg-PWMcPASvr0UEnxZt .section-6 circle,#mermaid-svg-PWMcPASvr0UEnxZt .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .section-6 text{fill:black;}#mermaid-svg-PWMcPASvr0UEnxZt .node-icon-6{font-size:40px;color:black;}#mermaid-svg-PWMcPASvr0UEnxZt .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .edge-depth-6{stroke-width:-4;}#mermaid-svg-PWMcPASvr0UEnxZt .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PWMcPASvr0UEnxZt .lineWrapper line{stroke:black;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled,#mermaid-svg-PWMcPASvr0UEnxZt .disabled circle,#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:lightgray;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:#efefef;}#mermaid-svg-PWMcPASvr0UEnxZt .section-7 rect,#mermaid-svg-PWMcPASvr0UEnxZt .section-7 path,#mermaid-svg-PWMcPASvr0UEnxZt .section-7 circle,#mermaid-svg-PWMcPASvr0UEnxZt .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .section-7 text{fill:black;}#mermaid-svg-PWMcPASvr0UEnxZt .node-icon-7{font-size:40px;color:black;}#mermaid-svg-PWMcPASvr0UEnxZt .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .edge-depth-7{stroke-width:-7;}#mermaid-svg-PWMcPASvr0UEnxZt .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PWMcPASvr0UEnxZt .lineWrapper line{stroke:black;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled,#mermaid-svg-PWMcPASvr0UEnxZt .disabled circle,#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:lightgray;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:#efefef;}#mermaid-svg-PWMcPASvr0UEnxZt .section-8 rect,#mermaid-svg-PWMcPASvr0UEnxZt .section-8 path,#mermaid-svg-PWMcPASvr0UEnxZt .section-8 circle,#mermaid-svg-PWMcPASvr0UEnxZt .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .section-8 text{fill:black;}#mermaid-svg-PWMcPASvr0UEnxZt .node-icon-8{font-size:40px;color:black;}#mermaid-svg-PWMcPASvr0UEnxZt .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .edge-depth-8{stroke-width:-10;}#mermaid-svg-PWMcPASvr0UEnxZt .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PWMcPASvr0UEnxZt .lineWrapper line{stroke:black;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled,#mermaid-svg-PWMcPASvr0UEnxZt .disabled circle,#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:lightgray;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:#efefef;}#mermaid-svg-PWMcPASvr0UEnxZt .section-9 rect,#mermaid-svg-PWMcPASvr0UEnxZt .section-9 path,#mermaid-svg-PWMcPASvr0UEnxZt .section-9 circle,#mermaid-svg-PWMcPASvr0UEnxZt .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .section-9 text{fill:black;}#mermaid-svg-PWMcPASvr0UEnxZt .node-icon-9{font-size:40px;color:black;}#mermaid-svg-PWMcPASvr0UEnxZt .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .edge-depth-9{stroke-width:-13;}#mermaid-svg-PWMcPASvr0UEnxZt .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PWMcPASvr0UEnxZt .lineWrapper line{stroke:black;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled,#mermaid-svg-PWMcPASvr0UEnxZt .disabled circle,#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:lightgray;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:#efefef;}#mermaid-svg-PWMcPASvr0UEnxZt .section-10 rect,#mermaid-svg-PWMcPASvr0UEnxZt .section-10 path,#mermaid-svg-PWMcPASvr0UEnxZt .section-10 circle,#mermaid-svg-PWMcPASvr0UEnxZt .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .section-10 text{fill:black;}#mermaid-svg-PWMcPASvr0UEnxZt .node-icon-10{font-size:40px;color:black;}#mermaid-svg-PWMcPASvr0UEnxZt .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .edge-depth-10{stroke-width:-16;}#mermaid-svg-PWMcPASvr0UEnxZt .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-PWMcPASvr0UEnxZt .lineWrapper line{stroke:black;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled,#mermaid-svg-PWMcPASvr0UEnxZt .disabled circle,#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:lightgray;}#mermaid-svg-PWMcPASvr0UEnxZt .disabled text{fill:#efefef;}#mermaid-svg-PWMcPASvr0UEnxZt .section-root rect,#mermaid-svg-PWMcPASvr0UEnxZt .section-root path,#mermaid-svg-PWMcPASvr0UEnxZt .section-root circle{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-PWMcPASvr0UEnxZt .section-root text{fill:#ffffff;}#mermaid-svg-PWMcPASvr0UEnxZt .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-PWMcPASvr0UEnxZt .edge{fill:none;}#mermaid-svg-PWMcPASvr0UEnxZt .eventWrapper{filter:brightness(120%);}#mermaid-svg-PWMcPASvr0UEnxZt :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
1990
Paxos<br/>理论奠基
2007
ZAB<br/>ZooKeeper专用
2013
Raft<br/>易于理解
至今
混合协议<br/>Raft+Gossip等
分布式一致性协议演进
6.3 一句话总结
ZooKeeper通过ZAB协议实现了分布式环境下的强一致性,而同为共识协议家族的Paxos、Raft各有特点:Paxos理论完备但复杂,Raft简单易懂且实现广泛,Gossip则追求最终一致性和高可用性。选择合适的协议需要根据具体的业务场景和一致性需求来决定。

|
🌺The End🌺点点关注,收藏不迷路🌺 |




