2013-04-04 79 views
4

我們收集並存儲來自大量主機的檢測數據。 我們的存儲是MongoDB--帶有副本的幾個分片。一切都存儲在一個大集合中。 我們插入的每個文檔都是基於時間的觀察結果,並帶有一些屬性(測量結果)。時間戳是最重要的屬性,因爲所有查詢都至少基於時間。文件從不更新,所以它是一個純粹的寫入查找模型。目前它與數十億文檔合作良好。MongoDB - 單個巨大的原始數據集合。是否分裂?

現在,

我們要長一點,容納12個月數據的可能構成一個可怕萬條+的意見(文件)。 如果把所有東西都傾倒到一個單一的怪物收藏中,那麼我是在徘徊,這是最好的選擇,或者有更聰明的方法去實現它。通過更智能的我的意思是 - 使用更少的硬件,同時仍然提供快速插入和(重要的)快速查詢。 所以我想將大集合拆分成更小的部分,希望能夠獲得索引,插入和查詢速度上的內存。

我查看了碎片,但按時間戳分片聽起來像一個糟糕的主意,因爲所有寫入操作都會進入一個節點,取消分片的好處。 插入率非常高,所以我們需要分片在這裏正常工作。 我也想過每個月創建一個新集合,然後爲用戶查詢選取相關集合。 超過12個月的收藏將被丟棄或歸檔。 還有一個選項可以每個月創建一個全新的數據庫並進行類似的輪換。 其他選項?或者也許一個大集合是THE選項增長真正大嗎?

請在類似的應用程序中分享您的經驗和注意事項。

+0

您的查詢是基於時間的範圍嗎? – 2013-04-04 19:43:17

+0

是的,時間是所有查詢中的主要參數。另外,用戶可以選擇其他屬性。例如,「從特定來源的最後一個星期日拿到東西,並有紅色或溫度低於零」。 – Dima 2013-04-04 19:55:55

回答

2

這實際上取決於您的查詢的用例。

如果它是可以聚合的東西,我會說通過預定的map/reduce函數來做到這一點,並將較小的數據大小存儲在單獨的集合中。

如果一切都應該在同一個集合中,並且應該同時查詢所有數據以生成所需的結果,那麼您需要使用Sharding。然後,根據查詢的數據大小,您可以使用內存映射/減少,甚至可以在應用程序層執行。

正如您所指出的,基於時間的Sharding是一個非常糟糕的主意。它使所有寫入到一個分片,所以定義你的分片鍵。 MongoDB Docs,對此有很好的解釋。

如果您可以詳細說明您的具體需求,查詢會更容易建議。

希望它有幫助。

+0

該集合保存純粹的原始數據 - 一些傳感器的讀數。每個閱讀是一組平面名稱 - 值對,它們構成一個文檔。查詢可以通過任意屬性組合來完成,但時間總是存在,並且是集合中的主要索引。我們已經使用分片傳播這些觀察的起源。但是東西的剪切量讓我懷疑單一收集是否是正確的選擇。 – Dima 2013-04-04 19:52:58

+0

你有什麼類型的查詢?你可以聚合舊的記錄和查詢只使用聚合值,或者它需要從頭開始計算每個查詢? 你也執行查詢的頻率如何? – Majid 2013-04-04 21:01:13

2

我認爲每月收集會幫助你得到一些提升,但我想知道爲什麼你不能使用時間戳的小時字段進行分片。您可以添加一個將保留時間戳的HOUR部分的列,並且當您對它進行碎片整理時,將會很好地共享,因爲您每天都有重複的時間。我還沒有測試過,但認爲它可能會幫助你

+0

實際上,當你提到「使用你的時間戳的時間字段進行分片」時,它敲響了鐘聲。我沒有想過這個。我只是將絕對時間視爲分片密鑰。謝謝! – Dima 2013-04-05 08:01:53

0

建議繼續單個集合,如@Devesh小時基於分片應該沒問題,在查詢時需要照顧新的「小時鍵」獲得更好的表現。

相關問題