一致性问题

一致性算法是用来解决一致性问题的,那么什么是一致性问题呢? 在分布式系统中,一致性问题(consensus problem)是指对于一组服务器,给定一组操作,我们需要一个协议使得最后它们的结果达成一致. 更详细的解释就是,当其中某个服务器收到客户端的一组指令时,它必须与其它服务器交流以保证所有的服务器都是以同样的顺序收到同样的指令,这样的话所有的 服务器会产生一致的结果,看起来就像是一台机器一样.

实际生产中一致性算法需要具备以下属性:

  • safety:即不管怎样都不会返回错误的结果
  • available:只要大部分的机器正常,就仍然可以工作.比如五台机器的集群允许最多两台机器坏掉.
  • 不依赖时间来确保一致,即系统是异步的.
  • 一般情况下,运行时间由大多数的机器决定,不会因为有少部分慢的机器而影响总体效率.

为什么要解决一致性问题?

我们可以说一个分布式系统可靠性达到99.99…%,但不能说它达到了100%, 为什么? 就是因为一致性问题是无法彻底解决的. 以下四个分布式系统中的问题都与一致性问题有关:

  1. reliable multicast 可靠组播
  2. membership protocal (failuer detector) 集群中成员的管理
  3. leader election 选举算法
  4. mutual exclution 互斥,例如资源的独占和分配

Raft一致性算法

前面我介绍了教科书上 的一些选举算法, 它们也是属于一致性算法,即最后所有服务器所认为的leader都是一致的. 现在实际应用中主流的一致性算法有两个Paxos 和 Raft. Zookeeper 就是选用的Paxos, 而etcd使用的Raft. 作为一名Go爱好者,我先来讲一下Raft吧.

Raft是因为Paxos太难懂太难以实现而提出的,目的是在可靠性不输于Paxos的情况下,尽可能的简单易懂. 但是Raft的论文 In Search of an Understandable Consensus Algorithm还是有18页,我要比它更简单易懂.

Raft把一致性问题分解成为三个小问题:

  1. leader election 选举
  2. log replication 日志复制,同步
  3. safety 安全性

基本概念

每个Server有三个状态: leader, follower, candidate

  • follower: 不发request而只会回复leader和candidate的request.
  • leader: 处理client发过来的请求
  • candidate: leader的候选人

Raft把时间分为terms. 每一个term开始时都进行一次选举. 每一个term里最多有一个leader, 或者没有leader.

RPC实现

算法需要两种RPC, RequestVote RPC:由candidates在选举过程中发起,当另外一个server收到这个RPC之后, 只有当对方term和log都至少和自己的一样新的时候才会投赞成票,收到多数赞成票的candidate会当选leader.

AppendEntries RPC 由leader发起用来分发日志, 强迫follwer的log和自己一致.

Leader election

如果一个follower在election timeout的时间里没有收到leader的信息,就进入新的term,转成candidate,给自己投票,发起选举 RequestVote RPC. 这个状态持续到发生下面三个中的任意事件:

  1. 它赢得选举
  2. 另外有Server获得选举
  3. 1个term过去了,还是没有选举结果

为什么会有3这个情况呢,就是当如果大家同时发起选举,都投给自己,那就没有Server能够得到多数选票了,这个时候就要进入下一个term,再 选一次. 为了避免这个情况持续发生,每个Server的election time被随机的设成不同的值,所以先timeout的就可以先发起下一次选举.

Log replication

选好leader之后就可以分发log啦.

每一个log都有一个log index 和 term number. 当大多数的follower都复制好这个log时,就说这个log是committed,可以执行了. Leader 记住已经commit的最大log index, 用它来分发下一个 AppendEntries RPC. 这个和TCP里段的编号的作用是一样的.

当一个leader重新选出来时,它的log和follower的log可能不一致,那么它会强制所有的follower都和自己的log一致.首先leader要找到和follower之间的最大的编号一致的log,然后覆盖掉那之后的log.

Safety

但是到目前为止仍然不能保证安全性.比如说, 当leader在commit log时, 某follower掉线了,然后这个follower后来被选为leader,它会覆盖掉现在follwer那些已经committed log, 由于这些log是已经执行过的,所以结果不同的机器就执行不同的指令. 在选举过程中,再加多一个限制就可以防止这种情况发生, 即:

Leader completeness property:
对于任意一个term, leader都要包含所以在之前term里committed的logs.

这样就是完整的Raft算法了.

注:图片都来自Paper In Search of an Understandable Consensus Algorithm

转自:http://daizuozhuo.github.io/consensus-algorithm/

转载于:https://www.cnblogs.com/bonelee/p/6408267.html

一致性问题和Raft一致性算法——一致性问题是无法彻底解决的,可以说一个分布式系统可靠性达到99.99…%,但不能说它达到了100%...相关推荐

  1. 深入一致性哈希(Consistent Hashing)算法原理

    2019独角兽企业重金招聘Python工程师标准>>> 本文为实现分布式任务调度系统中用到的一些关键技术点分享--Consistent Hashing算法原理和Java实现,以及效果 ...

  2. 单个节点的缓存容量达到上限 Hash算法一致性

    场景 单个节点的缓存容量达到上限,无法继续单点增加内存,如何解决? 单个节点支撑的QPS达到上限,如何解决? 初步方案 增加N个缓存节点,为了保证缓存数据的均匀,一般情况会采用对key值hash,然后 ...

  3. 一致性哈希 数据迁移 mysql_一致性哈希算法解决分布式数据扩容

    一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似.一致性哈希修正了CARP使用的简 单哈 ...

  4. etcd - 一个分布式一致性键值存储系统

    etcd - 一个分布式一致性键值存储系统 etcd是一个分布式一致性键值存储系统,用于共享配置和服务发现,专注于: 简单:良好定义的,面向用户的API (gRPC) 安全: 带有可选客户端证书认证的 ...

  5. Zookeeper分布式一致性原理(二):一致性协议

    为了解决分布式一致性问题,在长期的研究过程中,提出了一大批经典的一致性协议和算法,其中最著名的就是2PC和3PC以及Paxos算法了. 1. 2PC和3PC 在分布式系统中,每个节点都明确知道自己事务 ...

  6. 一致性哈希 php redis,使用一致性哈希实现Redis分布式部署

    像Memcache以及其它一些内存K/V数据库一样,Redis本身不提供分布式支持,所以在部署多台Redis服务器时,就需要解决如何把数据分散到各个服务器的问题,并且在服务器数量变化时,能做到最大程度 ...

  7. Flink 状态一致性:端到端状态一致性的保证

    文章目录 状态一致性 什么是状态一致性 状态一致性种类 端到端(end-to-end)状态一致性 Sink端到端状态一致性的保证 Flink+Kafka端到端状态一致性的保证 状态一致性 什么是状态一 ...

  8. linux arm panic,ARM Linux 内核 panic 之cache 一致性 ——Cortex-A9多核cache和TLB一致性广播...

    ARM Linux 内核 panic 之cache 一致性 --Cortex-A9多核cache和TLB一致性广播 Cortex-A9的多喝CPU可以接收和执行一致性广播操作,当其使能并处于SMP模式 ...

  9. btf-raft共识算法_了解Raft共识算法:学术文章摘要

    btf-raft共识算法 by Shubheksha 通过Shubheksha 了解Raft共识算法:学术文章摘要 (Understanding the Raft consensus algorith ...

最新文章

  1. linux-swappiness参数的作用及设置
  2. Linux下root无法运行Chrome浏览器的解决方法
  3. TLS与openssl学习总结(三)-实操篇
  4. java底层原理书籍_不愧是阿里p8大佬!终于把Java 虚拟机底层原理讲清楚了,请签收...
  5. 视频+PPT | 企业服务进阶第一课:客户全生命周期运营总览
  6. Apache Lucene基础教程
  7. 学习笔记4 :opencv 、PIL、matplotlib.image打开、保存图片
  8. MTK(android init.rc) 写一个开机启动的服务
  9. 推送技术 Push Notification
  10. 【Java】 大话数据结构(6) 栈的顺序与链式存储
  11. python sort sorted 排序详解
  12. Intel 386 and AMD x86-64 Options for GCC
  13. 网页设计html5留言板代码,web网页设计期末大作业_留言板制作.doc
  14. 毕设看的硕博士论文速记
  15. Bot Chat(聊天机器人) HeroCard的简单用法
  16. JVM线程本地分配缓冲区(Thread Local Allocation Buffer)TLAB详解
  17. 九度OJ 1177:查找 (字符串操作)
  18. 红旗linux中科红旗发布Linux7.0 RC1桌面版操作系统
  19. A_A02_004 J-LINK驱动安装
  20. group by的用法

热门文章

  1. RabbitMQ使用详解
  2. spss预测变量重要性不可用_C4.5/5.0的SPSS操作
  3. python hibernate_将Java/MVC/Hibernate webapp移植到Python
  4. linux locate 用目录,Linux 命令(文件和目录管理 - locate)
  5. java 枚举使用简书_java枚举类型使用和详解
  6. java中wait方法使用实例_java中wait、notify和notifyAll的概念用法和例子?
  7. 计算机应用基础参考答案,计算机应用基础与参考答案
  8. android应用内存分析,Android应用程序内存分析-Memory Analysis for Android Applications
  9. 每天一个linux命令(9):touch 命令
  10. 【深度学习笔记】ROC曲线 vs Precision-Recall曲线