2013-04-16 107 views
5

我正在創建一個Cassandra時間序列數據庫,用於存儲數百萬系列的日常數據,這些數據可能總共可能有100B個數據點。在Cassandra中設計時間序列數據庫

我看了這篇文章: http://rubyscale.com/blog/2011/03/06/basic-time-series-with-cassandra/

這樣的設計是非常完善的。所以基本上我可以將每日時間戳記作爲列,並且如果必要的話,通過將該日添加到行來分割​​列。

兩個問題,我有:

  • 我在看存儲多達20,000時間戳(每日)列。是否有必要通過例如分割行。一年的這個數量的列?分割行以減少每年365列的數量是否有優勢/劣勢。
  • 我的另一個想法是,而不是逐行分欄是每年創建列家族。通過這種方式訪問​​多年的數據時,我不得不查詢多個列族而不是一個列族,並在客戶端加入結果。這種方法會加快速度或者放慢速度嗎?

回答

4

如果您要管理大量的寫入操作,那麼您的方法有一個問題。

總是寫入1個鍵意味着該鍵的所有寫入操作都將轉到一個節點。基本上你每天會在你的集羣中使用一個節點,所以你可能有一個巨大的Cassandra實例,而不是麻煩建立一個集羣。 如果您的寫入頻率變得非常高,您可能會降低負責該日期/密鑰的節點。

我的建議是在同一時間使用多行存儲一天。由於在一個桶內突然激增可能會導致所有事情都下降,因此時間分配可能很危險。

,你可以這樣創建你的水桶(行密鑰):

  • [ROW_BASE_NAME] + [DAY] + someHashFunction(時間戳)%10
  • [ROW_BASE_NAME] + [DAY] + random.nextInt (10)
  • [ROW_BASE_NAME] + [DAY] + nextbucket < ---那就是如果你有旋轉桶以安全的方式自己

有很多方法可以做到這一點。您也可以使用正在保存的列的某個元素來執行此操作。 但我認爲這樣做應該很重要,以便隨時利用整個cassandra集羣。

我的答案只適用於編寫繁重的應用程序/功能,因爲您將不得不使用multi_get(多鍵全行讀取)讀取所有數據並重新構建當天的整個時間線。

+0

所以你認爲在將表/列分割成單獨的列族中沒有任何要點,而是按行來完成它?單列系列中有太多行是否有缺點? – datageek

+2

列家族只是一個額外的關鍵級別。如果我的數據具有相同的性質,並且需要緩存,比較(列名稱)等相同的設置,那麼我將它們放在同一個列族中。 Plus柱系列在編程上不易管理。只需寫入新密鑰即可創建密鑰。並且您無法在一個查詢中從單獨的CF讀取。 –