WiredTiger - 在重新同步輔助副本集成員期間出現“打開文件過多錯誤”
我正在將輔助副本集成員升級到wiredTiger。我已將它從 MongoDB 2.6.3 升級到 3.0.4,並將儲存引擎更改為wiredTiger。現在它正在重新同步主節點的所有數據。在某些時候收到以下錯誤,並且該過程重新開始:
2015-07-22T13:18:55.658+0000 我索引
$$ rsSync $$ 使用批量方法建立索引 2015-07-22T13:18:55.664+0000 我索引
$$ rsSync $$建立索引完成。共掃描了 1591 條記錄。0 秒 2015-07-22T13:18:56.397+0000 電子儲存
$$ rsSync $$有線老虎 (24)$$ 1437571136:397083 $$$$ 20413:0x7f3d9ed29700 $$, 文件:WiredTiger.wt, session.create: WiredTiger.turtle: fopen: 打開的文件太多 2015-07-22T13:18:56.463+0000 E REPL
$$ rsSync $$8 24:打開的文件太多 2015-07-22T13:18:56.463+0000 E REPL
$$ rsSync $$初始同步嘗試失敗,剩餘 9 次嘗試
同一台機器之前執行的是 2.6.3 版本,沒有任何打開文件限制問題。我知道wiredTiger 可能會創建更多文件,所以肯定是這樣,但它是否讓它們同時打開?
以供參考:
cat /proc/sys/fs/file-max
10747371
在 /etc/init.d/mongod 中,配置為:
ulimit -n 64000
根據文件,mongo 似乎為每個數據文件保存一個文件描述符。與在wiredTiger 中一樣,這會導致每個集合一個文件+ 每個索引一個文件,根據我們案例的計算,加起來可以超過700K。
所以我可以將 ulimit 更改為 700000 或更高,但我想知道這是否是最正確的解決方案,以及存在哪些替代方案。
- 大多數類 Unix 作業系統可防止單個使用者使用過多的系統資源。
- 這些限制通常使用 ulimits 應用。給定 ulimits,預設的低值可能會導致 MongoDB 正常操作過程中的問題數量。
- 每個部署都可能有獨特的要求和設置。MongoDB 預設將打開文件的總數設置為 64000。
- 但是,當您的部署用完文件描述符時,mongodb 會停止並出現以下錯誤:
2017-01-22T21:15:29.824+0000 E REPL [rsSync] 8 24: Too many open files
解決方案:
從 MongoDB 3.0 開始,它附帶了 Pluggable Storage Engine。使用 WiredTiger 作為儲存引擎,您需要修改打開文件的值,因為它使用 1 個文件描述符進行收集,1 個文件描述符用於每個索引。在多租戶應用程序中,這可以粗略計算為假設:
Total Number of Tenants(T)= 1200 Average number of collection by each Tenant(C)= 10 Average number of indexes per collection(I)= 8 Total number of open files(F)= (T*C) + T(C*I) F = (1200*10) +1200(80) F= 108000 This hypothetical use case may require ~108000 file descriptors.
實際上,只有您自己在特定案例中的測試才能揭示您在使用這些打開的文件時所擁有的硬體是否存在任何問題。設置這些值,
/etc/security/limits.conf
您可能還需要nproc
根據進行更改nofile
。對於 mongodbnproc
應該是 50%nofile
檢查您的**/etc/security/limits.conf**文件並根據需要更改軟限制和硬限制。
* 軟文件 4096
* 硬文件 4096
在第一列中 * 表示此限制適用於除 root 使用者之外的所有使用者。您還需要編輯**/etc/pam.d/common-session***文件,在最後添加以下行:
會話需要 pam_limits.so
要不然
ulimit -n 65535(不需要重新啟動)
最後,註銷/重啟。