Mongodb

是否可以在一組數據庫文件上執行多個 mongod 實例

  • December 10, 2012

我們有大型的數 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 可以在這裡幫助您。

引用自:https://serverfault.com/questions/456558