从 Basic Paxos 到 Multi Paxos 到 Raft
在朴素Paxos算法中, 各个节点经过 Prepare 和 Accept 阶段, 会达成一个值, 这个值一旦达成, 就不能被修改, 如下例子:

图示1
上面的操作几乎没有任何实用价值, 于是演变成下面这种操作, 多个"实例(Instance)", 每个Instance负责一轮Paxos投票, 这样可以有序确定多个值, 形成日志;

图2
将日志输入到状态机, 就形成了一套KV系统, 如果有全局统一的时钟 可以在日志里面带上时间戳, KV里面也带上时间戳, 这样可以实现数据快照读(snapshot);
上面的paxos系统可用性依然很差, 因为如下原因:
1. 即使提议没有竞争, 每次提议依然需要2次写盘(Prepare阶段写一次, Accept阶段写一次); 如果提议发生竞争, 写盘次数会更高;
2. 一个日志被确定之后, 落在多数派上的读取可以读取到最新的值, 落在少数派上的读取不能读取到最新的值(取决于少数派什么时候能够同步到最新的日志);
于是, 算法进化成如下的形式,
1. 选出一个Leader, 每次写和读都落在Leader上, 这样, 读操作能获取到最新的值;
2. Prepare只发起一次, 然后就是多次Accept, 这样可以将写盘次数降低;

虽然有Leader, 但是即使Follower上有写入, 依然不会破坏一致性, 因为Follower上的写入会提升Prepare(Promise ID)的值, 这种情况下Multi Paxos会退化为 Basic Paxos;
借用phxpaxos的技术文章里的一句话来描写Leader的作用---"Leader的引入是为了性能, 不是为了一致性";
选举和续租暂时不讲了, 我也没怎么看懂;
可以看到, Paxos经过演化之后, 最终实现了如下的特性:
1. 读写落到Leader上, 读操作可以可以读取到最新的数据;
2. Leader的引入将2次或大于2次的磁盘写降为1次; (正常情况下);
3. 发生重新选举的情况下, 数据最新的节点能够竞选;
Raft用更简单的方式实现了这些特性, 这里有一个非常简单的Raft协议动画演示, 我们可以轻松的理解Raft:
http://thesecretlivesofdata.com/raft/
Raft中有几个重要的概念:
日志index(顺序号)
日志term)(时间)
两阶段: 日志复制(Replicate)阶段 和 日志提交(Commit)阶段;
Raft协议的细节我们不讲了, 我们看看Raft是怎么面对下面的问题的;
1. Leader崩溃了, 怎么选举; 要确保新的Leader是有最新日志, 不影响读操作;
Raft选举需要2个参数, 日志 Index和日志时间戳; 落后的节点不可能获得多数派通过;
2. 网络问题出现, 节点发生分裂, 该怎样保证整个集群的数据的Consensus;
分裂之后, 少数派的日志无法Commit,
Raft实现相对Paxos简单, 不像Paxos那样容易出错, 所以有很多语言版的Raft实现, 国内著名开源数据库TiDB贡献了rust语言的实现: https://github.com/pingcap/raft-rs
我们以Raft论文里的示例, 留下一个问题来思考吧:

(a) 场景下, S1 挂掉, S5 竞选(S5竞选会得到S3, S4, S5的同意, 会遭到S2的拒绝, 因为S2的日志Index和日期都大于S5);
(b) 场景下S5写入3, 还没复制到其他节点就挂掉了;
(c) 场景下, S1又活过来, 竞选成为Leader, 将前次的 2 记录的日志"复制"给多数派;
因为不能Commit上个任期的日志, 所以2折条日志仍然是UnCommited;
然后新写入了 4 的日志, 没来得及复制和Commit, S1又挂掉了;
下面两种情况能出现吗?
(d) 场景下, S5活过来, 竞选成为Leader, 将日志3 复制到其他节点上;
或者
(e) 场景下, S1活过来, 竞选成为Leader, 将日志 2, 4 覆盖掉 S5 的日志;
答案:
Raft为了防止Commit的日志被冲掉, 有一个重要的约束:
Leader不能 "直接提交上个任期复制过的日志",
"只能提交这个任期的日志, 使上个任期的日志被间接提交";
所以:
(d)场景可以出现, 因为2这个日志并没有被Commit, 可以被S5的3覆盖, 但是S5不能直接提交3这个日志;
(e)场景可以出现, S1通过 复制 和 提交 4 这条日志, 使得 2 这条日志被间接提交; 之后即使S1再挂掉, S5也不能获得多数派投票;
从 Basic Paxos 到 Multi Paxos 到 Raft的更多相关文章
- Multi Paxos
Multi Paxos [2] 通过basic paxos 以上步骤分布式系统已经能确定一个值,“只确定一个值有什么用?这可解决不了我面临的问题.” 你心中可能有这样的疑问. 原simple paxo ...
- [转帖]【ZOOKEEPER系列】Paxos、Raft、ZAB
[ZOOKEEPER系列]Paxos.Raft.ZAB 2018-07-11 12:09:49 wangzy-nice 阅读数 2428更多 分类专栏: zookeeper 版权声明:本文为博主原 ...
- 一致性算法—Paxos、Raft、ZAB
一致性算法—Paxos.Raft.ZAB 2019年04月21日 20:35:09 bulingma 阅读数 64更多 分类专栏: 分布式概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY ...
- 分布式系统理论进阶 - Paxos变种和优化
引言 <分布式系统理论进阶 - Paxos>中我们了解了Basic Paxos.Multi Paxos的基本原理,但如果想把Paxos应用于工程实践,了解基本原理还不够. 有很多基于Pax ...
- Paxos变种和优化
分布式系统理论进阶 - Paxos变种和优化 引言 <分布式系统理论进阶 - Paxos>中我们了解了Basic Paxos.Multi Paxos的基本原理,但如果想把Paxos应用于工 ...
- 分布式系统理论:一致性协议Paxos
Paxos算法是莱斯利·兰伯特(Leslie Lamport)于1990年提出的一种基于消息传递的一致性算法. Paxos 算法是一个解决分布式系统中,多个节点之间就某个值(注意是某一个值,不是一系列 ...
- 分布式系统理论进阶7:Paxos变种和优化
本文转自:https://www.cnblogs.com/bangerlee/p/6189646.html 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到 ...
- Raft协议学习笔记
目录 目录 1 1. 前言 1 2. 名词 1 3. 什么是分布式一致性? 3 4. Raft选举 3 4.1. 什么是Leader选举? 3 4.2. 选举的实现 4 4.3. Term和Lease ...
- Paxos 实现日志复制同步(Basic Paxos)
Paxos 实现日志复制同步 本篇文章以 John Ousterhout(斯坦福大学教授) 和 Diego Ongaro(斯坦福大学获得博士学位,Raft算法发明人) 在 Youtube 上的讲解视频 ...
随机推荐
- SQLServer 2008 已成功与服务器建立连接,但是在登录前的握手期间发生错误。 (provider: SSL Provider, error: 0 - 等待的操作过时。
在用SQL Server 2008 在连接其他电脑的实例时,一直提示“已成功与服务器建立连接,但是在登录前的握手期间发生错误. (provider: SSL Provider, error: 0 - ...
- Windows下android模拟器环境搭建
一.搭建java环境 1.下载jdk1.6.0_45 下载地址:http://www.oracle.com/technetwork/java/archive-139210.html ----> ...
- thinkphp5.1 使用success();和error();要注意的点
public function succ() { $this->success(); $this->error(); } 这里的$this-> 老是忘掉 记录一下
- hbase概述和安装
前言 前几天刚学了Hadoop的安装,几乎把Hadoop的雷都踩了一个遍,虽然Hadoop的相关的配置文件以及原理还没有完全完成,但是现在先总结分享一下笔者因为需要所整理的一些关于Hbase的东西. ...
- 将php脚本加入开机启动
可以看到“/etc/rc.d/init.d”下有很多的文件,每个文件都是可以看到内容的,其实都是一些shell脚本.系统服务的启动就是通过“/etc/rc.d/init.d”中的脚本文件实现的.我们也 ...
- html和css问题?
1.说说你对语义化的理解?答,去掉或者丢失样式的时候能够让页面呈现出清晰的结构方便其他设备解析(如屏幕阅读器.盲人阅读器.移动设备)以意义的方式来渲染网页:便于团队开发和维护,语义化更具可读性,是下一 ...
- Pycharm--flake8的配置使用
前言:Flake8 是由Python官方发布的一款辅助检测Python代码是否规范的工具.Flake8检查规则灵活,支持集成额外插件,扩展性强. 一.安装flake8 进入虚拟环境: pip inst ...
- Java框架spring 学习笔记(二):Bean的作用域
Spring 框架Bean支持以下五个作用域: 下面介绍两种作用域,singleton和protoype singleton作用域 singleton作用域为默认作用域,在同一个ioc容器内getBe ...
- spring cloud Ribbon
参考:https://www.jianshu.com/p/1bd66db5dc46 Ribbon 是什么 spring cloud ribbon 是一个基于HTTP 和 TCP 的客户端负载均衡工具, ...
- 启动tomcat时报错:http-nio-8080-exec-10
启动Tomcat后访问 http://192.168.199.10:8080/jpress-web-newest 网页,查看日志有报错 问题原因:Java的内存溢出 故障现象为: cat /app ...