是否可以在一組數據庫文件上執行多個 mongod 實例
我們有大型的數 GB 數據集,我們在這些數據集上執行非常複雜的查詢,例如
{ $or: [ { id: 30000001, ... }, { id: 30000005, ... }, ..., { id: 30001005, ... } ] }
在這一點上,CPU 似乎實際上是一個瓶頸,所以能夠在同一組數據庫文件上執行多個 mongod 實例將是有利的。
為此,我們已經考慮使用副本集,但不希望僅僅出於 CPU 原因而需要額外的磁碟空間。
不,這是不可能的,您目前不能使用相同的文件執行多個實例 - 您需要的關鍵功能(管理哪個實例能夠寫入文件)不存在。我也不認為這在功能請求列表中(我找不到它),並且考慮到我能想到的允許這樣做的潛在問題的數量,就請求,但歡迎您提出請求。
您列出的
$or
查詢範例(並且您建議您有更複雜的查詢範例)將並行執行多個查詢,並且從外觀上看,您基本上通過在每個子句中$or
列出多個來嵌套邏輯 s 。_id
對 中的每個子句進行多次掃描$or
,即使使用覆蓋索引查詢,當該數組很大時,該查詢仍將是對索引的大量掃描。如果您沒有使用覆蓋索引(
true
在您的解釋中查找 indexOnly),那麼這也意味著大量的文件掃描,除非您的整個數據集適合記憶體,否則這將意味著很多頁面錯誤。由於您已經聲明這是在您的系統上執行此操作的“唯一方法”(我認為架構審查也是一個好主意),那麼目前,如果您在單個主機上遇到 CPU 問題,那麼複製或分片是您橫向擴展的兩個選項。我還要確保 CPU 位於使用者區,而不是系統(最簡單的方法是使用munin-node安裝MMS ,並隨著時間的推移跟踪使用者(通常是 mongod,如果它是專用系統)與系統 CPU。
不過,在你這樣做之前,請確保你在 2.2 上執行 - 2.2 的主要改進之一是切換到TCMalloc - 我不能確定,因為 malloc 問題在最好的時候很難診斷/定義,但如果您正在執行 2.0,TCMalloc 可以在這裡幫助您。