分布式数据库的一致性:最终一致性与强一致性解析
一、最终一致性数据库
1.1 Merkle树的应用
Merkle树构建完成后,可用于高效比较各副本集的Merkle树。两个节点交换根节点哈希值,若相等,则分区中存储的对象一致;若不等,则需比较根节点的两个子节点。遍历和数据交换算法会沿着副本树中哈希值不相等的分支继续向下,直至找到叶节点,然后可在相应副本节点上更新陈旧的数据对象。
Merkle树的构建是CPU和内存密集型操作,因此该过程可按需启动、由管理工具启动或定期调度,以在数据库请求负载较低时进行反熵修复,避免增加生产环境中数据库访问的延迟。Riak和Cassandra等NoSQL数据库实现了反熵修复。
1.2 冲突处理
1.2.1 最后写入者获胜(Last Writer Wins)
该方法使用时间戳来决定最终值,数据库确保并发写入时,时间戳最新的更新成为最终版本。但由于机器时钟会漂移,比较时间戳可能无意义,且并发更新时会导致更新被静默丢弃,数据丢失不可避免。若要安全使用仅采用此策略的数据库,需确保所有写入使用唯一键存储数据对象,且对象不可变。
1.2.2 版本向量(Version Vectors)
为处理并发更新且不丢失数据,可使用版本向量。每个唯一数据库对象存储时附带版本号,读写数据流程如下:
- 客户端读取数据库对象时,返回对象及其版本。
- 客户端更新数据库对象时,写入新数据值和上一次读取的对象版本。
- 数据库检查写入请求中的版本是否与数据库中对象的版本相同,若相同则接受写入并增加版本号;若不同,则表示发生冲突,数据库需采取补
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



