想象一下以下情况:
存在计算机网络上的分布式键/值数据库。一个中央“主”计算机,用于获取请求,以及多个子计算机,用于存储部分数据。 即像这样的东西:
main computer
|
+--child A
+--child B
+--child C
.....
即。 “星”拓扑。
补充说明:
现在主要问题是:
使用这种结构,我如何确定哪个版本是最新的?
我可以想出两种方法来处理这个问题:
然而,这两种方法并不完美:
第一种方法要求所有机器都有完美的时钟同步,否则系统将无法提供最新的记录值
第二种方法会导致每个孩子通过网络询问主机的时间戳,这会引入写入延迟,加上主机必须被互斥锁定,因此多线程性能会受到影响。
处理这种情况的更好方法是什么? 真正的集群数据库如何处理这种情况(集群中最新的记录版本)?
答案 0 :(得分:2)
您声明第一种方法需要完美的时钟同步是不正确的。
您不关心孩子发出的绝对时间戳,只关心相对时间戳。因此,只要时钟以相同的速率前进,它们就不需要同步;你可以纠正已知的偏移量。
如果孩子的时钟以不同的速率前进,那么必须使用涉及协调的方法(写入在慢速路径中无法锁定)。这可以通过矛盾来证明,因为很明显,两个孩子独立地写一个时间记录不能相互关联的值,不会让外部观察者决定以后写的是什么。
但是,您可以与实际写入并行进行协调:写入子项,同时写入有序日志,该日志允许确定首先发生的写入(您不需要类似票证类型的系统你似乎建议你是否有写日志)。所以它并不一定会拖延写作的过程!
看一下逻辑时间戳键值系统,比如Accumulo,一个HBase替代品(目前在Apache项目孵化中) - 这是真实世界的集群数据库正在完成你所要求的。