Raft算法学习(1)博士论文大纲
参考资料
原文一共257页,其中前六章为算法重点介绍,第七章有点像A/B TEST
论文标题: 共识:连接理论与实践 (CONSENSUS: BRIDGING THEORY AND PRACTICE)
作者: Diego Ongaro
日期: 2014年8月
机构: 斯坦福大学 (哲学博士)
论文总体目标: 通过设计Raft——一个比现有替代方案(如Paxos)更易于理解和实践的共识算法,为学习共识和构建复制状态机创建一个更好的基础。
前置部分重点:
- 摘要 (Abstract):
- 指出了Paxos算法的难点。
- 提出了Raft算法,其设计目标是可理解性。
- Raft的核心:首先进行领导者选举,然后由领导者中心化地进行决策和日志复制。
- 领导者选举使用投票和随机化超时。数据从领导者流向其他服务器。
- 日志复制利用一个简单的不变性来减少状态空间。
- Raft具有实用性:解决了客户端交互、集群成员变更(一次一个服务器)和日志压缩等问题。
- 声称Raft在教学和实现方面优于Paxos,其论据包括用户研究、形式化规约/证明、良好的领导者选举性能以及与Multi-Paxos相当的性能。
- 前言 (Preface):
- 扩展了Ongaro和Ousterhout合著的论文 “In Search of an Understandable Consensus Algorithm” [89]。
- Raft网站 [92] 提供视频和可视化演示。
- 致谢 (Acknowledgments) (关键技术贡献者):
- David Mazières 和 Ezra Hoch:在早期Raft版本中发现bug。
- Hugues Evrard:在形式化规约中发现一个遗漏。
- 用户研究支持:Ali Ghodsi, David Mazières, Scott Klemmer, Nelson Ray。Paxos幻灯片改编自Lorenzo Alvisi。
- CoreOS (Blake Mizerany, Xiang Li, Yicheng Qin):影响了更简单的单服务器成员变更方案。
- Anirban Rahut (Splunk):指出了新服务器以空日志加入时的性能问题。
- Eddie Kohler, Maciej Smolen´ski:指出了提交规则下一个潜在的日志增长问题。
- Alexander Shraer:阐明了Zab中成员变更的工作方式。
第1章:引言 (Introduction)
- 问题背景: 现代数据中心系统是动态的,服务器/网络故障频繁。系统需要自动适应和容错。
- 共识的角色: 允许多台机器作为一个一致的整体工作,并在部分成员发生故障时仍能继续运行。是构建可靠大规模系统的基础。
- 现有解决方案的不足 (在撰写论文时):
- 许多系统存在单点故障或采用临时的、不安全的复制方案。
- Paxos是主流算法,但出了名地难以理解和实现。
- 其他算法 (Viewstamped Replication, Zab) 的设计并未将可理解性作为首要目标。
- Raft的目标:
- 可理解性 (首要目标): 让广大受众能够轻松学习并建立直观认识。
- 完整性与实用性: 为构建系统提供完整的基础,减少开发者的设计工作。
- 安全性: 在所有非拜占庭条件下都能正确运行。
- 可用性: 在典型操作条件下功能正常。
- 效率: 常见操作性能良好。
- Raft为提高可理解性采用的设计技术:
- 分解 (Decomposition): 将领导者选举、日志复制和安全性分开。
- 状态空间简化 (State Space Reduction): 减少不确定性 (例如,日志不允许有空洞) 并简化服务器交互。使用随机化定时器简化领导者选举。
- 本论文的主要贡献:
- Raft共识算法的设计、实现和评估 (源于可理解性关注点的新特性,例如更强的领导者角色)。
- 通过用户研究评估Raft的可理解性 (与Paxos对比)。
- Raft领导者选举机制的设计、实现和评估 (随机化定时器)。
- Raft集群成员变更机制的设计和实现 (一次一个服务器)。
- 对其他必要组件的深入讨论 (客户端交互、日志压缩)。
- Raft的安全性和形式化规约证明。
- LogCabin [86]: 作为本研究一部分开发的Raft开源实现。
第2章:动机 (Motivation)
- 2.1 通过复制状态机 (RSM) 实现容错:
- 共识算法用于构建RSM。
- 服务器计算状态的相同副本,并在部分服务器故障时仍能继续运行。
- 通常使用复制日志实现 (图2.1)。
- 共识模块保持日志一致。已提交的命令由确定性状态机应用。
- 实用共识算法的特性:
- 安全性 (在非拜占庭条件下)。
- 可用性 (如果多数服务器可操作且能够通信)。
- 安全性的时间无关性 (异步模型)。
- 效率 (常见情况:单轮RPC到多数节点)。
- 2.2 RSM的常见用例:
- 小型 (3-5台服务器) 共识组用于协调:组成员关系、配置管理、锁 (图2.2a)。
- 大型系统的领导者将其关键状态存储在RSM中以实现故障转移 (例如 GFS, HDFS, RAMCloud) (图2.2b)。
- 大规模存储系统将数据分区到多个RSM上,使用2PC进行跨分区操作 (例如 Megastore, Spanner, Scatter) (图2.3)。
- 2.3 Paxos的问题所在:
- Paxos (单提案Paxos和Multi-Paxos) 是最常被教授/使用的。
- 缺点1:异常难以理解。
- 完整解释晦涩难懂。简化解释仍然具有挑战性。
- 假设:晦涩源于以单提案子集为基础 (两个密集、微妙的阶段)。
- 缺点2:不是构建实用实现的良好基础。
- 对于Multi-Paxos没有广泛认可的算法。
- Lamport的描述多为草图;各种完善版本互不相同。
- Paxos架构不适合实用系统 (单提案分解复杂)。围绕日志进行顺序追加设计更简单。
- 对称的对等核心对于一系列决策不如基于领导者的方法直观。
- 结果: 实用系统通常与Paxos文献描述大相径庭 (例如 Chubby的引言 [15]: “最终系统将基于一个未经证明的协议”)。
第3章:Raft基础算法 (Basic Raft Algorithm)
- 3.1 为可理解性而设计: 重申分解和状态空间简化。
- 3.2 Raft概述:
- 图3.1:算法精简摘要。
- 图3.2:关键特性 (选举安全性、领导者只追加、日志匹配、领导者完整性、状态机安全性)。
- 分解:领导者选举、日志复制、安全性。
- 3.3 Raft基础:
- 服务器集群 (例如5台服务器容忍2台故障)。
- 服务器状态:Follower (跟随者), Candidate (候选人), Leader (领导者) (图3.3)。正常操作:1个领导者,其他为跟随者。
- 任期 (Terms):任意长度,连续编号。作为逻辑时钟 (图3.4)。以一次选举开始。
- 服务器交换当前任期号;任期号大的获胜。任期号过期的服务器转为跟随者。
- RPC (远程过程调用):
RequestVote
(请求投票):由候选人在选举期间发起。AppendEntries
(追加条目):由领导者为日志复制和心跳发起。
- 3.4 领导者选举 (Leader Election):
- 心跳机制触发选举。
- 跟随者如果在
election timeout
(选举超时) 内未收到有效RPC,则开始选举。 - 候选人:增加当前任期号,转换到候选人状态,为自己投票,并行发出
RequestVote
RPC。 - 候选人的结果:
- 赢得选举:获得多数服务器对同一任期的投票。成为领导者,发送心跳。(每台服务器在每个任期最多为一个候选人投票,先到先得,并有§3.6的日志最新性限制)。
- 其他服务器成为领导者:如果新领导者的任期 (在
AppendEntries
RPC中) ≥ 候选人当前任期,候选人转为跟随者。 - 无获胜者 (选票分裂):选举超时,候选人开始新一轮选举 (增加任期号)。
- 随机化选举超时 (Randomized Election Timeouts): (例如150-300ms) 用于确保选票分裂罕见且能快速解决。分散服务器。
- 3.5 日志复制 (Log Replication):
- 领导者将客户端命令追加到其日志,发出
AppendEntries
RPC进行复制。 - 当条目安全复制 (到多数节点) 后,领导者将其应用于其状态机,向客户端返回结果。
- 日志结构 (图3.5):条目包含命令和任期号。顺序索引。
- 已提交条目 (Committed Entries):复制到多数节点。提交领导者日志中所有在它之前的条目。领导者跟踪最高的
commitIndex
(已提交索引)。跟随者按顺序应用已提交条目。 - 日志匹配特性 (Log Matching Property):
- 如果不同日志中的两个条目具有相同的索引和任期号,则它们存储相同的命令。
- 如果不同日志中的两个条目具有相同的索引和任期号,则它们之前的所有条目都相同。
- 由
AppendEntries
一致性检查保证:RPC包含prevLogIndex
(前一个日志索引) 和prevLogTerm
(前一个日志任期)。如果不匹配,跟随者拒绝。
- 日志不一致 (图3.6):领导者崩溃可能导致。领导者通过覆盖冲突条目来强制跟随者日志与其匹配。
nextIndex
(下一个索引):领导者为每个跟随者维护,下一个要发送的条目的索引。- 领导者从不覆盖/删除其自身日志中的条目 (领导者只追加特性)。
- 领导者将客户端命令追加到其日志,发出
- 3.6 安全性 (Safety):
- 3.6.1 选举限制 (Election Restriction): 确保领导者完整性。候选人的日志必须至少与它联系的多数节点中的任何其他日志一样新。
- “最新”:比较最后条目的索引和任期。任期大的获胜。任期相同,日志长的获胜。
- 在
RequestVote
RPC中实现。如果投票者自己的日志更新,则拒绝投票。
- 3.6.2 提交先前任期的条目 (Committing Entries from Previous Terms): (图3.7强调了为何这很棘手)
- Raft 从不通过计算副本数来提交先前任期的日志条目。
- 只有领导者当前任期的日志条目才通过计算副本数来提交。
- 一旦当前任期的条目被提交,所有先前的条目都会因日志匹配而间接提交。
- 3.6.3 安全性论证 (领导者完整性证明草图) (Safety Argument (Proof Sketch for Leader Completeness)): (图3.8展示了一个关键投票者)
- 假设领导者完整性不成立,导出矛盾。
- 如果领导者T (任期T) 提交了一个条目,但领导者U (任期U > T) 没有存储它。
- 必须有一个"投票者"服务器接受了来自T的条目并投票给了U。
- 这个投票者的日志意味着U的日志也必须包含该条目。
- 状态机安全特性:如果一台服务器应用了一个条目,则没有其他服务器会为相同的索引应用不同的命令。(由领导者完整性和按顺序应用条目得出)。
- 3.6.1 选举限制 (Election Restriction): 确保领导者完整性。候选人的日志必须至少与它联系的多数节点中的任何其他日志一样新。
- 3.7 跟随者和候选人崩溃 (Follower and Candidate Crashes): 通过RPC重试处理。Raft RPC是幂等的。
- 3.8 持久化状态和服务器重启 (Persisted State and Server Restarts):
- 每台服务器持久化:
currentTerm
(当前任期)、votedFor
(为谁投票)、日志条目。 commitIndex
可以在重启时重新初始化为0。- 状态机可以是易失的 (从日志/快照重放) 或持久的 (如果是,则
lastApplied
(最后应用索引) 也必须持久化)。
- 每台服务器持久化:
- 3.9 时间和可用性 (Timing and Availability):
- 安全性不得依赖于时间。可用性不可避免地依赖于时间。
- 时间要求:
broadcastTime << electionTimeout << MTBF
broadcastTime
(广播时间):向所有服务器发送RPC并获得响应的时间。electionTimeout
(选举超时):例如10-500ms。MTBF
(平均故障间隔时间):数月。
- 3.10 领导权转移扩展 (可选) (Leadership Transfer Extension (Optional)):
- 可用于维护或首选领导者。
- 过程:前任领导者停止客户端请求,更新目标服务器的日志,向目标发送
TimeoutNow
RPC。目标开始选举,很可能获胜。
- 3.11 结论: Raft使用最少的机制来解决核心共识问题。简单性是为可理解性而设计的结果。为清晰起见,省略了一些优化 (例如更快的选票分裂检测)。
第4章:集群成员变更 (Cluster Membership Changes)
- 需要自动化配置变更 (替换服务器、更改复制级别) 以避免手动错误和停机。
- Raft允许集群在变更期间正常运行。(图4.1 AddServer/RemoveServer RPC)。
- 4.1 安全性 (Safety):
- 从旧配置 (Cold) 直接切换到新配置 (Cnew) 可能不安全 (图4.2,可能导致脑裂)。
- Raft将变更限制为一次添加/删除单个服务器。这确保了多数派总是重叠的 (图4.3)。
- 配置存储为特殊的日志条目。
- 当领导者收到对Cold的添加/删除请求时:
- 将Cnew条目追加到其日志。
- 使用正常的Raft机制复制Cnew条目。
- 服务器一旦在其日志中存储了Cnew条目就切换到Cnew (不等待提交)。
- Cnew条目的决策 (投票、提交) 使用Cnew规则。
- 一旦Cnew条目已提交:
- 领导者可以确认变更完成。
- 被移除的服务器 (如果有) 可以关闭。
- 可以开始进一步的配置变更 (防止不安全的重叠)。
- 4.2 可用性 (Availability):
- 4.2.1 让新服务器追赶上来 (Catching Up New Servers): (图4.4显示风险)
- 新服务器首先作为非投票成员加入。
- 领导者向其复制日志条目。
- 一旦新服务器充分追赶上 (例如,经过固定轮数,最后一轮 < 选举超时,图4.5),实际的重新配置才继续。
- 4.2.2 移除当前领导者 (Removing the Current Leader):
- 选项1:领导权转移 (§3.10)。
- 选项2 (原始方案):领导者管理自己的移除,在Cnew提交之后下台。(图4.6显示了为什么领导者必须在Cnew提交前保持领导地位)。
- 4.2.3 干扰性服务器 (Disruptive Servers):
- 一个从Cnew中移除的服务器可能收不到心跳,超时,增加任期,开始新的选举,干扰当前领导者。(图4.7)。
- 预投票阶段 (候选人在增加任期前请求预投票) 不是一个完整的解决方案。
- Raft解决方案:如果服务器在收到当前领导者心跳的最小选举超时内收到
RequestVote
,它不更新其任期也不投票。(防止在领导者健康时被过时服务器罢免)。
- 4.2.4 可用性论证 (Availability Argument): 总结了为什么这些机制能确保可用性。
- 4.2.1 让新服务器追赶上来 (Catching Up New Servers): (图4.4显示风险)
- 4.3 使用联合共识进行任意配置变更 (更复杂的原始方法) (Arbitrary Configuration Changes using Joint Consensus (More Complex Original Approach)):
- 一次处理多个服务器的变更。
- 集群过渡:Cold -> Cold,new (联合共识) -> Cnew。(图4.8时间线)。
- 联合共识 (Cold,new):
- 日志条目复制到Cold和Cnew中的所有服务器。
- 任一配置中的任何服务器都可以担任领导者。
- 达成一致 (选举、条目提交) 需要Cold和Cnew各自的多数派。
- 此方法比单服务器变更更复杂。
- 4.4 系统集成 (System Integration):
- 暴露AddServer/RemoveServer RPC。
- 自动变更的策略 (例如,发生故障时) 很重要。
- 为提高弹性,最好先添加服务器再移除服务器。
- 引导启动:初始化一台服务器,其配置只包含它自己。其他服务器通过成员变更加入。
- 4.5 结论: 单服务器变更更简单、更安全。可用性处理非常重要,特别是对于干扰性服务器。
第5章:日志压缩 (Log Compaction)
- 日志增长,消耗空间并增加重放时间。压缩是必要的。
- 基本思想:丢弃过时的已提交信息。
- 没有万能的解决方案:取决于系统需求、状态机大小、磁盘/易失性内存。
- Raft日志压缩的核心概念:
- 每台服务器独立地压缩其日志的已提交前缀。
- 状态机将其当前状态写入磁盘 (快照/其他),然后通知Raft丢弃日志前缀。
- Raft持久化:被丢弃前缀的
lastIncludedIndex
(最后包含索引)、lastIncludedTerm
(最后包含任期),以及该前缀的最新配置。 - 状态机处理:重启时加载状态,为慢速跟随者提供一致的状态映像。
- 如果领导者发现跟随者需要的条目已被丢弃,领导者通过
InstallSnapshot
RPC发送快照 (图5.3)。
- 5.1 基于内存的状态机快照: (图5.1总结,图5.2示例)
- 概念上最简单。整个当前状态写入快照。
- 用于Chubby, ZooKeeper, LogCabin。
- 5.1.1 并发快照 (Snapshotting Concurrently):
- 使用写时复制 (copy-on-write):不可变数据结构或操作系统
fork()
。LogCabin使用fork()
。 - 需要额外内存。流式写入磁盘至关重要。
- 使用写时复制 (copy-on-write):不可变数据结构或操作系统
- 5.1.2 何时快照 (When to Snapshot):
- 简单:当日志达到固定大小时 (例如 N * 快照大小)。
- 权衡:磁盘带宽 vs. 空间利用率 vs. 恢复时间。
- 5.1.3 实现考虑 (Implementation Concerns): 保存/加载、传输、消除不安全的日志访问、并发性、何时快照的逻辑。
- 5.2 基于磁盘的状态机快照 (Snapshotting Disk-Based State Machines):
- 状态主要在磁盘上。应用日志条目会改变磁盘上的状态。
- 日志条目一旦反映到磁盘上即可丢弃。
- 仍需要写时复制 (例如磁盘块、LVM快照) 以向慢速跟随者发送一致的映像。提出了增量传输算法。
- 5.3 增量清理方法 (日志清理、LSM树) (Incremental Cleaning Approaches (Log Cleaning, LSM Trees)):
- 更复杂,但能分散负载,写入效率高。
- 5.3.1 日志清理基础 (Basics of Log Cleaning): (LFS, RAMCloud) 日志分为段。清理器从选定段中将活动条目复制到日志头部,释放旧段。
- 5.3.2 日志结构合并树 (LSM树) 基础 (Basics of Log-Structured Merge Trees (LSM Trees)): (BigTable, LevelDB) 最近的写入在内存/小日志中。定期排序并作为不可变的"run"写入磁盘。压缩合并run。
- 5.3.3 Raft中的日志清理和LSM树 (Log Cleaning and LSM Trees in Raft): (图5.4)
- LSM树:Raft日志提供最近的条目;当满时,状态机写入新的run。
- 日志清理:状态机最好拥有自己的日志,独立于Raft的连续日志,并独立清理。Raft日志不受影响。
- 5.4 替代方案:基于领导者的方法 (Alternative: Leader-Based Approaches):
- 通常浪费资源 (网络带宽用于发送已压缩状态)。
- 5.4.1 在日志中存储快照 (Storing Snapshots in the Log): (图5.5) 领导者创建快照,作为日志条目存储。
- 机制经济,但领导者故障会留下部分快照,可能耗尽存储。
- 5.4.2 基于领导者的方法用于非常小的状态机 (Leader-Based for Very Small State Machines): 如果快照适合单个日志条目。领导者停止、等待、快照、追加、恢复。小的可用性间隙。
- 5.5 结论: 多种方法适用于Raft框架。基于内存的快照很常见。增量方法可能效率最高。
第6章:客户端交互 (Client Interaction)
- (图6.1总结了客户端RPC:
ClientRequest
,ClientQuery
,RegisterClient
) - 6.1 找到集群 (Finding the Cluster):
- 固定成员:静态配置文件。
- 动态成员:外部目录 (例如DNS,在变更前后更新) 或网络广播/多播。LogCabin使用DNS。
- 6.2 将请求路由到领导者 (Routing Requests to the Leader):
- 客户端尝试随机服务器。如果不是领导者,服务器拒绝并返回已知的领导者地址 (LogCabin方法)。
- 替代方案:服务器将请求代理到领导者。
- 如果领导者在选举超时内未收到多数节点的心跳,则下台 (防止在分区时无限期延迟客户端)。
- 6.3 实现线性一致性语义 (Implementing Linearizable Semantics):
- 问题:重试导致的至少一次语义可能导致命令重复 (图6.2)。
- 解决方案:过滤重复请求。
- 每个客户端有唯一ID。
- 客户端为命令分配唯一序列号。
- 服务器为每个客户端维护一个会话:跟踪最新处理的序列号及其响应。
- 如果命令的序列号已执行,则返回存储的响应。
- 会话过期 (Session Expiry):
- 必须在状态机之间是确定性的 (例如,基于会话数量的LRU,或基于时间)。
- LogCabin:领导者为命令添加时间戳;状态机用此进行基于时间的过期。客户端发送保活请求。
- 处理会话过期后的客户端 (Dealing with Client after Session Expiry):
- 使用
RegisterClient
RPC获取新的会话和ID。如果命令到达时会话未知,则返回错误。
- 使用
- 6.4 更有效地处理只读查询 (Processing Read-Only Queries More Efficiently):
- 为读取绕过Raft日志很有吸引力 (避免磁盘写入),但如果领导者过时/分区,则可能读取到陈旧数据。
- 线性一致性读取 (无时钟) (Linearizable Reads (without clocks)):
- 领导者确保它已提交其当前任期的一个条目 (例如,任期开始时的空操作条目)。这会将其
commitIndex
更新到当前状态。 - 领导者将其当前
commitIndex
保存为readIndex
。 - 领导者与集群多数节点交换心跳 (确认它仍然是领导者并且没有更新的领导者取代它)。
- 领导者等待其状态机应用条目直到
readIndex
。 - 领导者查询其状态机并回复客户端。
- 领导者确保它已提交其当前任期的一个条目 (例如,任期开始时的空操作条目)。这会将其
- 可以将心跳的成本分摊到多个只读查询上。
- 跟随者可以通过向领导者请求当前
readIndex
来服务读取。 - 6.4.1 使用时钟减少只读查询的消息传递 (租约机制) (Using Clocks to Reduce Messaging (Lease Mechanism)): (图6.3)
- 领导者维护一个租约 (例如,在多数节点确认心跳后的
electionTimeout / clockDriftBound
时间内)。 - 在租约期间,领导者无需额外通信即可回复读取。
- *假设时钟漂移有界。*如果违反,可能返回陈旧信息。
- 为实现顺序一致性 (即使存在时钟问题,客户端也能单调读取):服务器在回复中包含日志索引。客户端在请求中发送最后看到的索引。如果服务器状态较旧,则不回复。
- 领导者维护一个租约 (例如,在多数节点确认心跳后的
- 6.5 结论: 线性一致性和只读查询优化在正确性和性能方面都非常微妙但至关重要。
第7章:Raft用户研究 (Raft User Study) (评估Raft的可理解性)
- 目标: 与Paxos相比,客观评估Raft的可理解性。
- 方法:
- 参与者:高年级本科生/研究生 (斯坦福, 加州大学伯克利分校)。
- 材料:Raft和Paxos的录制视频讲座 (由J. Ousterhout主讲),测验。
- 过程:观看视频1,参加测验1,观看视频2,参加测验2。顺序是平衡的。
- Raft讲座:Raft基础算法,联合共识成员变更。
- Paxos讲座:单提案Paxos, Multi-Paxos, 成员变更, 优化。
- 结果:
- 测验分数:Raft平均分25.7,Paxos平均分21.0 (满分60)。Raft高22.6%。
- 线性回归模型:对于没有Paxos经验的学生,预测Raft分数比Paxos高12.5分。
- 调查:41人中有33人认为Raft更容易实现/解释。
- 测验分数:Raft平均分25.7,Paxos平均分21.0 (满分60)。Raft高22.6%。
- 7.1 研究问题和假设:
- Raft是否比Paxos更容易理解?(预测Raft测验分数更高)。
- Raft最难理解的方面?(预测是提交和成员变更)。
- 交叉学习效应?(预测第二次测验分数更高)。
- 对Raft的偏好?(预测偏好Raft)。
- 7.2 方法讨论:
- 7.2.1 参与者: 激励措施不同 (斯坦福:课程学分,伯克利:学习机会)。表7.1参与情况。
- 7.2.2 教学: 为保证一致性和时间采用讲座。J. Ousterhout主讲两者。Paxos变体来自D. Mazières,成员变更采用Lamport的α方法。录制视频。(表7.2讲座时长)。
- 7.2.3 测试理解: 采用测验而非实现。开放式简答题。平衡难度/分数。有意设置较难。(附录A为测验内容)。
- 7.2.4 评分: 两轮评分,有评分标准。允许部分给分。
- 7.2.5 调查: 简短,李克特量表,开放式反馈。
- 7.2.6 试点研究: 两次试点研究以完善材料。
- 7.4 结果详情:
- 7.4.1 测验:
- 图7.2:测验分数的CDF。
- 图7.3, 7.4:散点图 (Raft vs Paxos分数,按顺序/先前经验分组)。43人中有33人在Raft上得分更高。
- 图7.5:分数差异的CDF。Raft中位数得分比Paxos高6.5分 (31.7%)。
- 图7.6:顺序效应。先学Paxos可能略微拉低了Raft分数。
- 表7.3, 7.4:线性回归模型。学校因素不显著。顺序对Raft测验显著。
- 图7.7:按难度/顺序划分的分数。大部分差异在简单/中等难度。
- 图7.8:按单个问题划分的分数。
- 7.4.2 调查:
- 图7.9:先前Paxos经验。
- 图7.10:公平性调查 (讲座质量,测验难度)。一些人感觉有偏见。
- 图7.11:偏好调查。绝大多数人偏好Raft的实现/解释。
- 7.4.1 测验:
- 7.5 关于实验方法的讨论:
- 用户研究提供了经验证据,但并非所有系统评审员都完全接受。
- 对偏见、讲座内容、测验问题的担忧。
- 与机器实验相比,用户研究成本高、风险大、迭代困难。
- 7.6 结论: 研究表明,在学习1小时后,学生对Raft的理解优于Paxos。这是客观评估的重要第一步。
第8章:正确性 (Correctness)
- 目标: 建立Raft的正确性,并使其他人能够构建正确的系统。
- 务实方法:基于理解/直觉的基础,然后应用形式化方法。
- 8.1 Raft基础算法的形式化规约和证明:
- 完整规约和证明在附录B (TLA+)。约450行。
- 定义状态、初始状态(Init)、转换(Next)。模拟异步系统。
- 比第3章略微通用 (消息传递 vs RPC,更小的原子区域)。
- 证明验证了状态机安全特性。使用历史变量。证明约3500词。
- 8.2 先前验证尝试的讨论:
- Murphi模型检查器:发现一个bug,错过另一个 (由于模型大小受限)。
- TLA模型检查器:可伸缩性问题。
- TLA证明系统:机械证明了领导者完整性 (依赖未经证明的不变性)。对于完整证明过于繁琐。TLA是无类型的。
- 模型检查比证明更容易,但受规模限制。证明耗时约6周。机器检查的证明最理想,但依赖工具。
- 8.3 构建正确的实现:
- 最安全:从已证明的Raft规约自动生成 (对Multi-Paxos [101] 可行)。
- 减少bug的设计:
- Howard的ocaml-raft [37, 36]:状态转换在一个模块中,断言,单进程模拟以检查不变性。
- 测试:
- Jepsen & Knossos [45]:在Raft只读处理中发现bug。Jepsen (分区,数据丢失),Knossos (线性一致性)。
- 鼓励罕见事件:低选举超时,频繁快照,随机重启,成员变更,资源竞争,网络操纵 (丢包,延迟,分区)。
- 长时间运行,多台机器/进程。
- 8.4 结论: Raft的正确性与基于Paxos的系统相当。基础Raft的形式化规约几乎是完整的。未来工作:成员变更、压缩、客户端交互、活性的证明。
第9章:领导者选举评估总结 (Leader Election Evaluation Summary)
- 分析Raft领导者选举的性能。
- 预期主要发现:
- 无选票分裂:选举快速完成 (例如,选举超时范围的1/3)。
- 在足够宽的超时范围内 (例如,单向网络延迟的10-20倍),选票分裂罕见。
- 预期选举轮数遵循几何分布。
- 在局域网和广域网 (模拟) 中表现良好。
- 日志差异影响较小。
- 预投票扩展可以防止重新加入的服务器造成干扰。
- 讨论实验设置 (真实局域网,用于广域网的AvailSim)。
- 分析固定与可变延迟、故障数量、集群大小对选票分裂概率和选举时间的影响。
- (图9.1-9.10将详细说明这些时间线、CDF和参数扫描)。
第10章:实现与性能总结 (Implementation and Performance Summary)
- 10.1 实现:
- LogCabin:Raft的C++实现,约2000行代码。
- 数十个第三方开源实现 (actor模型,事件驱动)。
- 公司部署 (例如,Facebook HydraBase)。
- 10.1.1 线程化架构 (LogCabin): (图10.1) 带锁的监视器式共享状态。对等线程、服务线程、状态机线程、定时器线程、日志同步线程。
- 10.2 性能考虑:
- 正常操作与Multi-Paxos相似 (领导者复制条目)。
- 图10.2:请求处理流水线 (未优化 vs. 优化,其中领导者磁盘写入并行化)。
- 10.2.1 领导者磁盘并行写入。
- 10.2.2 批处理和流水线化 (Batching and Pipelining): Raft两者都支持。讨论了权衡。
- 10.3 初步性能结果 (LogCabin): (表10.1设置,图10.3图表)
- 吞吐量:约19,500次1KB写入/秒 (3服务器)。
- 延迟:1KB写入约0.7ms (单服务器),约1.0ms (2-5服务器)。
- 10.4 结论: 性能目标是在提高可理解性的同时匹配Multi-Paxos。初步结果合理。列出了未来的分析领域。
第11章:相关工作总结 (Related Work Summary)
- 将Raft与其他共识算法 (Paxos, Viewstamped Replication, Zab) 及特定机制进行比较。
- 11.1 概述: Paxos (Google, Microsoft, Ceph, Cassandra, Riak), Viewstamped Replication (Harp), Zab (ZooKeeper)。Raft机制更少。
- 11.2 领导者选举: 检测故障、中和被罢免的领导者、选择新领导者、确保新领导者拥有所有已提交条目。Raft使用更简单的机制。
- 11.3 日志复制和提交: Raft按顺序追加/提交。Paxos允许乱序。Raft的两阶段提交规则与其他算法的对比。
- 11.4 集群成员变更: 基于α的方法 (Paxos/SMART), VRR/Mazières (在领导者选举期间), Zab (最接近Raft的联合共识)。
- 11.5 日志压缩: 快照 (Chubby, VRR, ZooKeeper的模糊快照)。
- 11.6 RSMs vs. 主副本方法 (Primary Copy Approach) (VR, ZooKeeper)。
- 11.7 性能: 优化 (减少领导者瓶颈、见证者、避免持久存储写入)。
- 11.8 正确性: 证明方法的比较。
- 11.9 可理解性: HCI研究,NetComplex度量。
第12章:结论 (Conclusion)
- 目标达成: Raft提供了更易于理解和实践的基础。
- Raft的可理解性设计: 不同的分解方式、强领导者、简单的选举、受限的日志复制。
- Raft的实用性: 足够详细、解决主要问题、高效。解决了日志复制、成员变更、日志压缩、客户端交互。
- 评估总结: 用户研究 (可理解性)、证明 (正确性)、随机化选举 (性能)、LogCabin (吞吐量/延迟)。
- 工业界采纳: 表明其成功。
- 12.1 经验教训:
- 关于复杂性 (Raft对此的不容忍)。
- 关于连接理论与实践 (学术界的作用)。
- 关于寻找研究问题 (构建一些东西,优化一个指标)。
- 12.2 最后评论: 希望Raft能为教学共识和构建未来系统奠定良好基础。
附录A:用户研究材料 (Appendix A: User Study Materials)
- 包含Raft测验、Paxos测验 (问题、答案、评分标准)、调查问卷以及提供给参与者的算法摘要。(图A.1-A.5显示了这些摘要)。
附录B:安全性证明和形式化规约 (Appendix B: Safety Proof and Formal Specification)
- 基础Raft算法的完整TLA+规约。
- 状态机安全特性的详细证明。
- (第201-229页是TLA+规约和证明文本)。
相关文章:
Raft算法学习(1)博士论文大纲
参考资料 原文一共257页,其中前六章为算法重点介绍,第七章有点像A/B TEST 论文标题: 共识:连接理论与实践 (CONSENSUS: BRIDGING THEORY AND PRACTICE) 作者: Diego Ongaro 日期: 2014年8月 机构ÿ…...
PDF处理控件Aspose.PDF教程:以编程方式将 PDF 导出为 JPG
在本节中,我们将探讨如何使用 Aspose.PDF 库将 PDF 文档转换为 JPG 图像。Aspose.PDF 是一个功能强大且用途广泛的库,专为需要以编程方式处理 PDF 文件的开发人员而设计。它提供了丰富的功能,可用于跨多个平台创建、编辑和转换 PDF 文档。其主…...
记录一下flutter项目自己封窗的弹窗
在评委项目开发中我使用到的弹窗dialog与modal sheet底部弹出组件,我对其进行了基础的封装,以适用于本项目,代码如下: class JudgeDialog {// 内容边距static EdgeInsetsGeometry _contentPadding(String? content) {return c…...
计算机网络基础概念
网络通信的本质就是进程间通信。我们日常使用的聊天软件、在线视频软件等,事实上都是本机客户端进程与远地服务端进程之间进行网络通信所实现的。我们与朋友进行远程聊天,本质上是从本地客户端将聊天内容发送给服务端,再由服务端转发给目标客…...
【原创】ubuntu22.04下载编译AOSP 15
repo init -u http://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b master source build/envsetup.sh lunch aosp_cf_x86_64_phone-trunk_staging-userdebug find ./ -name “index.lock” -exec rm -f {} ; find ./ -name “index.lock” -exec rm -i {} ;…...
鸿蒙PC新物种发布!华为MateBook Pro/ Fold深度解析:折叠屏革命与生态破局
华为在5月19日发布会上推出的两款鸿蒙电脑新品——华为MateBook Pro和HUAWEI MateBook Fold 非凡大师,标志着其在PC领域的深度布局和技术突破。结合发布会信息和行业背景,以下为分析及影响预测: 一、产品核心亮点及创新 华为MateBook Pro&…...
数据要素如何重构人力资本升级
一、数字经济时代 在传统工厂车间,老师傅的经验智慧曾是企业最宝贵的资产。而在现代的数字化办公室,每天产生的千万条数据流正在重塑企业创新规则。这个变革的核心密码锁定在两个关键维度:人力资本结构的质变与创新资源的智配。 数据要素与…...
【爬虫】12306自动化购票
上文: 【爬虫】12306查票-CSDN博客 下面是简单的自动化进行抢票,只写到预定票,没有写完登陆, 跳出登陆后与上述代码同理修改即可。 感觉xpath最简单,复制粘贴: 还有很多写法: 官网地址&#…...
保密行业工作沟通安全:吱吱软件的“四重防泄露”设计
“工作沟通安全威胁是指在金融、科技、医疗等保密行业中,错发、泄露、窃取一条消息或者一份文件,都有可能引发数据安全灾难性失控。以往的即时通讯软件仅依赖单一的加密手段,无法满足保密行业从发送、传输到接受全链路加密的更高规格的数据安…...
2001-2023年上市公司管理讨论与分析文本数据(MDA文本数据)
2001-2023年上市公司管理讨论与分析文本数据(MD&A文本数据) 1、时间:2001-2023年 2、来源:上市公司年报 3、格式:txt 4、样本量:6W 5、说明:“管理层讨论与分析”(MANAGEME…...
Unity3D仿星露谷物语开发46之种植/砍伐橡树
1、目标 种植一棵橡树,从种子变成大树。 然后可以使用斧头砍伐橡树。 2、删除totalGrowthDays字段 修改growthDays的含义,定义每个值为到达当前阶段的累加天数。此时最后一个阶段就是totalGrowthDays的含义。所以就可以删除totalGrowthDays字段。 &…...
9-社区动态(Stack布局)
涉及知识点: stack布局 video组件 3.组件状态控制: State、Prop以及Link装饰器 组件状态控制:Observed&ObjectLink装饰器 课时: 2 1 任务 1.1 需求 完成社区动态功能,社区动态显示用户发布的跟游戏相关的短视频,自动循环…...
如何使用MATLAB NLP工具箱进行文本聚类
文章目录 前言一、核心流程与代码实现二、高级聚类技术三、评估聚类质量四、实战案例:新闻聚类五、优化技巧与注意事项 前言 在 MATLAB 中使用 NLP 工具箱进行文本聚类主要分为数据预处理、特征提取、相似度计算、聚类算法应用和结果分析五个核心步骤。以下是详细教…...
deepseek梳理java高级开发工程师es面试题
Elasticsearch 面试题及答案(高级 Java 开发工程师版) 基础概念 1. 解释 Elasticsearch 中的倒排索引是什么?为什么它比传统数据库更适合全文搜索? 答案: 倒排索引是一种将文档中的词项(token)映射到包含该词项的文…...
查看mysql配置文件my.cnf的位置
3.删除mysql相关文件 想要完全卸载mysql,不仅要卸载应用,配置文件及相关文件也需要一一清除,还原环境配置,减少一些麻烦。 sudo rm -rf /usr/local/mysql sudo rm -rf /etc/my.cnf sudo rm -rf /var/db/mysql sudo rm -rf /var/…...
PyTorch进阶实战指南:01自定义神经网络组件开发
PyTorch进阶实战指南:01自定义神经网络组件开发 前言 在深度学习领域,PyTorch凭借其动态计算图和灵活的模块化设计,已成为学术研究和技术落地的首选框架之一。本文聚焦于神经网络组件的自定义开发,旨在帮助开发者突破现成模型的限…...
【MySQL】04.数据类型
首先我们来看一下数据类型分类: 我们接下来对红色标识的进行介绍,其他的自行了解即可。 1. 数值类型 1.1 bit 我们以bit为例来介绍整型。 mysql> create table test_bit(-> sex bit(1)-> ); mysql> desc test_bit; -----------------…...
MCP专题 | 探索MCP服务器世界:增强AI能力的精选推荐
在人工智能快速发展的今天,模型上下文协议(MCP,Model Context Protocol)已成为一项重要的技术标准,它使AI模型能够安全地与外部资源交互。MCP服务器作为AI与工具、数据库和API之间的桥梁,极大地扩展了AI的功…...
深入解析OrientDB:多模型数据库的技术优势与实际应用
OrientDB 是一款开源的多模型 NoSQL 数据库,融合了文档数据库、图数据库和对象数据库的特性。它不仅支持灵活的数据建模,还提供了高性能的查询能力,适用于社交网络、物联网、内容管理等场景。本文详细探讨 OrientDB 的核心特性、应用场景&…...
芯片分享之AD976性能介绍
产品特征: D976和AD976A均为高速、低功耗、16位模数转换器(ADC),采用5 V单电源供电。AD976A的吞吐速率为200 ksps,而AD976的吞吐速率为100 ksps。各器件均内置一个逐次逼近型开关电容ADC、一个2.5 V内部基准电压源和一个高速并行接口。最大功…...
Flutter - 集成三方库:数据库(sqflite)
数据库 $ flutter pub add sqlite $ flutter pub get$ flutter run运行失败,看是编译报错,打开Xcode工程 ⌘ B 编译 对比 GSYGithubAppFlutter 的Xcode工程Build Phases > [CP] Embed Pods Frameworks 有sqfite.framework。本地默认的Flutter工程默认未生成Pod…...
野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(三)用yolov5-face算法实现人脸检测
环境直接使用第一篇中安装好的环境即可 先clone yolov5-face项目 git clone https://github.com/deepcam-cn/yolov5-face.git 并下载预训练权重文件yolov5n-face.pt 网盘链接: https://pan.baidu.com/s/1xsYns6cyB84aPDgXB7sNDQ 提取码: lw9j (野火官方提供&am…...
基于matlabcd7.x的无网格近似方法
无网格近似方法(Meshless Methods)是一类数值计算方法,用于解决偏微分方程(PDEs)问题,特别是在几何形状复杂或需要动态网格更新的场景中。与传统的有限元方法(FEM)相比,无…...
塔式服务器都有哪些重要功能?
塔式服务器作为一种拥有着独特立式设计的服务器,能够帮助企业节省一定的放置空间,提供一系列的功能和优势,可以运用在多种应用场景当中,下面将探讨一下塔式服务器的主要功能都有哪些? 塔式服务器可以支持基本的应用程序…...
【基于SpringBoot的图书购买系统】深度讲解 分页查询用户信息,分析前后端交互的原理
引言📚 在企业级应用开发中,用户管理系统是几乎所有后台管理系统的核心模块之一。它不仅需要实现用户数据的增删改查,还需要考虑数据分页展示、状态管理、前后端交互效率等问题。本文将以一个实际的用户管理系统为例,详细讲解基于…...
机器学习算法-聚类K-Means
先来看看K-Means算法的核心流程吧 下面我们通过一个简单聚类来介绍K-Means算法迭代过程 如图(a)所示:表示初始化数据集。 如图(b)所示:假设K2,随机选择两个点作为类别质心,分别为图中的红色和蓝色质心。 如图©所示ÿ…...
初识Linux 进程:进程创建、终止与进程地址空间
目录 0.写在前面 1.进程创建 fork(): exec(): 2.进程地址空间 3.进程终止 正常终止(主动退出) 异常终止(被动终止) 0.写在前面 本文将对Linux环境下的进程:包括进程创建、终止与进程等待…...
2025年PMP 学习二十二 15章 项目绩效域
2025年PMP 学习二十二 15章 项目绩效域 文章目录 2025年PMP 学习二十二 15章 项目绩效域项目绩效域1.项目绩效域2.项目持续效域3.项目管理中的干系人管理 1.干系人持续效域促进干系人参与的步骤: 2 团队持续效域1 团队持续效域及项目团队人员有关系的活动和职能&…...
顶级流媒体服务商 Spotify 2025.04 故障复盘报告,吃他人的堑长自己的智
2025 年 4 月 16 日,Spotify 经历了一次影响全球用户的中断。以下就是发生了什么以及我们将如何解决它。 背景 我们使用 Envoy Proxy 作为我们的网络外围系统。外围是我们的软件接收用户(您!)网络流量的第一部分。然后ÿ…...
服装收银系统哪个好?服装店进销存管理软件全面评测
在服装批发零售行业,选择一款合适的收银系统和进销存管理软件至关重要。好的系统不仅能提高工作效率,还能帮助商家精准掌握库存、优化销售策略。 本文将全面分析服装收银系统的选择标准,并重点介绍秦丝进销存这一专业解决方案。 一、服装收…...
Java程序员从0学AI(二)
一、前言 在上一篇文章中,我们初步认识了 AI 领域的核心基础概念,如大语言模型(LLM)的参数量特征、提示词(Prompt)对交互效果的关键作用、文本处理单元 Token 的独特定义,以及通过向量转换实现…...
进阶知识:无参的函数装饰器之深入理解@wraps()
进阶知识:无参的函数装饰器之深入理解wraps(func) 一、wraps(func)的本质解析 1.1 核心作用 wraps(func)是functools模块提供的装饰器工具,用于保留被装饰函数的元信息。它通过将被装饰函数的名称(__name__)、文档字符串&#…...
《C 语言 sizeof 与 strlen 深度对比:原理、差异与实战陷阱》
目录 一. sizeof 和 strlen 的对比 1.1 sizeof 1.2 strlen 1.3 对比表格 二. 数组和指针笔试题解析 2.1 一维数组 2.2 字符数组 2.2.1 代码练习一 2.2.2 代码练习二 2.2.3 代码练习三 2.2.4 代码练习四 2.2.5 代码练习五 2.2.6 代码练习六 2.3 二维数组 …...
C++ 初阶 | 类和对象易错知识点(上)
目录 0.引言 1.访问限定符 2.域 3.类的实例化和声明 4.this指针 5.构造函数(自动执行) 6.拷贝构造 7.运算符重载 8.日期类的实现 9.总结 0.引言 今天,小邓儿和大家分享一下,C在类和对象中的易错知识点🤭&am…...
USB转TTL
USB转TTL模块是实现计算机USB接口与TTL电平串口设备(如单片机、嵌入式系统)通信的核心组件,其原理涉及协议转换和电平适配两大关键技术 一、核心功能与应用场景 功能:将计算机的USB信号(高速差分信号、USB协议&#…...
汽车生产中的测试台连接 – EtherCAT 转CANopen高效的网关通信
使用 EtherCAT 和 CANopen协议,实现对汽车零部件的高效生产线末端测试 某电动机、电桥和变速箱制造商之一,正在其生产线上使用ETHERCAT转canopen网关WL-ECAT-COP的解决方案。集成到测试线中的下线测试必须映射众多待测设备的测试应用。该制造商已指定 Et…...
汽车充电过程中--各个电压的关系(DeepSeek)
在电动汽车的充电过程中,电池的充电机制涉及多个电压参数的协调控制,以下从原理到实际应用逐步分析: 1. 充电基础原理 电动汽车电池(通常为锂离子电池组)的充电本质是通过外部电源向电池注入电能,使锂离子…...
基于HTML的Word风格编辑器实现:从零打造功能完备的富文本编辑器
引言 在Web开发中,实现一个功能完备的富文本编辑器是一个常见需求。本文将基于HTML5和JavaScript,结合第三方库,打造一个具有Word风格界面的富文本编辑器,支持格式设置、图片插入、表格创建、文件导入导出等核心功能。 完整代码…...
亚远景-汽车软件开发的“升级之路”:ASPICE各等级说明
ASPICE(Automotive SPICE)将汽车软件开发过程的成熟度划分为六个等级,从0级到5级,每个等级代表了组织在软件开发过程中的不同能力水平。以下是各等级的详细说明: 等级0:不完整(Incomplete&#…...
Unity Display 1 No cameras rendering
一个相机不能同时输出到屏幕和RenderTexture。 Output Texture,要么是 None (屏幕),要么是RenderTexture。 如果此时相机已经输出到RenderTexture,场景中又没有别的相机在渲染,屏幕将变黑并显示No cam…...
Python Selenium 使用指南
Selenium 是一个用于自动化 Web 浏览器交互的强大工具,常用于网页测试、数据抓取和自动化任务。以下是 Python 中 Selenium 的详细使用说明。 安装 Selenium 首先需要安装 Selenium 库和浏览器驱动: pip install selenium 然后下载对应浏览器的驱动&…...
Cribl 对数据源进行过滤-01
先说一个项目中实际的例子: Cribl 利用filter expression 来过滤 data, 举个例子: source1: sourcerouter=A, source 2: sourcerouter=B, 这个时候,可以要把他们合并起来: sourcerouter=A || sourcerouter=B 来进行过滤想要的数据。 最后可以使用一个pipeline 来对数据进行…...
python 通过 pymysql 获取 select count(*) xxx 的数量
在使用 pymysql 库来获取 SELECT COUNT(*) 语句的结果时,你可以通过以下步骤实现: 安装 pymysql:如果你还没有安装 pymysql,可以通过 pip 安装它。 pip install pymysql连接到数据库:使用 pymysql.connect() 方法连接…...
定时任务延迟任务
二者的区别: 定时任务:有固定周期的,有明确的触发时间。 延迟任务:没有固定的开始时间,它常常是由一个事件触发的,而在这个事件触发之后的一段时间内触发另一个事件,任务可以立即执行࿰…...
【动手学深度学习】1.1~1.2 机器学习及其关键组件
目录 一、引言1.1. 日常生活中的机器学习1.2. 机器学习中的关键组件1)数据2)模型3)目标函数4)优化算法 一、引言 1.1. 日常生活中的机器学习 应用场景: 以智能语音助手(如Siri、Alexa)的唤醒…...
LLaVA-MoD:基于MoE结构和蒸馏训练方法,训练轻量化多模态大模型!!
摘要:我们介绍了LLaVA-MoD,这是一个旨在高效训练小型多模态语言模型(s-MLLM)的创新框架,通过从大规模多模态语言模型(l-MLLM)中提取知识来实现。我们的方法解决了多模态语言模型(MLL…...
YOLOv8 的双 Backbone 架构:解锁目标检测新性能
一、开篇:为何踏上双 Backbone 探索之路 在目标检测的领域中,YOLOv8 凭借其高效与精准脱颖而出,成为众多开发者和研究者的得力工具。然而,传统的单 Backbone 架构,尽管已经在诸多场景中表现出色,但仍存在一…...
SSRF(服务器端请求伪造)基本原理靶场实现
1、漏洞原理 攻击者通过构造恶意请求,诱使服务器向内部系统或第三方服务发起非预期的网络请求。其核心在于 服务器信任了不可信的用户输入,并基于该输入发起网络操作。 2、攻击场景与利用方式 1. 基础利用 攻击类型示例Payload目标读取本地文件file://…...
自动化测试脚本点击运行后,打开Chrome很久??
亲爱的小伙伴们大家好。 小编最近刚换了电脑,这几天做自动化测试发现打开Chrome浏览器需要等待好长时间,起初还以为代码有问题,或者Chromedriver与Chrome不匹配造成的,但排查后发现并不是!! 在driver.py中…...
Oracle中如何解决FREE BUFFER WAITS
基于性能上的考虑,服务器进程在扫描LRU主列的同时,会将脏块移至LRU-W列,如果发现没有足够可用(可替换)的BUFFER CACHE,进程并不会无止尽地扫描整条LRU主列,而是在扫描到某个阀值(该阀…...