2010-12-06 167 views
18

我正在使用mongo來存儲日誌文件。 mongoDB和mysql都運行在同一臺機器上,虛擬化mongo env不是一個選項。由於日誌表增長非常快,我恐怕很快會遇到性能問題。有沒有辦法限制mongo的駐留內存,這樣它就不會吃掉所有可用內存,並且會過度減慢mysql服務器的速度?MongoDB限制內存

DB機:Debian的「萊尼」 5

其他解決方案(請評論):

  • 正如我們所需要的所有歷史數據,我們不能用封頂集合,但我使用也在考慮一個cron腳本,用於轉儲和刪除舊數據

  • 我還應該考慮使用較小的密鑰,如其他論壇上的建議?

回答

13

嘿弗拉德,你有幾個關於日誌的簡單策略。

首先要知道的是,Mongo通常可以處理大量的連續插入,而沒有大量的RAM。原因很簡單,你只能插入或更新最近的東西。所以索引大小會增長,但數據會不斷地被調出。換句話說,你可以將RAM的使用分成兩個主要部分:索引&數據。

如果您正在運行典型的日誌記錄,數據部分會不斷被刷新,所以只有索引真正停留在RAM中。

要知道的第二件事是,您可以通過將日誌放入較小的桶中來緩解索引問題。這樣想想吧。如果您將所有日誌收集到帶日期標記的集合中(稱爲logs20101206),那麼您還可以控制RAM中索引的大小。

當你翻滾幾天時,舊的索引將從RAM中刷新,並且不會再次訪問,所以它會消失。

,但我使用的轉儲和刪除舊數據

這的天記錄的方法還有助於刪除舊數據cron腳本也在考慮。在三個月內,當您完成數據時,您只需執行db.logs20101206.drop(),並且集合即刻消失。請注意,您不會回收磁盤空間(全部是預先分配的),但新數據將填補空白處。

我是否應該考慮使用更小的鍵,如其他論壇上的建議?

是的。

事實上,我已經將它嵌入到我的數據對象中。所以我使用logs.actionlogs->action訪問數據,但在下面,數據實際上保存爲logs.a。在「領域」而不是在「價值」上花費更多空間是非常容易的,因此值得縮小「領域」並試圖將其抽離其他地方。

+0

謝謝您的詳細解答:) – 2010-12-07 10:46:34

+0

但是,是不是有任何方法可以指定給操作系統,mongo的駐留內存不應該大於XXX MB? – 2010-12-07 10:47:42

1

對於3.2+版,它採用wiredTiger引擎,選擇--wiredTigerCacheSizeGB是有關這個問題。你可以設置它,如果你知道你在做什麼。我不知道這是否是最佳做法,只需從document中讀取並在此處提出即可。