最终一致性VS顺序一致性VS线性一致性(了解)
最终一致性VS顺序一致性VS线性一致性(了解)
在分布式系统设计中,一致性模型是一个核心概念。它定义了多个节点之间数据同步的规则。本文简单学习一下最终一致性、顺序一致性、线性一致性模型。
最终一致性
最终一致性是最弱的一致性模型,它只保证数据在多个节点上在最终的情况下是一样的,但是在这之间,各个节点上这些数据到来的顺序,到来的时间都是不确定的。客户端可能会读取到旧值,不同的客户端读取的数据顺序也可能不一样。
业务场景:
实时性一致性要求不高的业务可以使用到最终一致性。
- 分布式的缓存和数据库之间的数据一致性。
- 用户动态博客、点赞数量、好友关注等。
- 库存计数。
- 日志数据等
顺序一致性
顺序一致性比最终一致性的保证略强一点,它要求所有客户端看到的服务的顺序是一致的,这个顺序可能不以时间为顺序,但是所有人看到的顺序都是一样的。比如一个客户端对数据进行了两次增加A和B。从服务器1上先同步到了A,然后是B;从服务器2上先同步到了B,然后是A,两个客户分别从1和2服务器上读取数据,一个客户是先A再B,一个客户是先B再A。虽然它们最终得到的数据都是A和B,但是违反了顺序一致性。客户端依旧可能读取到旧值。
业务场景:
- 分布式锁。Zookeeper实现分布式锁中,如果没有顺序一致性,可能会导致多个客户端同时认为自己获得到了锁。
线性一致性
线性一致性比顺序一致性还要强,除了所有客户端看到的多个服务器节点的数据顺序是一致的,而且保证,只要数据更新了,那么客户端就能立马读取到最新值。不会读取到旧值。要实现这个一致性,就需要很大的代价了。
一致性模型 | 客户端观察顺序一致 | 是否读取最新值 | 性能开销 | 典型系统或协议 |
---|---|---|---|---|
最终一致性 | ❌ 不保证 | ❌ 可能读旧值 | ✅ 性能最高 | 缓存系统, DynamoDB |
顺序一致性 | ✅ 保证 | ❌ 不一定最新 | ⚠️ 中等 | ZooKeeper, 多核内存模型 |
线性一致性 | ✅ 保证 | ✅ 总是最新 | ❌ 性能最低 | Raft, Paxos, Etcd |