mongodb應對高并發的方法:1、采用批量數據方式操作MongoDB,定時定量獲取查詢結果;2、在mongodb中設置一個庫一個文件;3、mongodb存儲引擎選擇WiredTiger;4、增加mongodb最大連接數;5、優化mongodb中的寫策略;6、優化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)寫比讀多