Mongodb

MongoDB 和無論你多麼努力都無法放入 RAM 的數據集

  • December 20, 2012

這非常依賴於系統,但幾乎可以肯定我們會越過任意懸崖並陷入真正的麻煩。我很好奇對於良好的 RAM 與磁碟空間比率存在什麼樣的經驗法則。我們正在計劃我們的下一輪系統,並且需要就 RAM、SSD 以及每個新節點將獲得多少做出一些選擇。

但是現在了解一些性能細節!

在單個項目執行的正常工作流程中,MongoDB 的寫入百分比非常高(70-80%)。一旦處理管道的第二階段命中,它的讀取量就會非常高,因為它需要對處理前半部分中辨識的記錄進行重複數據刪除。這是“將工作集保存在 RAM 中”的工作流程,我們正在圍繞該假設進行設計。

整個數據集不斷受到來自最終使用者衍生來源的隨機查詢的影響;儘管頻率不規則,但大小通常很小(10 個文件組)。由於這是面向使用者的,因此回复需要低於 3 秒的“無聊”門檻值。這種訪問模式不太可能在記憶體中,因此很可能會導致磁碟命中。

二次處理工作流是對可能數天、數週甚至數月的先前處理執行的大量讀取,並且不經常執行,但仍需要快速執行。將訪問上一次處理執行中多達 100% 的文件。我懷疑,再多的記憶體預熱也無濟於事。

完成的文件大小差異很大,但中大小約為 8K。

正常項目處理的高讀取部分強烈建議使用副本來幫助分配讀取流量。我在其他地方讀到1:10 RAM-GB 到 HD-GB 對於慢速磁碟來說是一個很好的經驗法則,因為我們正在認真考慮使用更快的 SSD,我想知道是否有類似的規則快速磁碟的拇指。

我知道我們使用 Mongo 的方式是記憶體一切都不會飛,這就是為什麼我正在尋找方法來設計一個可以在這種情況下使用的系統。整個數據集可能會在半年內達到 TB 的大部分,並不斷增長。

這將是一堆小點。但是,遺憾的是,您的問題沒有單一的答案。

MongoDB 允許作業系統核心處理記憶體管理。除了在問題上投入盡可能多的 RAM 之外,只有幾件事可以“積極管理”您的工作集。

您可以做的一件事來優化寫入是首先查詢該記錄(進行讀取),以便它在工作記憶體中。這將避免與程序範圍的全域鎖相關的性能問題(應該在 v2.2 中成為 per-db)

RAM 與 SSD 的比率沒有硬性規定,但我認為 SSD 的原始 IOPS 應該允許您使用更低的比率。在我的腦海中,1:3 可能是你想要的最低值。但考慮到更高的成本和更低的容量,您可能無論如何都需要降低該比率。

關於“寫入與讀取階段”,我是否正確閱讀了一旦寫入記錄,它就很少更新(“更新”)?如果是這種情況,託管兩個集群可能是值得的;正常的寫入集群,以及未修改的“老化”數據的讀取優化集群*$$ X time period $$*. 我肯定會在這個集群上啟用從屬讀取。(就個人而言,我會通過在您的數據庫的對象文件中包含一個日期修改值來管理它。)

如果你有能力在進入 Prod 之前進行負載測試,那麼就別管它了。MongoDB 的編寫假設它通常會部署在 VM 中(它們的參考系統在 EC2 中),所以不要害怕分片到 VM。

引用自:https://serverfault.com/questions/408100