高併發操作MongoDB性能優化

高併發操作MongoDB性能優化

一,代碼層級優化

採用批量數據方式操作MongoDB。將數據信息存放在消息隊列中進行緩存,然後定時定量的去獲取隊列消息,觸發連接MongoDB獲取查詢結果。

 所謂定時定量是指每一段時間或消息隊列達到某一數值。示例:每10秒或隊列消息數達到200時提交一次統計事件。

優點:減少網絡傳輸的IO,同時減少SQL語句解析的次數。降低MongoDB日誌刷盤的數據量和頻率,從而提高效率。

缺點:有一定的消息延時(具體延時時間可調整隊列消息提交頻率和消息數大小來控制)。

二,MongoDB優化

1,MongoDB設置一個庫一個文件,即設置directoryPerDB爲true;將索引也按數據庫名單獨存儲,即directoryForIndexes: true。

2,MongoDB存儲引擎選擇WiredTiger。

目前MongoDB的存儲引擎主要有MMAPV1、WiredTiger。在3.2版本之前MMAPV1是默認的存儲引擎,其採用linux操作系統內存映射技術,但一直飽受詬病;3.4以上版本默認的存儲引擎是wiredTiger,相對於MMAPV1其有如下優勢:

  • 讀寫操作性能更好,WiredTiger能更好的發揮多核系統的處理能力;
  • MMAPV1引擎使用表級鎖,當某個單表上有併發的操作,吞吐將受到限制。WiredTiger使用文檔級鎖,由此帶來併發及吞吐的提高
  • 相比MMAPV1存儲索引時WiredTiger使用前綴壓縮,更節省對內存空間的損耗;
  • 提供壓縮算法,可以大大降低對硬盤資源的消耗,節省約60%以上的硬盤資源;

3,增加MongoDB最大連接數(connectionsPerHost),有效利用CPU資源。

4,MongoDB寫策略配置優化:{ w: , j: , wtimeout: }

  • w: 數據寫入到number個節點才向用客戶端確認

    {w: 0} 對客戶端的寫入不需要發送任何確認,適用於性能要求高,但不關注正確性的場景
    {w: 1} 默認的writeConcern,數據寫入到Primary就向客戶端發送確認
    {w: “majority”} 數據寫入到副本集大多數成員後向客戶端發送確認,適用於對數據安全性要求比較高的場景,該選項會降低寫入性能

  • j: 寫入操作的journal持久化後才向客戶端確認,默認爲{j: false},如果要求寫入持久化了才向客戶端確認,則指定該選項爲true

  • wtimeout: 寫入超時時間,僅w的值大於1時有效

當指定{w: }時,數據需要成功寫入number個節點纔算成功,如果寫入過程中有節點故障,可能導致這個條件一直不能滿足,從而一直不能向客戶端發送確認結果,針對這種情況,客戶端可設置wtimeout選項來指定超時時間,當寫入過程持續超過該時間仍未結束,則認爲寫入失敗。
5,MongoDB查詢優化(大概分三步)

  • 開啓內置的查詢分析器,找出慢查詢語句
  • 分析慢查詢語句。
  • 解讀explain結果。

關於索引的建議:

1.索引很有用,但是它也是有成本的——它佔內存,讓寫入變慢;

2.mongoDB通常在一次查詢裏使用一個索引,所以多個字段的查詢或者排序需要複合索引才能更加高效;

3.在生成環境構建索引往往開銷很大,時間也不可以接受,在數據量龐大之前儘量進行查詢優化和構建索引;

4.避免昂貴的查詢,使用查詢分析器記錄那些開銷很大的查詢便於問題排查;

5.通過減少掃描文檔數量來優化查詢,使用explain對開銷大的查詢進行分析並優化;

6.索引是用來查詢小範圍數據的,不適合使用索引的情況:
   1)每次查詢都需要返回大部分數據的文檔,避免使用索引
   2)寫比讀多  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章