鉴于这些固有的困难,分布式数据库提供了一系列一致性模型,每种模型都提供不同的数据可见性和顺序性保证。一致性模型的选择通常涉及一致性、可用性和分区容忍度(CAP 定理)之间的权衡。
强一致性(线性化/严格序列化):这是一致性的终极目标。它保证所有客户端都能看到最新提交的写入,并且操作似乎以单一、全局、实时的顺序执行。如果操作 A 在操作 B 开始之前完成,则 B 必须看到 A 的结果。这是最严格的一致性形式,通常通过分布式锁定或共识协议(例如 Paxos、Raft)等机制实现。强一致性虽然能够提供最高的数据完整性,但通常以降低可用性和增加延迟为代价,尤其是在网络分区期间。
最终一致性:另一端是最终一致性。在这种情况下,如果没有对给定数据项进行新的更新,最终对该项的所有访问都将返回最新的更新值。无法保证何时实现一致性。不同的副本可能会暂时保存不同的值。该模型具有高可用性和分区容忍性,因此适用于可以接受数据过时的系统(例如,社交媒体信息流、用户个人资料)。但是,它要求开发人员注意读取可能过时的数据。
因果一致性:该模型介于强一致性 保加利亚电话营销数据 和最终一致性之间。它保证如果一个操作因果关系先于另一个操作,则所有进程都将按该顺序观察它们。但是,并发操作(非因果关系)可能会被不同的进程以不同的顺序观察到。这通常通过跟踪操作之间的依赖关系来实现。例如,如果用户发表评论,然后回复,则回复必须在原始评论之后显示。
读你所写的一致性:保证写入数据的用户能够立即看到自己的写入,即使其他用户可能无法看到。这是用户体验的常见要求,因为它可以防止用户感觉自己的操作没有被记录。
单调阅读:如果一个进程读取了一个值,则该进程后续的读取将不会返回旧值。这可以防止单个客户端“回到过去”。
有限陈旧性:该模型对数据的陈旧程度进行了量化限制。例如,系统可以保证数据的陈旧程度不超过 5 秒,或者主数据库的更新次数不超过 100 次。