一致性问题
一致性算法是用来解决一致性问题的,那么什么是一致性问题呢? 在分布式系统中,一致性问题(consensus problem)是指对于一组服务器,给定一组操作,我们需要一个协议使得最后它们的结果达成一致. 更详细的解释就是,当其中某个服务器收到客户端的一组指令时,它必须与其它服务器交流以保证所有的服务器都是以同样的顺序收到同样的指令,这样的话所有的 服务器会产生一致的结果,看起来就像是一台机器一样.
实际生产中一致性算法需要具备以下属性:
- safety:即不管怎样都不会返回错误的结果
- available:只要大部分的机器正常,就仍然可以工作.比如五台机器的集群允许最多两台机器坏掉.
- 不依赖时间来确保一致,即系统是异步的.
- 一般情况下,运行时间由大多数的机器决定,不会因为有少部分慢的机器而影响总体效率.
为什么要解决一致性问题?
我们可以说一个分布式系统可靠性达到99.99...%,但不能说它达到了100%, 为什么? 就是因为一致性问题是无法彻底解决的. 以下四个分布式系统中的问题都与一致性问题有关:
- reliable multicast 可靠组播
- membership protocal (failuer detector) 集群中成员的管理
- leader election 选举算法
- 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把一致性问题分解成为三个小问题:
- leader election 选举
- log replication 日志复制,同步
- 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. 这个状态持续到发生下面三个中的任意事件:
- 它赢得选举
- 另外有Server获得选举
- 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
相关推荐
分布式一致性协议,例如Paxos和Raft,就是为了解决分布式系统中的状态一致性和数据一致性问题而设计的算法,它们通过复杂的协议机制,在各种复杂的网络环境下,尽可能保证系统的一致性。 微服务架构是另一种解决...
### 分布式一致性算法Raft协议 #### 一、引言与背景 在现代信息技术领域,随着业务规模的不断扩大和用户需求的日益增长,分布式系统因其高可用性和可扩展性而变得越来越重要。然而,分布式系统面临着一系列挑战,...
分布式事务和一致性算法是分布式系统设计中的核心问题,尤其在当今高度依赖分布式计算和存储的场景中。分布式事务与一致性算法Paxos、Raft和ZAB是解决分布式系统中数据一致性的代表性算法,它们能够确保在网络分区、...
Yac的设计灵感来源于Raft一致性算法,它以易于理解和实现而著称。与Paxos相比,Raft通过选举领导者和日志复制的方式,简化了分布式一致性问题。Yac在此基础上进行了一些优化,使其更适用于现代云原生环境。 首先,...
2013年,斯坦福的两个人以易懂为目标,设计了一致性算法 Raft,现在已经被广泛应用,比较有名的是etcd,Google的Kubernetes就使用了etcd作为他的服务发现框架 什么是分布式一致? 在单节点环境中,client向...
通过上述分析,我们可以看到Raft算法通过简单直观的方式来解决了分布式系统中的一致性问题。与Paxos相比,Raft不仅易于理解和实现,而且在实际应用中也更加高效可靠。当前,几乎所有主流编程语言都有支持Raft算法的...
Raft分布式算法是一种由斯坦福大学提出的一致性算法,目的是为了更容易地理解和实现分布式系统中的一致性协议。传统的Paxos算法虽然功能强大,但因其复杂性难以被广泛实现和运用。Raft算法强调了协议的可理解性和...
在分布式数据库领域,选择合适的分布式一致性算法对于保证系统的稳定性和可靠性至关重要。强一致性和弱一致性算法各有优劣,需要根据具体的应用场景和需求来选择最合适的算法。例如,对于对数据实时一致性要求较高的...
综上所述,Raft一致性算法通过其独特的设计理念和实现方式,成功地解决了传统一致性算法中存在的复杂性和难于实现的问题。它不仅在学术研究领域获得了高度认可,在工业界的应用也越来越广泛。随着技术的发展,Raft...
例如,Paxos和Raft等共识算法是解决分布式系统一致性问题的常用算法。而一致性检测算法则是在数据复制过程中监控数据状态,并在发现数据副本间存在不一致时,能够及时地检测并进行修正。 廖彬、张陶、李敏、于炯、...
Raft算法是一种广泛使用的分布式一致性算法,可以解决分布式系统中的数据一致性问题。Raft算法的核心思想是使用 leader 选举机制和心跳机制来实现分布式系统中的数据一致性。 结论 本文对分布式关系数据库的概念、...
本项目是一个基于Raft协议的分布式一致性系统,旨在通过Raft算法实现高可用性和数据一致性。Raft是一种用于管理复制日志的共识算法,它通过选举领导者节点来确保集群中的所有节点保持一致状态。 项目的主要特性和...
raft 原文,可以帮助我们深刻理解raft 分布式算法的原理。
本项目是一个基于Raft协议的分布式一致性系统,旨在通过Raft算法实现分布式系统中的数据一致性和高可用性。项目包含了Raft协议的核心实现,包括领导选举、日志复制、快照安装等功能,并提供了客户端与服务端的RPC...
Raft 为什么是更易理解的分布式一致性算法
Raft是一种基于共识的分布式数据库协同算法,用于解决分布式系统中的Leader选举、日志复制、故障恢复等问题。Raft算法在Neo4j集群中的实现,使得Neo4j能够提供高可用性和高性能的分布式数据库服务。 Raft算法的核心...
2. 分布式一致性:这是分布式算法中的核心问题,包括Paxos、Raft等一致性算法,它们保证了多个节点间数据的一致性和可靠性。 3. 分布式共识:如何在存在网络故障的情况下达成共识,例如选举主节点或决定全局状态,...