这是我参与「第四届青训营 」笔记创作活动的第9天,学习了一致性的相关算法熟悉了raft等相关框架,但还在整理中,故先将概念记录并分享出来。
浅谈分布式一致性
分布式面临的挑战
分布式系统(distributed system)是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。
- 数据规模越来越大
- 服务可用性要求越来越高
- 快速迭代的业务要求,系统足够易用
理想中的分布式系统
- 高性能:可扩展、低时延、高吞吐
- 正确:一致性、易于理解
- 可靠:容错、高可用
一致性共识算法
强一致性(原子一致性,顺序一致性)
-
任何一次读都能读到某个数据的最近一次写的数据。
-
系统中的所有进程,看到的操作顺序,都和全局时钟下的顺序一致。
简言之,在任意时刻,所有节点中的数据是一样的。例如,对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一致性。
弱一致性
数据更新后,如果能容忍后续的访问只能访问到部分或者全部访问不到,则是弱一致性。
最终一致性
不保证在任意时刻任意节点上的同一份数据都是相同的,但是随着时间的迁移,不同节点上的同一份数据总是在向趋同的方向变化。简单说,就是在一段时间后,节点间的数据会最终达到一致状态。
共识(Consensus)
在介绍共识协议之前,我们要来聊聊它的三个属性。
- 正确性(Validity):诚实节点最终达成共识的值必须是来自诚实节点提议的值。
- 一致性(Agreement):所有的诚实节点都必须就相同的值达成共识。
- 终止性(Termination):诚实的节点必须最终就某个值达成共识。