Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 群集键/值数据库:最新记录_C++_Database_Algorithm - Fatal编程技术网

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项目孵化中)——这是一个真实世界的集群数据库,正是您所要求的