數據庫請求流程
應用端
應用端視角里(MongoDB驅動程序與MongoDB進行交互),一次數據庫請求流程如下:
- 選擇節點
在復制集讀操作里,選擇節點會受readPreference
參數影響 - 排隊等待
總連接數大於最大連接數maxPoolSize
,連接滿了如何解決:優化查詢性能,提高服務端資源等 - 連接與認證
等待創建連接和認證將比直接從連接池獲取連接更耗時,所以應該設置minPoolSize
一次性創建足夠的連接,避免突發的大量請求
數據庫端
wiredTiger的ticket:大概有點像semaphore?
- 排隊等待
ticket是和系統的資源相關的,增大ticket並不會優化排隊等待,所以我們其實是需要優化CURD - 合並結果
在mongos進行結果合並,盡量使用帶片鍵的查詢條件減少參與查詢的分片數
執行請求
讀
執行請求(讀)的具體過程如下圖,造成性能問題的主要原因就是不能命中索引和內存排序。
寫
執行請求(寫),MongoDB默認是{j:false}
,即不用先刷盤,直接寫內存緩存就能返回了,操作如下圖:
- 磁盤速度必須比寫入速度快才能保證(寫頻繁情況下的)性能
性能瓶頸總結
- 應用端:選擇入口節;等待數據庫連接;創建連接和完成認證
- 服務端:排隊等ticket;執行請求;合並執行結果
- 網絡:應用/驅動->mongos;mongos->片