mongodb - 數據庫的 enableSharding 需要五到六分鐘才能完成
在為數據庫呼叫 enableSharding 命令時,我看到了一些奇怪的行為。首先介紹一下背景:
我正在使用 MongoDB v3.2.7 和 Java 驅動程序。目前我只有一個副本集(三個節點),代表一個分片(只有一個分片 - 計劃在未來水平擴展)。這是三個 mongos 節點的前端。
利用這個 MongoDB“集群”的應用程序創建了數千個(大於 10K)的數據庫。每個數據庫內部大約有 15 個集合。應用程序在執行時根據需要創建和初始化數據庫和集合。初始化的一部分是在數據庫上呼叫“enableSharding”,然後創建集合,最後對集合進行分片。應用程序的正常行為還包括稍微頻繁地刪除和創建此數據庫。
此實現尚未投入生產,但仍處於開發階段。我們正在嘗試模仿我們計劃用於生產的 MongoDB 架構。但是,分片/副本集的主要成員似乎每月大約需要 5 到 6 分鐘才能完成 enableSharding 命令。該命令確實完成了,但相關的應用程序邏輯“超時”。主節點上的所有其他操作都照常進行。似乎對查詢或寫入沒有影響。它還繼續充當“主要”角色。enableSharding 命令再次完成 - 只需五到六分鐘。
另一個值得注意的項目是我們使用“listDatbases”作為我們監控的一部分。我確實注意到,當數據庫的 enableSharding 命令開始需要五到六分鐘才能完成時,對“listDatabases”的呼叫也開始變慢。我想有幾個問題是:
有沒有其他人觀察到這個問題?或者可能有什麼相關的?我們的應用程序是否應該如此頻繁地在執行時初始化數據庫和集合?大於 10K 的數據庫 * 15 個集合會回來咬我們嗎?
主要是我只是想知道為什麼新數據庫的 enableSharding 會減慢這麼多。我們可以清除它的唯一方法是重新啟動副本集成員。
謝謝,特倫斯
該
enableSharding
命令基本上是一個元數據操作,它更改數據庫集合中的一個文件,並且發生在配置伺服器上(至少這是我最後一次在 2.6 中詳細檢查它)。如果這很慢,那是因為您在那裡(在配置伺服器上)存在爭用,可能是由於來自其他集合的活動被分片和平衡。每個初始集合分片、塊遷移、平衡器鎖定都會命中配置伺服器上的各種表,並可能與您的啟用分片命令競爭(元數據操作也是特殊情況,具有 2 階段送出等)。您可以查看擴展配置數據庫(僅當它們根據您目前的負載努力處理資源時才有效,而不是在您遇到鎖定爭用時),或者這只是一次性的並且不表示正在進行的負載,然後檢查其他操作的完成情況、平衡收集等將使您的初始配置執行速度較慢,但不太容易出現超時和錯誤。當然,另一種選擇是更改程式碼中的超時以等待更長的時間等待命令完成。