共计 2401 个字符,预计需要花费 7 分钟才能阅读完成。
分布式系统的挑战
在后面的文章里,咱们剖析了分布式系统在业务上的一致性技术,即分布式事务,它的后果导向是面向用户的。然而在咱们的零碎外部,有时也须要面对来自软件架构等更高层次上的一致性要求,比方 Redis 的哨兵模式,Zookeeper 的选举过程等。它们所思考的一致性更多的是服务节点之间一个 共识
的达成,当共识达成之后,就能够以此为领导准则,开展更多的协同操作。
在钻研怎么达成共识之前,咱们先来剖析下分布式系统的个性:
并发
: 不同节点上的过程是可能同时执行的,咱们须要协调机制去实现各个阶段工作。全局时钟
: 在分布式系统里,根本很难去保护一个全局时钟,各个服务器在工夫程序上是没有相对的。故障影响
: 不存在没有故障的零碎,须要思考对系统的整体影响,以及零碎所能提供的容错解决能力。消息传递
:因为网络的简单环境,节点与节点之间的通信有可能达到,也可能局部达到,可能在已知的工夫范畴内传送,也可能无限期提早,这都是不肯定的。
由此可见,对于在一个分布式系统里想达成共识的挑战在于 协调 、 容错 、 非确定通信。
状态复制
如果说咱们想在一个零碎中引入协调者的话,那么非常简单,引入一个有状态的组件即可,通过状态的判断来保障以后零碎应该处于哪个业务阶段。一个有状态的组件是很好实现的,只有带长久化性能即可,像 Mysql,MongoDB。不过,思考到协调者的重要性,咱们往往是须要保障它高可用性的,为了达到这一目标,咱们会在状态的更新过程中退出复制流程。比方将更新后的值,同步给其余机器。
然而,是否须要所有的机器都复制到位了,能力实现此次的更新流程?不肯定,像 Mysql 同步复制、异步复制、半同步复制就是在性能与数据一致性上给咱们提供了多种抉择,只是复制的执行效率越高,数据一致性就越低。
像咱们这种协调者更新频率低,数据量小,则往往会采纳 多数遵从少数 的策略,只有同步节点超过了一半,那么就能够认为此次写入胜利了。Raft 的日志同步,Zookeeper 的音讯播送就是这么解决的。除此之外,为了保障同步的正确性,还会引入 选举 机制,让选举进去的 Leader 节点对立解决同步后果。当 Leader 节点故障或下线时,将会依据肯定的规定进行从新选举(比方日志的最新提交水平),保证系统的失常运行。
故障解决
在下面达成共识的办法里,势必要思考故障的影响,而对应的故障类型次要有两种:
解体故障
:节点忽然解体并进行对其余节点的响应拜占庭失败
:节点是不可信赖的,将会响应谬误的音讯给其余节点
针对于 解体故障
这种类型的失败,咱们能够像 Raft,Paxos 协定一样,通过选举来解决。然而像 拜占庭失败
这种问题就比拟难解决了,因为有可能存在反叛的节点,使得整个零碎往谬误的方向去达成共识,不言而喻,这不是咱们想要的。所以咱们会在区块链里看到如下的解决算法:
PBFT(Practical Byzantine Fault Tolerance)
:拜占庭容错算法 (联盟链 / 公有链应用此算法)PoW(Proof of Work)
:工作量证实算法 (比特币和以太坊应用此算法)
FLP 不可能原理
对于分布式系统之间的通信模型,总体上能够划分上面这两种类型:
- 同步:零碎解决音讯的工夫是在规定范畴内的,一旦超出,则间接认为失败。
- 异步:零碎解决音讯的工夫是不定的,有可能获取到后果,也可能始终获取不到了。
其中,在 异步
通信模型下,有一个驰名的 FLP 不可能原理
,即:
在网络牢靠、但容许节点生效(即使只有一个)的最小化异步模型零碎中,不存在一个能够解决一致性问题的确定性共识算法
FLP 不可能原理通知咱们,不要浪费时间为异步分布式系统设计任意场景的共识算法。咱们应该将精力放在一个有束缚、有终止条件的分布式系统中,如果咱们设计的算法尽可能的满足以下两个条件,那么咱们的零碎将将会有共识的输入:
- 活性:每个非故障节点最终将会决定输入某个值,如果节点不做决定,那么零碎就会进行。
- 平安:所有非故障节点最终将会输入雷同的值,如果达不到该成果,那么一致性很难保障。
共识的达成
不同的算法对下面的条件形容会不一样,从狭义上来讲,共识算法通常会进行以下三种角色的划分:
提议者
:通常被称为领导者或协调者接受者
:响应提议者提出的议案学习者
:不参加决策,学习决定的最终值
当角色职责划分好后,咱们会通过以下三个步骤来定义一个共识算法:
第 1 步 选举: 当有内部事件触发时,由领导者提出下一个无效的输入值。
第 2 步 投票: 非故障节点接管到领导者提议的值后,对其验证,并将其提议为下一个有效值。
第 3 步 决定: 依据有效值在各个非故障节点的提议后果,决定是否采纳该值;否则从新开始步骤 1
对于以上的步骤,不同的共识算法会有一些差别,比方术语定义、投票解决流程、有效值的决定规范等。
利用
分布式系统共识的达成须要在不牢靠、不可信的网络里实现。如果不进行所谓的 拜占庭容错,那么咱们的 raft、zookeeper 协定就足够了,而它们的利用场景往往也是在内网之中,所以默认外部节点都是可信的。如果咱们要在蕴含歹意行为的凋谢的网络群体里达成共识,例如区块链,那么咱们就不得不解决思考以下三种状况的欠缺了:
- 合理化:参与者依据利益最大化的策略去抉择协定的执行。
- 利它式:执行的过程中,能思考整体的利益。
- 拜占庭式容错:能抵制某些节点歹意的行为,保证系统失常运行。
总结
分布式系统达成共识的过程须要有 活性
和平安
的保障,其协商一致机制也须要将拜占庭谬误思考进去。共识问题的解决让咱们的分布式系统运行的更加强壮,也正是因为共识的重要性,当今区块链技术才显得额定的重要!
参考
- [1]consensus in distributed systems
- [2]let’s take a crack at understanding distributed consensus
感兴趣的敌人能够搜一搜公众号「阅新技术」,关注更多的推送文章。
能够的话,就顺便点个赞、留个言、分享下,感激各位反对!
阅新技术,浏览更多的新常识。