以数据为中心的一致性模型可以分为两类,强一致性模型和弱一致性模型,强和弱又分别有几种形式,最强的一致性是严格一致性,然而它实际上几乎不可能在分布式系统中实现,所以我们在这里只简单说一下
严格一致性需要有一个绝对的全局时钟,任何写操作都应该被所有进程的读操作所见
而线性一致性只需要保证操作顺序的全局一致就行了,并不依赖于全局时钟,而是通过一些其他的机制,比如raft的日志和数据需要多个节点同步后才返回给读请求来达成这种原子的操作顺序
强一致性模型
1.线性一致性
定义:
- 所有操作必须按照原子的全局操作顺序发生,即 一个写入完成后,后续的读必须能看到这个写入。
- 不允许回溯,即如果一个进程已经读取了某个值,其他进程的后续读不能再看到比这个值更旧的数据。
关键点:
- 写操作的提交是原子的,一旦写入完成,所有后续读都会看到最新数据。
- 常见于分布式存储系统,如 Raft、ZooKeeper、etcd,确保多个副本在强一致性环境下同步。
2.顺序一致性
定义:
- 所有进程必须看到相同的全局执行顺序,但这个顺序不一定要符合实际时间顺序。
- 进程的操作顺序必须被所有进程一致地观察到,但不同进程的时间顺序可以被调整。
关键点:
- 保证所有进程看到的操作顺序是一致的,但这个顺序可能与实际发生的顺序不同。
- 比线性一致性弱,因为它不要求所有读操作都必须看到最新写入的值。
- 常见于多处理器系统和分布式共享内存模型,用于弱一致性优化。
3.串行化一致性
定义
- 多个事务的执行结果,必须等价于某种串行执行顺序,但不要求和真实时间顺序一致。
- 事务可以并发执行,只要最终结果和某个“所有事务依次串行执行的结果”相同。
关键点
- 只要最终结果等价于某个串行顺序,就符合可串行化。
- 事务内部的操作可以乱序执行,但最终必须等价于某个串行执行。
- 常见于数据库事务(如 SQL 可串行化隔离级别)。
弱一致性模型
1.因果一致性
- 只要求 因果相关的操作 按照一致的顺序执行,而 无关的操作 可以乱序执行。
- 例如,社交网络中 A 先点赞,B 再评论,那么所有人都必须看到点赞发生在评论之前。
- 代表系统:Causal+ Consistency,IBM Causal Memory。
2.最终一致性
- 最终一致性保证如果没有新的写入发生,所有副本最终会收敛到相同的值,但在短时间内不同节点的读可能返回不同的值。
ETCD与ZOOKEEPER的一致性对比
etcd
采用raft协议来保证一致性,天然实现线性一致性,即每个读操作都会读到最新的值,每个操作都满足单一的全局历史,在raft协议内部,这个单一的全局历史就是一个日志系统,超过半数状态机相同的且具有最新任期的日志就是这个全局历史。
zookeeper
采用ZAB协议来保证一致性,虽然ZAB协议保证线性一致性,但是与etcd的每个集群的核心节点负责读写不同,zookeeper的跟随者节点也负责读,这样就导致它在默认情况下只具有写操作的线性一致性,和读操作的最终一致性。不过zookeeper也提供了sync()方法,可以使跟随者读操作前向l核心节点确定自己数据是否最新来达成线性一致性