给定一些涉及操作与状态的规则,随着操作的演进,系统将一直遵循这些规则。我们把这样的规则称为一致性模型。
一致性一般是指没有矛盾,是正确的。所以回到我们平时说的一致性,我们讨论一致性的概念时,”规则“具体所指是我们首先要理解的。
- 数据库 ACID 的一致性,也称之为内部一致性
事务开始前和结束后,数据库的完整性约束没有被破坏 。比如 A 向 B 转账,不可能 A 扣了钱,B 却没收到。在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。 这里的一致性是指系统从一个正确的状态, 迁移到另一个正确的状态, 这是个逻辑层面的正确性。
- 分布式 CAP 的一致性,这个一致性一般是指线性一致性, 等同于Linearizability, 强一致性。
在分布式系统中,写操作后再读,就必须返回写入的值。比如分布式数据库A、B、C,A 中写入数据 hello,写完马上读 B 和 C,就一定要读出 hello,读出来我们就称之为符合一致性。
- 两者区别,ACID中的C一致性注重于事务前后数据的完整性; 而CAP中的C一致性则注重于读写数据值相对于操作序列是否正确
- BASE 理论的 最终一致性, Eventually consistent, 一般指的是内部一致性不是强一致的, 系统存在中间的状态。这个状态对于业务来说是可以接受的。比如在订单系统中存在扣了钱但订单还没能生成,但最终通过消息队列与幂等等手段,可以确保状态最终是正确的。
- 相对线性一致性而言的, 时序上还有其他的弱一些的一致性:具体有 Sequential consistency / Causal consistency / Read-your-writes consistency / Session consistency / Monotonic read consistency / Monotonic write consistency 等不同的一致性模形
- 顺便提下raft / paxos 这些算法,这些是共识算法 (consensus algorithmi)。一种说法,它不是时序上的一致性协议,但可以做为基础算法来实现时序一致性协议。但从另一层面上,它提供了在时序上可以提供total order broadcast, 比线性一致性 等价的 SCD broadcast 要更为严格一些。所以共识算法能用来实现线性一致性的系统
随着互联网业务规模变大,基本上上点规模的业务后端都是跑在分布式的服务上,这就避免不了分区问题产生,或者短暂分区产生(服务间时延变大)。为了更高的可用性,更大的吞吐量,只好在正确性方面做了取舍,放弃强一致性,选择弱一致性。放弃了传统数据库的事务模型,选择了数据在某些时间点看起来是不正确的,但经过一段时间后,数据会通过其它手段被同步到正确的状态。
htner:分布式一致性算法对比 - Raft VS Paxoszhuanlan.zhihu.com