管理連線

連線至 Databases for MongoDB 部署會使用資源,因此在調整部署效能時,必須考慮需要多少連線。 在 MongoDB shell 或 MongoDB 用戶端中使用下列命令,以顯示允許的最大連線數和目前的使用量。

  db.serverStatus().connections

輸出範例:

{
  current: 33,
  available: 65503,
  totalCreated: 21858,
  rejected: 0,
  active: 9,
  threaded: 33,
  exhaustIsMaster: 0,
  exhaustHello: 6,
  awaitingTopologyChanges: 6
}
欄位 意義
current: 33 目前用戶端連線總數,包括閒置的連線。 這就是現在許多客戶的連線方式。
available: 65503 MongoDB 在達到限制前可以接受的額外用戶端連線數 (建議最大值為 ~65536)。
totalCreated: 21858 自伺服器啟動以來建立的連線總數。 協助您瞭解連線流失情況。
rejected: 0 因達到限制而拒絕的連線嘗試次數。
threaded: 78 目前處理連線的線程數。 經常匹配 current
active: 23 目前執行作業的連線數 - 其餘 (78 - 23 = 55) 為閒置。
exhaustIsMaster: 0 與較舊的伺服器發現通訊協定有關(現已被取代)。 通常為 0。
exhaustHello: 19 持續的監視連線(例如,來自在監視中使用 hello 指令的驅動程式)。
awaitingTopologyChanges: 19 等待拓樸結構變更的連線(例如,在複製集中進行高可用性監控)。

附註:

  • maximum connection = current + available
  • 沒有被拒絕的連線表示沒有達到限制。
  • 根據預設,MongoDB 最多允許 65536 個連線。
  • 超出部署的連線限制可能會導致應用程式無法存取資料庫。

終止 MongoDB 連線

若要終止 (kill) MongoDB 連線,請使用下列方法,通常是透過 MongoDB shell: 執行下列指令以列出作用中的作業,包括連線。

  db.currentOp(true).inprog

輸出:

{
  "client" : "IP:PORT",
  "active" : true,
  "opid" : <opid>,
  ...
}

找到操作的 opid 後 (例如 opid: 12345),使用下列指令將其銷毀:

    db.killOp(12345)
  • 執行 currentOpkillOp 需要管理員權限。

MongoDB 連線池

MongoDB 中的連接池是應用程式與 MongoDB 伺服器之間可重用連接的快取記憶體。 與其為每個請求開啟和關閉一個新連線(這很昂貴),應用程式不如維護一個連線池,並將其重複用於多個作業。 防止超出連接限制並確保有效處理來自應用程式的連接的一種方法是透過連接池。 驅動程式會根據需求和組態來管理連線的建立、重複使用和關閉。

Node.js (Mongoose 或原生 驅動程式):MongoDB

mongoose.connect(uri, {
  maxPoolSize: 100,      // default is 100
  minPoolSize: 10,
  maxIdleTimeMS: 30000,
  serverSelectionTimeoutMS: 5000
});

Python (PyMongo):

client = MongoClient(uri, maxPoolSize=100, minPoolSize=10)

Java:

MongoClientSettings settings = MongoClientSettings.builder()
    .applyToConnectionPoolSettings(builder ->
        builder.maxSize(100).minSize(10).maxConnectionIdleTime(30, TimeUnit.SECONDS))
    .build();
術語 說明
maxPoolSize (或 maxConnectionsPerHost) 池可以開啟到 MongoDB 伺服器的最大連線數。
minPoolSize 池中維持的最少連線數。
waitQueueTimeoutMS 當所有連線都忙碌時,應用程式等待連線池連線的時間。
maxIdleTimeMS 連線閒置多久才會關閉。