想使用 MongoDB ,你應該了解這8個方面!
應用性能高低依賴于數據庫性能,MongoDB 是一個基于分布式文件存儲的數據庫。由 C++ 語言編寫,旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。MongoDB 是一個介于關系數據庫和非關系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。
本文針對實時監控 MongoDB 數據庫,總結了一些使用的工具以及需要重點注意的性能方面。
1,實時監控 MongoDB 工具
MongoDB 用自己的工具來統計現在運行的MongoDB 服務器的數據,并進行實時報告分析:
- mongostat :可以展示像 opcounts,lock%,內存使用以及副本集更新狀態等關鍵指標,因為可以實時看到發生的狀況,所以一般用于故障除疑。
- mongotop :mongostat 提供的是全局指標,而 mongotop 則提供追蹤 MongoDB 實例花費在讀寫操作數據的時間指標,提供每個集合級別的統計數據。
- is.status() :返回的是當前服務器節點執行操作后副本集的狀態,通過這個來實時查看集群的變化。
- sh.status() :返回你的分片集群的狀態,尤其是每塊碎片的數量,顯示關于分片集群的現有區塊的信息的格式化的報告,如果區塊大于等于20就不顯示詳細塊信息。
2,內存使用量和頁面錯誤
內存可能是你可以給 MongoDB 的最重要的資源,因為 Mongodb 是相當吃內存的,如果控制不好的話,mongodb會掛掉。。。所以你要確保你給的內存總是有足夠的!經驗之談是提供符合索引數量的足夠的 RAM,如果可能的話,為所有數據提供足夠的內存。
常駐內存是這里的關鍵指標, MongoDB 內存 mem 記錄了 Mongod 的系統架構和內存使用。
頁面錯誤和內存相關因為頁面錯誤發生時是 MongoDB 去磁盤里面查找數據而不是內存中,如果內存的數量不能滿足性能需求,那么你將會看到頁面錯誤,隨著頁面錯誤率的上升,opcounters 最終會低于期望值,所以這時你應該增加可用的 RAM。
3,連接數
連接到 MongoDB 的每個連接都有助于追蹤系統所需的內存的開銷。這最初由 Unix 通過 ulimit 來設置限制,但隨后成為由服務器資源,特別是存儲器限制。
過高數量的連接數還可以指明問題,例如你的應用程序代碼打開太多的連接,造成某地方產生很高的 lock% 。
有時客戶端和數據庫之間的連接數超出服務器處理請求的能力,這可能會導致在 MongoDB 環境的應用程序性能的下降。
4,數據庫操作
不多說,實時掌握數據庫操作的統計數據以及復制和分片操作的詳細信息,確保每秒數據庫操作(inserts,query,update,delete,getmore 等 command 命令)的總數有助于分析和跟蹤數據庫的負載。
5,鎖
MongoDB 使用一個全局鎖來確保一致性。但是,如果某些操作是長時間運行的或形成一個隊列,操作等待鎖就會大大降低應用程序性能。
在 MongoDB 2.6版本中,鎖是數據庫級別的,一直持續 MongoDB 2.8,寫操作都是一個全局性數據庫鎖,MongoDB 使用的這種「readers-writer」鎖,雖然支持并發但有很大的局限性,當一個讀鎖存在,許多讀操作可以使用這把鎖,然而當一個寫鎖存在時,其它讀寫操作不能使用共享這個鎖,寫入優先于讀取,當兩個操作一個讀取和一個寫入正在等待鎖,MongoDB 會授予寫鎖,所以如果寫鎖發生的過于頻繁,那么你應用的性能出現文件也就不奇怪了。當然如果你的應用中真的有大量的寫操作,可以考慮 Cassandra 數據庫。
6,復制集
MongoDB 復制集通過將數據部署在多個不同的服務器上,防止因單機故障而造成數據的丟失,借助數據冗余來提高數據的可靠性和安全性。而且還可以通過復制技術構建分布式數據庫,提高系統的訪問性能和安全性。
復制集同步數據過程是:Primary 節點寫入數據,Secondary 通過讀取 Primary 的 oplog 得到復制信息,開始復制數據并且將復制信息寫入到自己的 oplog,復制延遲是 Primary 節點上寫入到 Secondary 節點讀取 oplog 再寫入操作的延遲,復制延遲可能是一個顯著的問題,嚴重影響 MongoDB 副本集部署,過度復制延遲使「滯后」的節點將很快成為 Primary ,增加了分布式讀操作不一致的可能性。
7,片鍵
分片是在多臺計算機存儲數據記錄的過程中 MongoDB 來滿足數據增長需求的特有方式。隨著數據量的增加,一臺服務器可能不足以存儲數據或提供大量的讀寫操作。分片解決了水平擴展的問題,通過分片,可以添加更多的機器來支持數據增長以及滿足讀寫操作的需求。
MongoDB 在集合的水平上分割數據和分片,通過一個片鍵( shard key )來分割分片。
為了將一個集合分片,需要選擇一個片關鍵字。一個片鍵是一個索引字段,或是存在于每個集合文檔中的一個復合索引字段。選擇正確的分片鍵可以對應用性能,功能以及數據庫和集群的運作有很大的影響,合適的分片鍵選擇取決于你的數據的架構和應用程序的查詢和寫入數據的方式。而且 Mongodb 數據庫是否能高效運轉也取決于你指定了文檔的哪個字段作為分片字段。由于分片字段都是預先選擇且選定后無法更改的,而且考慮到 MongoDB 縱向擴展能力的限制,選擇時就需要深思熟慮了。分片鍵應該滿足以下條件:
- 分配 -- 分片鍵最糟糕的情況是自增的值(當所有的寫操作將被平衡到單個碎片時就意味著"熱碎片"的發生,而這就是瓶頸)。理想的分片重點應該讀和寫是盡可能多的"隨機分布"。
- 理想的片鍵主要功能應該是用于查詢,如果大部分的查詢請求都能夠命中盡可能少的分片那就最好了。
- 一個好的片鍵使得 MongoDB 分配內容變的容易。MongoDB 會根據你的設置將你的數據劃分到有著相同片鍵的數據塊 (Chunk) 中。而后這些數據塊將根據片鍵的大致順序分散到副本集中。
8,集成監控工具 Cloud Insight
想要看以上數據指標,需要一定的監控手段,MongoDB 本身有一堆自己的工具,此外還有開源工具以及第三方廠家提供的監控軟件,總結為一點,監控很重要,Cloud Insight 全面監控 MongoDB,一工具在手,默認60個數據指標,MongoDB 發生什么都了然于心。
順道推薦這些文章:
大規模運行 MongoDB 應該知道的10件事
本文由Cloud Insight 工程師整理編譯, Cloud Insight 集監控、管理、計算、協作、可視化于一身,幫助所有 IT 公司,減少在系統監控上的人力和時間成本投入,讓運維工作更加高效、簡單。想閱讀更多技術文章,請訪問OneAPM 官方技術博客。
</div>來自: http://news.oneapm.com/ci-mongodb/