复制模型应确保所有数据最终复制到所有副本。在一个失效节点重新上线后,如何追上错过的写入?Dynamo风格的数据存储系统常用机制:
① 读修复(Read repair)
当客户端并行读取多副本时,可检测到过期的返回值。如图-10,User 2345获得来自R3的版本6,而从副本1、2得到版本7。客户端判断可知:副本3是过期值,然后将新值写入该副本。这适用于读密集场景。
② 反熵过程(Anti-entropy process)
一些数据存储有后台进程,不断查找副本之间数据差异,将任何缺少的数据从一个副本复制到另一个副本。不同于基于主节点复制的复制日志,该反熵过程不保证任何特定顺序的复制写入,并且会引入明显的同步滞后。
并非所有系统都实现了这俩方案。如Voldemort目前无反熵过程。若无反熵过程,由于【读修复】只在发生读取时才可能执行修复,那些很少访问的数据可能在某些副本中已丢失而无法再检测到,从而降低写的持久性。