保证数据一致性,通常指分布式系统里多个节点或缓存与数据库间的数据保持一致。主要技术分为两类:
一、数据库内部一致性(事务)
ACID
利用原子性、一致性、隔离性、持久性,通过锁 和 MVCC(多版本并发控制) 实现。MVCC能实现"读不阻塞写,写不阻塞读",避免传统锁的性能问题。
乐观并发控制
版本号机制为数据增加版本标识,更新时校验版本号是否变化。若版本号匹配则更新成功并递增版本,冲突时回滚或重试。
CAS(Compare-And-Swap)操作通过原子指令实现无锁更新。先读取旧值,计算新值,最后原子性地比较并替换,失败则重新尝试。
悲观并发控制
行级锁通过SELECT FOR UPDATE锁定特定记录,其他事务需等待锁释放。适合冲突频繁场景,但可能引发死锁。
表级锁直接锁定整张表,实现简单但并发度低。通常用于批量操作或维护任务。
二、分布式系统一致性
1. 共识算法
确保多个节点对数据状态达成一致,主要用于主备选举、分布式锁等。
-
Paxos:经典但实现复杂。
-
Raft:更易理解和实现,如 etcd、Consul。
-
ZAB:ZooKeeper 所用。
2. 分布式事务
跨多个独立数据库保证原子性。
-
两阶段提交 (2PC):强一致,但性能差,有单点风险。还有三阶段提交 (3PC) 改进版。两阶段提交(2PC)是最常见的分布式事务协议。协调者先发送准备请求,参与者执行事务但不提交,返回准备就绪状态。协调者收到所有参与者的确认后,发送提交指令。三阶段提交(3PC)在2PC基础上增加超时机制和预提交阶段,降低阻塞概率。参与者超时未收到指令可自动提交或中止,提高系统可用性。
-
TCC (Try-Confirm-Cancel):性能较好,但业务侵入强,需实现预留、确认、取消三个接口。
-
SAGA:通过一系列本地事务加补偿机制实现,适合长事务。
3. 副本一致性协议
-
主从复制:包括同步、半同步、异步复制,异步有数据丢失风险。主节点处理写请求,异步或半同步复制到从节点。半同步模式确保至少一个从节点接收数据后才返回成功。多主复制允许多个节点接受写入,通过冲突检测算法解决数据分歧。常见方案包括最后写入获胜(LWW)或应用层合并策略。
-
Quorum 机制 (NWR):通过设定节点数(N)、写副本数(W)、读副本数(R)且 W+R > N,保证读写重叠,读到最新数据。
三、缓存与数据库一致性
常见于先更新数据库,再删除缓存。要避免先删缓存、后更新数据库导致的并发脏数据问题。可采用订阅数据库变更日志 (CDC,如 Canal) 来异步更新缓存,或用分布式事务(如 Seata)保证强一致。
四、其他技术
-
数据校验机制:CRC校验码为数据块生成校验值,传输或存储后重新计算比对。检测到不一致时触发修复流程。Merkle树通过叶子节点哈希值逐层计算根哈希,快速定位差异数据块。常用于分布式系统数据同步验证。
-
分布式锁 (Redis/ ZooKeeper):控制并发访问。
-
CRDT (无冲突复制数据类型):允许不协同直接合并,适合分布式协作应用。
-
最终一致性:通过异步修复和后台校验实现,如 DNS、比特币账本。
-
消息队列可靠: 消息中间件保证数据一致性的核心思路,是将"本地事务"与"消息发送"绑定为一个原子操作,再结合可靠的投递与消费机制,最终实现分布式系统中的最终一致性。
核心权衡:
-
强一致性:读到的永远是最新数据,但延迟高、可用性低。
-
最终一致性:允许短暂不一致,系统吞吐和可用性高。