2012-01-28 40 views
2

想象一下以下情況:集羣鍵/值數據庫:最近的記錄

在計算機網絡上存在一個分佈式鍵/值數據庫。一臺提取請求的中央「主」計算機,以及多臺存儲部分數據的子機。 也就是說像這樣:

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

即, 「星形」拓撲。

附加說明:數據庫的重疊

  1. 部分,並用相同的「鑰匙」幾個不同的版本記錄可以存儲在在同一時間多臺機器。
  2. 密鑰不保證存在於所有機器或特定機器上。
  3. 「兒童」不會相互同步數據。
  4. 通過主計算機請求/讀取數據,主計算機必須返回請求密鑰的最新版本的數據。
  5. 數據僅通過兒童書寫 - 他們從多個來源接收新值。
  6. 數據永遠不會被刪除。

現在的主要問題:

採用這種結構形式,我該如何確定哪個版本是最新的?

我能想到的兩種方法來解決這一問題:

  1. 添加時間戳每個記錄,當它被寫入到數據庫瓶子機,使用時間戳來確定版本。
  2. 使用「修訂號」或「寫入操作索引」(由主計算機發出,每寫操作增加1)而不是時間戳。

然而,這兩種方法都是不完美:
第一個方法要求所有機器完美的時鐘同步,否則系統將無法提供最近的記錄值。
第二種方法會導致每個孩子通過網絡向主機詢問時間戳,這將引入寫入延遲,並且主機必須被互斥鎖鎖定,因此多線程性能將受到影響。

有什麼更好的方法來處理這種情況? 真正的集羣數據庫如何處理這種情況(集羣中最新的記錄版本)?

回答

2

您聲明第一種方法需要完美的時鐘同步是不正確的。

你不關心孩子發出的絕對時間戳,只是相對時間戳。所以只要時鐘以相同的速度前進,就不需要同步;你可以糾正已知的偏移量。

如果孩子的時鐘以不同的速率前進,那麼你需要必須使用一種涉及協調的方法(寫入在慢速路徑中不能無鎖)。這可以通過矛盾來證明,因爲很明顯,兩個孩子獨立寫作時間記錄的價值不能彼此相關,不會讓外部觀察者確定後面寫的東西。

但是,您可以與實際寫入並行進行協調:寫入子項,同時寫入有序日誌,該日誌允許確定首先發生哪個寫入(您不需要票據類型系統就像你似乎建議你是否有寫日誌)。所以它不一定會延遲寫作過程!

看看像Accumulo這樣的一個HBase替代品(目前在Apache項目孵化中)的邏輯時間戳鍵值系統 - 這是真正的世界集羣數據庫,完全按照您的要求進行。