
复杂业务系统中,你或许面临多种权限、多种状态的业务数据,不得不存在多种存储选型。
多份存储的数据如何保障数据一致性,是作为系统架构设计师必须解决的问题。
数据一致性定义了数据的更新顺序和可见性规则。不同的业务对数据一致性要求不同,例如金融在线业务对数据一致性高,互联网内容点赞、评论等对大多只要求最终一致性。
在聊数据一致性之前,首先抛转引起,说说几种分布式理论:ACID(原子性、可用性、隔离性、持久化)、CAP(一致性、可用性、分区容错性)、BASE(基本可用、软状态、最终一致性, 其中软状态是系统允许数据在一段时间内存在中间状态,但保持最终一致性),BASE 是对 CAP 中一致性 C 和可用性 A 权衡的结果,是互联网大规模分布式数据基于CAP理论实践得出。ACID和CAP中的各项指标在实际业务难以全部满足,例如,保障强一致性必然一定程度损耗可用性。
操作顺序与与实际发生的顺序一致并且操作立即可见,一般用分布式事务解决raft协议和paxos协议保障,是分布式系统重用户最希望看到的状态。线性一致性(linearizability),也称为原子一致性(atomic consistency),强一致性(strong consistency),立即一致性(immediate consistency) 或外部一致性(external consistency )
线性一致性提供了什么保证?



综上,得出以下几点结论(上面序列图片可以参考书籍DDIA)
顺序一致性相对放松,对于写操作不要求严格按时间排序,对于读操作只要求所有客户端观察到的顺序一致;客户端发送的更新命令,服务端会按它们发送的顺序执行。
Zookeeper 通过主节点执行所有写操作,从节点复制修改操作,这样所有节点的更新顺序都和主节点相同,不会出现某个节点的更新顺序与其它节点不同的情况。但是Zookeeper 允许客户端从从节点读取数据,因此如果客户端在读取过程中连接了不同的节点,则顺序一致性就得不到保证了,基于这个原理也就能理解kafka能保障同一分区中数据一致性。

如上图,主节点的 X=2 消息还没有同步到 Follower 2,此时如果有两个客户端:
2 -> 11 -> 2上述情况利用 zookeeper “单一视图”的保证,保证在连接到 Follower 2 后,不会连上状态更老的 Follower 1,即可保障数据满足顺序一致性。
相较于顺序和线性一致性,因果一致性就简单一些,其实就只要满足在 Lamport 时钟中提到的happen-before关系即可:
happen-before的记号。happend-before关系是满足传递性的,即:如果 a→b 且 b→c,那么也一定有 a→c。下面以朋友圈的举例:
最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。最终一致性的保障方式有异步复制、消息队列、分布式事务(raft、paxos);当用户从异步从库读取时,如果此异步从库落后,他可能会看到过时的信息。这种不一致只是一个暂时的状态——如果等待一段时间,从库最终会赶上并与主库保持一致。这称为最终一致性;最终一致性模型的实现通常依赖于一些复制策略,如 Dynamo 系统中的优先列表(preference list)和一致性哈希(consistent hashing),以及一些分布式事务处理技术如 TCC,或者一致性协议如 ZooKeeper 的 ZAB 等。
业界比较推崇是最终一致性级别,那实现最终一致性的具体方式是什么呢? 《分布式协议与算法实战》open in new window 中是这样介绍:
想要了解分布式理论更多的理论知识可参考下面书籍清单:
《分布式协议与算法实战》
《数据密集型应用系统设计》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。