共识算法是分布式系统中最重要和最广泛使用的机制之一。 该算法旨在实现不同服务器之间的一致性。 自上世纪末以来,一批研究人员从系统模型(同步系统或异步系统)、故障模型(崩溃故障或拜占庭故障)等不同角度探讨了共识问题,并提出了许多有效的算法,例如 Paxos、ZAB、PoW、PoS、Raft 等。
1. 拜占庭容错(BFT)VS 崩溃容错(CFT)
根据容错能力的不同,共识算法可以分为CFT(崩溃容错)和BFT(拜占庭容错)共识算法。
CFT共识算法仅在分布式系统中的节点出现宕机错误、系统中的节点违反共识协议时(如被黑客捕获、数据被恶意篡改、 等),将无法保证分布式系统的可靠性,因此,CFT共识算法目前主要应用于企业内部的封闭式分布式系统。 目前流行的CFT共识算法主要包括Paxos算法及其衍生的Raft共识算法。
采用BFT共识算法的分布式系统,即使系统中的节点发生任何类型的错误,只要错误发生在小于一定比例的节点中,就可以保证整个系统的可靠性。 因此,在开放的分布式系统中,例如区块链网络,必须采用BFT共识算法。
2. 强一致性 VS 弱一致性
根据客户端与系统的不同副本交互时可以观察到的结果,一致性模型可以分为强一致性和弱一致性。
1、强一致性
当更新操作完成后,后续多个进程或线程的任何访问都会返回最新更新的值。 这是最方便用户的,即用户上次写什么,下次就保证能读到什么,但这种实现方式对性能影响较大。 Paxos、Raft 等共识算法满足强一致性模型。
2、弱一致性
系统不保证后续进程或线程访问会返回最新更新的值。 数据写入成功后,系统不承诺立即读取最新写入的值,也不具体承诺多长时间能够读取。 但它会尽力确保在一段时间(比如几秒)后,数据能够达到最终的一致状态。 弱一致性的一种具体形式是最终一致性。 系统保证在没有后续更新的前提下,系统最终会返回上次更新操作的值。 在不发生故障的前提下,不一致窗口的时间主要受通信延迟、系统负载和副本数量的影响。 DNS是一个典型的最终一致系统。
3. 无领导者 VS 基于领导者
对于无领导(对称)算法。 所有服务器具有相同的角色。客户端可以联系任何服务器。 典型的Leader-less共识算法是gossip。
对于基于领导者(非对称)的算法。 一台服务器通常负责管理集群的所有操作,而其他服务器则处于从属状态。 客户与领导沟通。 典型的基于 Leader 的共识算法是 Paxos 和 Raft。