常见分布式协议和算法的说明和对比( 二 )


8 条荒谬的分布式假设Fallacies of Distributed Computing 是英文维基百科上的一篇文章,讲的是刚刚进入分布式计算领域的程序员常会有的 8 条假定,随着时间的推移,每一条都会被证明是错误的,也都会导致严重的问题,以及痛苦的学习体验:

  • 网络是稳定的 。
  • 网络传输的延迟是零 。
  • 网络的带宽是无穷大 。
  • 网络是安全的 。
  • 网络的拓扑不会改变 。
  • 只有一个系统管理员 。
  • 传输数据的成本为零 。
  • 整个网络是同构的 。
为什么我们要深刻地认识这 8 个错误?是因为,这要我们清楚地认识到,在分布式系统中错误是不可能避免的,我们能做的不是避免错误,而是要把错误的处理当成功能写在代码中 。这 8 个需要避免的错误不仅对于中间件和底层系统开发者及架构师是重要的知识,而且对于网络应用程序开发者也同样重要 。分布式系统的其他部分,如容错、备份、分片、微服务等也许可以对应用程序开发者部分透明,但这 8 点则是应用程序开发者也必须知道的 。
常见分布式算法的对比从拜占庭容错、一致性、性能和可用性四个纬度来分析如下(来自极客时间-韩健-分布式协议与算法实战):
常见分布式协议和算法的说明和对比

文章插图
 
一般而言,在可信环境(比如企业内网)中,系统具有故障容错能力就可以了,常见的算法有二阶段提交协议(2PC)、TCC(Try-Confirm-Cancel)、Paxos 算法、ZAB 协议、Raft 算法、Gossip 协议、Quorum NWR 算法 。而在不可信的环境(比如有人做恶)中,这时系统需要具备拜占庭容错能力,常见的拜占庭容错算法有 POW 算法、PBFT 算法 。
采用 Gossip 协议实现的最终一致性系统的可用性是最高的,因为哪怕只有一个节点,集群还能在运行并提供服务 。其次是 Paxos 算法、ZAB 协议、Raft 算法、Quorum NWR 算法、PBFT 算法、POW 算法,它们能容忍一定数节点故障 。最后是二阶段提交协议、TCC,只有当所有节点都在运行时,才能工作,可用性最低 。
采用 Gossip 协议的 AP 型分布式系统,具备水平扩展能力,读写性能是最高的 。其次是 Paxos 算法、ZAB 协议、Raft 算法,因为它们都是领导者模型,写性能受限于领导者,读性能取决于一致性实现 。最后是二阶段提交协议和 TCC,因为在实现事务时,需要预留和锁定资源,性能相对低 。
2PC【强一致性】两阶段提交(2PC,Two-phase Commit Protocol)是非常经典的强一致性协议,在各种事务和一致性的解决方案中,都能看到两阶段提交的应用,二阶段提交协议,不仅仅是协议,也是一种非常经典的思想 。2PC 的流程就是第一阶段做投票,第二阶段做决定的一个算法 。
二阶段提交在达成提交操作共识的算法中应用广泛,比如 XA 协议、TCC、Paxos、Raft 等 。Paxos、Raft 等强一致性算法,也采用了二阶段提交操作,在“提交请求阶段”,只要大多数节点确认就可以,而具有 ACID 特性的事务,则要求全部节点确认可以 。所以可以将具有 ACID 特性的操作,理解为最强的一致性 。
三阶段提交协议(3PC,Three-phase_commit_protocol)是在 2PC 之上扩展的提交协议,主要是为了解决两阶段提交协议的阻塞问题,从原来的两个阶段扩展为三个阶段,增加了超时机制 。但目前两阶段提交、三阶段提交存在如下的局限性,并不适合在微服务架构体系下使用:
  • 所有的操作必须是事务性资源(比如数据库、消息队列),存在使用局限性
  • 由于是强一致性,资源需要在事务内部等待,性能影响较大,吞吐率不高,不适合高并发与高性能的业务场景;
Paxos【强一致性】Paxos 算法基本上来说是个民主选举的算法——大多数的决定会成个整个集群的统一决定 。任何一个点都可以提出要修改某个数据的提案,是否通过这个提案取决于这个集群中是否有超过半数的结点同意(所以Paxos算法需要集群中的结点是单数) 。兰伯特提出的 Paxos 算法包含 2 个部分: