分布式中的“一致性”,到底指的是什么?
保留所有版权,请引用而不是转载本文(原文地址 https://yeecode.top/blog/111/ )。
众多的“一致性”
说到一致性,大家都不陌生。随着分布式系统、微服务系统、区块链等技术的发展,“一致性”一词出现的频率也越来越高。
然而,“一致性”这一词语所代表的概念却并不唯一。例如我们常听到“事务的一致性”、“最终一致性”、“一致性哈希”等,它们表述的并不是同一个概念。理解这点十分重要。如果错误地认为以上几个“一致性”都指同一个概念,那就搞混了。
在明确以上概念各不相同的基础上,我们介绍下分布式系统中的“一致性”(例如“最终一致性”中的“一致性”)到底指的是什么。
CAP一致性
我们所说的“最终一致性”中的“一致性(Consistency)”是说数据副本存放在分布式系统中的不同节点上,如果用户修改了系统中的数据,则在一定时间后,用户能从系统中读取到修改后的数据。
或者换一种说法,用户在分布式系统的某个节点上进行了变更操作,则在一定时间后,用户能从系统的任意节点上读取到这个变更结果。
因此,这里的“一致性”指的是针对分布式系统的各个节点对外的表现是一致的,就像是一个节点一样。
例如在图所示的分布式系统中存在大量的节点。我们设置a=5,这一操作可能落在任意一个节点上(图中所示写请求落在了节点A上),则在一定时间之后,访问系统一定能读到a=5(图中所示读请求落在了节点H上),则说明这个分布式系统满足一致性。
为了便于表述,我们将这种一致性称为“CAP一致性”。
要注意的是,我们虽然以同质节点(指这些节点运行同样的代码)进行了举例,但是CAP一致性对于异质节点同样也是成立的。例如分布式应用中存在异质的订单处理节点A和库存管理节点B。如果该分布式应用满足CAP一致性,则当我们向订单处理节点A发送生成新订单的请求一定时间后,能从库存管理节点B上读取到新订单引发的库存变化。
CAP一致性的强弱
在介绍一致性的概念时,我们说分布式系统满足一致性意味着用户通过某一个节点修改了数据,经过一定时间后,用户可以在任意节点上读取到修改后的数据。
为什么总要强调“经过一定时间后”呢?这个时间到底要多长呢?在这个时间之前读取又会得到怎样的结果呢?
解答上述一连串的问题便涉及到一致性的强弱概念。也正是根据一致性强弱的不同,我们把一致性分为了很多类。我们常见的,也是经常会用到的有:
- 严格一致性
- 顺序一致性
- 线性一致性
- 最终一致性
当然,还有很多的一致性级别,例如因果一致性、会话一致性、单调读一致性、单调写一致性等。
对于以上各个一致性级别的判别和证明,一句话说不明白。如果大家有兴趣可以参考下面的书籍。
书籍对各种一致性都进行了详细的介绍。对大家体系化地掌握这些知识很有帮助。
这本书对分布式系统相关的理论、实践、工程知识均进行了详细的介绍,层层递进,有助于大家建立完整的分布式系统知识体系。当然,书中也对各种“一致性”进行了分析。并且本书备受好评,以至于还发行了繁体版。
此外,一致性也有强弱之分。但要注意,这只是一个相对的概念。并不能明确地说明那些一致性属于强一致性,那些一致性属于弱一致性。网上确实有一些将某某一致性归为强一致性还是弱一致性的争论,则是没有太大意义的。因为强、弱是倾向性的概念,而没有确切的定义。
其他的一致性
以上我们们所述的都是CAP一致性。
而我们还会在其他场合见到“一致性”这个词语,如“事务的一致性”、“一致性哈希”。这个都和CAP一致性(也就是分布式系统中的一致性)不是一个概念,别搞混了。如果大家想要了解其他的一致性,并且对这些概念进行梳理,可以参考《分布式系统原理与工程实践》这本书籍。
好了,我是程序员易哥。
这回就说这么多!
可以关注我!等我下回接着说!
可以访问个人知乎阅读更多文章:易哥(https://www.zhihu.com/people/yeecode),欢迎关注。