1.一致性的定义
在分布式系统中,运行着多个相互关联的服务节点。
一致性是指分布式系统中的多个服务节点,给定一系列的操作,在约定协议的保障下,使它们对外界呈现的状态是一致的。换句话说,也就是保证集群中所有服务节点中的数据完全相同并且能够对某个提案(Proposal)达成一致。
在学习过程中,一度被分布式事务一致性和分布式数据一致性这两种说法搞混淆。实际上,两者是从两种不同的角度对一致性的描述。
在这里,事务(数据库事务的简称)是数据库管理系统中执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。
分布式事务一致性,指的是“操作序列在多个服务节点中执行的顺序是一致的”。
分布式数据一致性,指的是“数据在多份副本中存储时,各副本中的数据是一致的”。
保证了分布式事务的一致性,也就保证了数据的一致性。
2.一致性的分类
2.1 强一致性,通常用于私有链和联盟链,例如PBFT
当更新操作完成之后,任何多个后续进程或者线程的访问都会返回最新的更新过的值。这种是对用户最友好的,就是用户上一次写什么,下一次就保证能读到什么。
但是这种实现对性能影响较大,因为这意味着,只要上次的操作没有处理完,就不能让用户读取数据。
2.2 弱一致性
系统并不保证进程或者线程的访问都会返回最新的更新过的值。系统在数据写入成功之后,不承诺立即可以读到最新写入的值,也不会具体的承诺多久之后可以读到。但会尽可能保证在某个时间级别(比如秒级别)之后,可以让数据达到一致性状态。
2.2.1 最终一致性 通常用于公链
弱一致性的特定形式。系统保证在没有后续更新的前提下,系统最终返回上一次更新操作的值。在没有故障发生的前提下,不一致窗口的时间主要受通信延迟,系统负载和复制副本的个数影响。DNS是一个典型的最终一致性系统。
参考文章
https://zhuanlan.zhihu.com/p/35596768
http://www.hollischuang.com/archives/663