2012-01-18 56 views
8

我使用mongodb存儲30天的數據,這些數據以流的形式出現在我的頭上。我正在尋找一種清除機制,通過這種機制,我可以丟棄最舊的數據,爲新數據創造空間。我曾經使用過使用分區處理這種情況的mysql。我保留了30個以日期爲基礎的分區。我刪除最舊的分區並創建一個新的分區來保存新數據。如何在Mongodb中處理數據庫清除

當我在mongodb中映射相同的東西時,我覺得使用基於日期的'shards'。但問題是它使我的數據分佈不好。如果所有新數據都在同一個分片中,那麼這個分片將會非常熱,因爲有很多人訪問它們,而含有較舊數據的分片將會減少用戶的加載。

我可以有一個基於集合的清除。我可以有30個集合,我可以扔掉最老的集合來容納新的數據。但是,幾個問題是1)如果我減小集合,那麼我不能從分片中獲益太多,因爲它們是按集合完成的。 2)我的查詢必須更改爲從所有30個集合中進行查詢並進行聯合。

請給我一個很好的清除機制(如果有的話)來處理這種情況。

回答

9

真的只有三種方法可以在MongoDB中進行清除。看起來你已經確定了一些權衡。

  1. 單個集合,刪除舊的條目每天
  2. 收藏,刪除舊藏品每天
  3. 數據庫,刪除舊的數據庫

選項#1:單個集合

專業人員

  • 容易實現
  • 容易跑地圖/減少

利弊

  • 刪除如刀片一樣昂貴,導致大量IO,並且需要「碎片整理」或「緊湊」的數據庫。
  • 在某些時候,您最終需要處理兩倍的「寫入」,因爲您必須同時插入插入一天的數據和刪除一天的數據。

選項#2:每天採集

利弊

  • 通過collection.drop()刪除數據是非常快的。
  • 靜態地圖/減少友好因爲每天的輸出可以與彙總數據合併或重新減少。

利弊

  • 您可能仍然有一些破碎的問題。
  • 您需要重新編寫查詢。但是,根據我的經驗,如果您有足夠的數據進行清除,則很少直接訪問該數據。相反,您傾向於在該數據上運行Map/Reduces。所以這可能不會改變許多查詢。

選項#3:每天數據庫

利弊

  • 缺失是儘可能快的,文件只是截斷。
  • 零碎片問題,易於備份/恢復/歸檔舊數據。

利弊

  • 將使查詢更多挑戰(想到寫一些包裝代碼)。
  • 編寫Map/Reduce並不容易,但請看一下Aggregation Framework,因爲它可以更好地滿足您的需求。

現在有一個第4個選項,但它不是一個通用的解決方案。我知道一些通過簡單地使用Capped Collections來「清除」的人。肯定有這種情況發生,但它有一些警告,所以你真的需要知道你在做什麼。