實際工作中如何保證MongoDB的高性能?

你曾經和你的MongoDB數據庫有性能問題?常見的情況是運行查詢時突然出現性能問題。顯而易見的第一個解決方案是,“讓我們創建一個索引!”,雖然這能夠解決很多的性能問題,但是為了提升MongoDB性能,還有很多其它東西需要考慮。

要想有高性能的MongoDB,不是簡單的使用昂貴磁盤和千兆網絡的大型機器就一定能行的。事實上,高性能硬件設備不一定能夠為我們帶來高性能的MongoDB。

MongoDB的性能來自於好的理念、組織、和數據分佈。我們要為MongoDB的性能優化準備一套方案,雖然這不是一個詳盡的或完整的指南,但這是一個好的開始。

實際工作中如何保證MongoDB的高性能?

保持文件的簡單

MongoDB是無模式數據庫。這意味著默認情況下沒有預定義的模式。我們可以在新版本中添加預定義的模式,但它不是強制性的。要意識到在處理嵌入文檔和數組時遇到的困難,因為在應用程序/ ETL過程中解析數據可能變得非常複雜。此外,數組會影響複製性能:對於數組中的每一個更改,所有數組值都需要複製!

在MMAPv1,選擇合適的字段名稱是非常重要的因為數據庫需要保存每個文檔的字段名稱。它不像在關係數據庫中保存模式。讓我們想象一下下面的情況會佔用多少數據:

如果你有一個字段名稱為:lastmessagereceivedfromsensor,並且有100萬個文檔需要存儲。

大約28 MB只是為了存儲這個字段名稱,而這個字段裡面可能什麼數據也沒有。

硬件很重要,但是。。。

使用好的硬件和多個處理器,以及大量的內存肯定有助於提高性能。

WiredTiger利用多處理器提供了良好的性能。這個存儲引擎的特點是每個文檔鎖定算法,以便儘可能多的處理器和儘可能多的操作可以同時運行。

當這臺昂貴的高性能機器(32 CPUs, 128G RAM, and 2TB disk)出現故障宕機時會怎樣呢?這個時候你的MongoDB將會全部不可用。在分佈式環境中有多個小型機器可以確保宕機只會影響少部分或沒有知覺的應用。但同時,更多的機器意味著很有可能失敗。在設計環境時考慮這種折衷。正確的選擇影響績效。

設計合理的工作集

工作集有多大?通常,應用程序不使用所有數據。有些數據經常更新,而其他數據則不更新。

你的工作數據集適合RAM嗎?當所有工作數據集都在RAM中時,就會出現最佳性能。讀取,如備份、ETL或從初選報告,都會嚴重影響性能,因為在緩存中有頁面競爭。對於大型報表或聚合也是如此。

為多個目的擁有多個集合,併為特定目的使用特定的機器——如使用區域保存不再使用的文檔——將有助於擁有簡單的工作集。


分享到:


相關文章: