伙计们,我目前正在通过“设计数据密集型应用程序”一书了解分布式数据系统。
我想我对单个副本系统中的版本号如何允许服务器检测并发写入有非常深刻的理解*
。作者从这个例子开始,因为一旦你了解了单副本系统,将这种理解扩展到多领导者或无领导者复制系统应该是显而易见的,但对我来说根本不明显。
多个副本可以处理写入请求的系统中的版本号如何工作?换句话说,什么是版本向量?
*
在单副本系统中,每次写入都伴随着一个版本号。此版本号是写入所基于的数据的版本。如果写入基于该键的数据的版本 1,并且版本 2 已经存在,我们知道传入的写入与版本 2 并发。传入的写入只能覆盖版本 1 中的数据,因为它不了解版本 2 中的数据。例如,版本 1 是 [eggs],版本 2 是 [eggs] 和 [milk]。传入的写入想要将此键更新为 [eggs, bacon]。此密钥的第 3 版将变为 [eggs, bacon] 和 [milk]。传入的写入不能覆盖 [milk],因为它甚至不知道 [milk] 是键中的一个值。
版本向量是集群中每个节点将其本地版本号传递给集群中所有其他节点的一种方式。它们也被称为矢量时钟。
本质上,当节点 A 将消息传递给另一个节点 B 时,A 在该消息中包含它所知道的关于集群中所有节点的版本号的信息。因为它包含所有其他节点的值,所以它是版本号的数组或向量。节点 B 使用此信息来更新它对整个集群的版本号的了解。它可以使用此信息来计算整个集群中事件的全局排序。
反过来,节点 B 在发送给其他节点(包括节点 A)的消息中包含此更新信息。
搜索矢量时钟。有很多解释,既有学术性的,也有实践性的。