想象一下以下情况:集群键/值数据库:最近的记录
在计算机网络上存在一个分布式键/值数据库。一台提取请求的中央“主”计算机,以及多台存储部分数据的子机。 也就是说像这样:
main computer
|
+--child A
+--child B
+--child C
.....
即, “星形”拓扑。
附加说明:数据库的重叠
- 部分,并用相同的“钥匙”几个不同的版本记录可以存储在在同一时间多台机器。
- 密钥不保证存在于所有机器或特定机器上。
- “儿童”不会相互同步数据。
- 通过主计算机请求/读取数据,主计算机必须返回请求密钥的最新版本的数据。
- 数据仅通过儿童书写 - 他们从多个来源接收新值。
- 数据永远不会被删除。
现在的主要问题:
采用这种结构形式,我该如何确定哪个版本是最新的?
我能想到的两种方法来解决这一问题:
- 添加时间戳每个记录,当它被写入到数据库瓶子机,使用时间戳来确定版本。
- 使用“修订号”或“写入操作索引”(由主计算机发出,每写操作增加1)而不是时间戳。
然而,这两种方法都是不完美:
第一个方法要求所有机器完美的时钟同步,否则系统将无法提供最近的记录值。
第二种方法会导致每个孩子通过网络向主机询问时间戳,这将引入写入延迟,并且主机必须被互斥锁锁定,因此多线程性能将受到影响。
有什么更好的方法来处理这种情况? 真正的集群数据库如何处理这种情况(集群中最新的记录版本)?