
最终一致性
|
189
ly/1ZKIt
)和
Cassandra
。
根节点
图 11-4:Merkle 树示例
11.5
冲突处理
到目前为止,本章内容一直假设数据库具有某种机制,以用于辨别副本中数据库对象的
最新值。例如,从三个副本读取数据对象时,数据库将能够以某种方式确定哪个副本的
值是最近更新的,并将该值作为查询结果返回。
在无领导系统中,写入操作可以由任何副本处理。两个客户端可以同时更新不同副本上
相同的数据库键。发生这种情况时,应按什么顺序更新对象的值?所有副本中该对象的
最终值应该是多少?你需要某种机制来做出此决定。
11.5.1
最后写入者胜出
决定最终值的一种方法是使用时间戳。为更新请求生成一个时间戳,数据库确保并发写
入发生时,具有最新时间戳的更新成为最终版本。对于数据库来说,这种办法既简单又
快速。
不幸的是,这种方法存在问题。正如我在第
3
章所描述的,机器上的时钟会漂移。一个
节点的时钟可能领先于其他节点,让时间戳变得毫无意义。实际上的更新请求是按什么
顺序发生的?我们无法确定事件的顺序。更新请求由两个或多个独立进程在不同副本上
的同一数据对象执行。这些更新必须被视为同时的或并发的。附加到更新请求的时间戳
只是施加了任意顺序来解决冲突罢了。