C++ 群集键/值数据库:最新记录
想象一下以下情况: 计算机网络上存储着分布式密钥/值数据库。一台中央“主”计算机获取请求,多台子计算机存储部分数据。 也就是说,类似这样的事情:C++ 群集键/值数据库:最新记录,c++,database,algorithm,C++,Database,Algorithm,想象一下以下情况: 计算机网络上存储着分布式密钥/值数据库。一台中央“主”计算机获取请求,多台子计算机存储部分数据。 也就是说,类似这样的事情: main computer | +--child A +--child B +--child C ..... 即“星形”拓扑 补充说明: 数据库的某些部分重叠,可以同时在多台计算机上存储具有相同“密钥”的多个不同版本的记录 密钥不能保证存在于所有机器或特定机器上 “子项”不相互同步数据 数据通过主计算
main computer
|
+--child A
+--child B
+--child C
.....
即“星形”拓扑
补充说明:
第一种方法要求所有机器的时钟完全同步,否则系统将无法提供最新的记录值。
第二种方法将导致每个孩子通过网络向主机请求时间戳,这将引入写入延迟,加上主机必须被互斥锁死,因此多线程性能将受到影响 处理这种情况的更好方法是什么?
真正的集群数据库如何处理这种情况(集群中最新的记录版本)?您认为第一种方法需要完美的时钟同步的说法是不正确的 您不关心孩子发出的绝对时间戳,只关心相对时间戳。因此,只要时钟以相同的速率前进,它们就不需要同步;可以对已知偏移进行校正 如果子系统上的时钟以不同的速率前进,则您必须使用一种涉及协调的方法(在慢路径中写入不能无锁)。这是可以通过矛盾来证明的,因为很明显,两个孩子独立地写一个值,并且时间记录彼此不相关,不会让外部观察者确定哪个值是后来写的 但是,您可以在实际写入的同时进行协调:写入到子级,同时写入到一个有序的日志,该日志允许确定哪个写入首先发生(如果您有写入日志,您不需要像您所建议的那样使用票证类型系统)。因此,这并不一定会延迟写作过程 看看像Accumulo这样的逻辑时间戳键值系统,它是一种HBase替代方案(目前正在Apache项目孵化中)——这是一个真实世界的集群数据库,正是您所要求的