关于分布式:关于分布式系统共识的思考

37次阅读

共计 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

感兴趣的敌人能够搜一搜公众号「阅新技术」,关注更多的推送文章。
能够的话,就顺便点个赞、留个言、分享下,感激各位反对!
阅新技术,浏览更多的新常识。

正文完
 0