2012-01-28 24 views
2

想象一下以下情况:集群键/值数据库:最近的记录

在计算机网络上存在一个分布式键/值数据库。一台提取请求的中央“主”计算机,以及多台存储部分数据的子机。 也就是说像这样:

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

即, “星形”拓扑。

附加说明:数据库的重叠

  1. 部分,并用相同的“钥匙”几个不同的版本记录可以存储在在同一时间多台机器。
  2. 密钥不保证存在于所有机器或特定机器上。
  3. “儿童”不会相互同步数据。
  4. 通过主计算机请求/读取数据,主计算机必须返回请求密钥的最新版本的数据。
  5. 数据仅通过儿童书写 - 他们从多个来源接收新值。
  6. 数据永远不会被删除。

现在的主要问题:

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

我能想到的两种方法来解决这一问题:

  1. 添加时间戳每个记录,当它被写入到数据库瓶子机,使用时间戳来确定版本。
  2. 使用“修订号”或“写入操作索引”(由主计算机发出,每写操作增加1)而不是时间戳。

然而,这两种方法都是不完美:
第一个方法要求所有机器完美的时钟同步,否则系统将无法提供最近的记录值。
第二种方法会导致每个孩子通过网络向主机询问时间戳,这将引入写入延迟,并且主机必须被互斥锁锁定,因此多线程性能将受到影响。

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

回答

2

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

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

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

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

看看像Accumulo这样的一个HBase替代品(目前在Apache项目孵化中)的逻辑时间戳键值系统 - 这是真正的世界集群数据库,完全按照您的要求进行。