——本文是作者自己原创编写的电子书中的部分章节,在此分享给各位CSDN的读者。
接上篇
3.3 共识
一些资料会把「共识」和「一致性」混在一起不做区分,这二者在一些场景也确实可以不作区分,不过实际上它们是有强关联的两个不同概念。一致性是说所有节点的数据在某一个时刻的是否一致的状态,而共识是为了保证某一笔交易在所有节点上达成一致结果的过程。换句话说,共识会部分地解决一致性问题。
有效的共识需要具备以下特性:
- 认同性(Agreement):所有非故障节点都认同一次共识的结果;
- 合法性(Validity):共识的结果必须是参与共识的节点提出的;
- 可终止性(Termination):共识的过程在一定时间内结束,而不会无休止地执行下去。
在一个理想的网络环境中要实现这样的共识,看起来并不难。但是当考虑到网络异常、节点故障等情况时,系统还能针对每一笔提议达成共识并不是一件很容易的事情。
同步系统 VS 异步系统
根据是否存在全局时钟,可以将分布式系统分为\textbf{同步系统}和\textbf{异步系统}。相应的,分布式系统的共识算法也有同步共识算法和异步共识算法。
满足下列三个条件的系统是同步系统,否则就是异步系统:
- 各节点的时钟差有限;
- 网络传输延迟有限;
- 节点处理时间有限。
同步系统的共识问题显然要比异步系统更容易解决,在异步系统中能正常运行的共识,到同构的同步系统中也能正常运行,但反过来却不一定成立。
随着分布式技术的发展,很快就出现了一些可行的同步系统的共识算法,但是却一直没有公认可行的异步系统的共识算法,很多人曾试图挑战这一难题但都失败了,直到 FLP 原理横空出世。
FLP 原理
1985年,Michael J ⋅ \cdot ⋅ Fisher,Nany A