群集键/值数据库:最近的记录

时间:2012-01-28 16:21:59

标签: c++ database algorithm

想象一下以下情况:

存在计算机网络上的分布式键/值数据库。一个中央“主”计算机,用于获取请求,以及多个子计算机,用于存储部分数据。 即像这样的东西:

main computer
     |
     +--child A
     +--child B
     +--child C
     .....

即。 “星”拓扑。

补充说明:

  1. 部分数据库重叠,并且具有相同“密钥”的几个不同版本的记录可以同时存储在多台计算机上。
  2. 不保证密钥存在于所有计算机或特定计算机上。
  3. “儿童”不会彼此同步数据。
  4. 仅通过主计算机请求/读取数据,主计算机必须返回所请求密钥的最新数据版本。
  5. 数据仅通过儿童编写 - 他们从多个来源获得新值。
  6. 永远不会删除数据。
  7. 现在主要问题是:

    使用这种结构,我如何确定哪个版本是最新的?

    我可以想出两种方法来处理这个问题:

    1. 为每条记录添加时间戳,当它写入数据库样机器子机时,使用时间戳确定版本。
    2. 使用“修订号”或“写操作索引”(由主计算机发出,每次写操作递增1)而不是时间戳。
    3. 然而,这两种方法并不完美:
      第一种方法要求所有机器都有完美的时钟同步,否则系统将无法提供最新的记录值 第二种方法会导致每个孩子通过网络询问主机的时间戳,这会引入写入延迟,加上主机必须被互斥锁定,因此多线程性能会受到影响。

      处理这种情况的更好方法是什么? 真正的集群数据库如何处理这种情况(集群中最新的记录版本)?

1 个答案:

答案 0 :(得分:2)

您声明第一种方法需要完美的时钟同步是不正确的。

您不关心孩子发出的绝对时间戳,只关心相对时间戳。因此,只要时钟以相同的速率前进,它们就不需要同步;你可以纠正已知的偏移量。

如果孩子的时钟以不同的速率前进,那么必须使用涉及协调的方法(写入在慢速路径中无法锁定)。这可以通过矛盾来证明,因为很明显,两个孩子独立地写一个时间记录不能相互关联的值,不会让外部观察者决定以后写的是什么。

但是,您可以与实际写入并行进行协调:写入子项,同时写入有序日志,该日志允许确定首先发生的写入(您不需要类似票证类型的系统你似乎建议你是否有写日志)。所以它并不一定会拖延写作的过程!

看一下逻辑时间戳键值系统,比如Accumulo,一个HBase替代品(目前在Apache项目孵化中) - 这是真实世界的集群数据库正在完成你所要求的。