欢迎光临
我们一直在努力

ZooKeeper分布式一致性协议详解:ZAB协议与其他共识算法

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的对比
特性ZABRaft
提出时间 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 不同点

维度ZABRaft
领导者选举 基于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协议是一个专为原子广播设计的共识协议,具有以下特点:

  • 两阶段模式:消息广播 + 崩溃恢复
  • 全局有序:通过ZXID保证事务顺序
  • 过半机制:容忍少数节点故障
  • 高性能:适合读多写少场景
  • 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🌺点点关注,收藏不迷路🌺

    赞(0)
    未经允许不得转载:171主机测评 » ZooKeeper分布式一致性协议详解:ZAB协议与其他共识算法
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址