MongoDB 超時設定

資料庫工作筆記發表於2024-01-02

來源:myabc

MongoDB 驅動程式為 Mongo 客戶端提供了多個選項,用於處理使用過程中可能出現的不同網路超時錯誤。在某些情況下,這些選項的預設值可能不適合你的使用情況,因此,瞭解不同的 MongoClient 超時選項對於避免應用出現不可預知的掛起並提高效能至關重要。

 

在抽象層面上,每當使用 MongoClient 連線、傳送或接收請求時,它都會使用在內部預定義的超時選項,以決定應用程式等待初始連線建立或伺服器響應請求的時間。

 

典型的應用會根據業務邏輯與不同的資料庫伺服器進行互動。例如,付款歷史記錄可能在一個資料庫群集上,而分析記錄可能在另一個群集上。

 

當出現網路錯誤時,預設超時會嚴重影響應用程式的行為。如果你的分析伺服器當機,那麼每個操作在失敗前都將等待預設的 30 秒(這可能是你想要的,也可能不是)。

 

超時錯誤可能由不同因素導致,如網路問題、伺服器或客戶端設定配置錯誤以及寫入操作延遲。

 

主要的超時型別

瞭解這些型別的超時對於掌握 MongoDB 的使用至關重要。主要有三種:伺服器選擇超時、連線超時和套接字超時。

 

預設值從 1 秒到 30 秒不等,具體取決於應用程式的需求和工作負載。為防止出現此類問題,有必要對上述設定進行相應調整。

 

這包括驅動程式在中止新連線嘗試前將使用的一定毫秒數,以及等待找到合適伺服器的持續時間,以及透過套接字在客戶端和伺服器之間傳送/接收資料的限制。

 

1.伺服器選擇超時

 

這是選擇合適的伺服器執行操作的時間,預設值為 30 秒。

 

如果在這段時間內找不到合適的伺服器,就會出現 "超時錯誤"。這類故障可能有多種根本原因,如網路當機、伺服器方面的任何問題以及副本集內部主節點故障。

 

例如,如果由於網路問題或伺服器端負載請求過大而導致連線出現問題,可能會造成與解析相關的延遲,從而引發超時問題。

 

超過 "伺服器選擇超時 "限制所造成的影響可能會損害 MongoDB 的效率,從而導致選擇錯誤,即超時超過了允許的限制。

 

2.連線超時錯誤

 

連線超時定義了驅動程式在中止之前等待初始連線成功的時間(以毫秒為單位)。MongoDB 的 Java 和 Ruby 驅動程式預設將該引數設定為 10 秒--如果在該時間段內沒有建立連線或新連結,則會放棄嘗試。

 

伺服器關閉或網路問題(如 IP/DNS 設定錯誤或埠號使用不當)都可能導致連線超時。

 

在這裡設定過高的值可能會導致您的應用程式無法達到最佳效能,因為您會讓系統一次又一次地等待建立聯絡的失敗嘗試,這就是為什麼強烈建議測試不同的值,直到得出一個適合您的應用程式需要的值。這樣做有助於確保最佳效能,同時保持足夠的保護水平,防止不必要的連線嘗試。

 

3.套接字超時

 

說到 MongoDB 中的套接字超時問題,可以使用 connectTimeoutMS 和 socketTimeoutMS 選項修改設定。

 

這些值有可能預設為作業系統級別的超時,也有可能為 TCP 連線定義精確的毫秒級時間限制,如果不滿足這些限制,就會導致超時錯誤。

 

由於驅動程式無法在指定的時間內找到有效的 MongoDB 伺服器,此類錯誤會對應用程式造成很大影響並導致故障。

 

為瞭解決這個問題,我們建議您檢查客戶端和伺服器配置,仔細驗證提供的所有連線詳細資訊是否準確,並在 Mongo 驅動程式端使用較大的套接字時間線延長設定截止時間,同時縮短查詢時間,這樣響應時間就不會太長,此外還要驗證網路連結是否穩定/執行正常。

 

最佳化超時配置

要最佳化 Mongo 超時配置,必須檢查連線設定,必要時調整保持連線的時間間隔,並丟擲遇到的超時錯誤。

 

透過修改 MongoDB 驅動程式中的 connectTimeoutMS 選項,增加伺服器選擇超時設定有助於改善網路連線並加快系統的整體效能。

 

所有這些步驟都應根據應用需求量身定製,以確保執行順暢,避免因連線不良或套接字掉線而導致超時,並在 MongoDB 配置過程中針對每種情況定義單獨的限制。

 

配置 MongoDB 伺服器選擇超時

 

MongoDB 驅動程式配置和連線字串可以包含 serverSelectionTimeoutMS 引數,用於控制成功選擇的最長等待時間。這是新一代 Mongo 驅動程式(Java 版本 3.2.x+)中引入的。

 

預設情況下,該超時設定為 30,000 毫秒(30 秒),但建議使用者將其保持在接近 15,000 毫秒(15 秒)的水平,因為它能夠在不超過配置值的情況下加快 MongoDB 選舉程式。修改該設定確實會影響效能。

 

如果在觸發錯誤訊息前給予過多的執行空間,那麼訊息響應時間可能會延長,而如果選擇較短的等待時間,則在嘗試與不可用伺服器聯絡時會出現更頻繁的連線錯誤。

 

設定連線超時引數

設定 MongoDB 連線超時引數是為了避免不必要的嘗試,這取決於具體的使用情況和網路條件。

 

如果設定的值較低,則可以更快地檢測到連線錯誤;如果設定的值較高,則可以更好地解決延遲或間歇性網路問題,不過過長的超時會導致應用程式掛起,幾乎沒有機會建立連線。

 

要適當配置這些值,請根據必要的標準調整 MongoDB 客戶端設定中的 connectTimeoutMS 引數。然後驗證連線是否正確,不要讓連線等待時間過長而導致值高於需要的時間。

 

調整套接字超時以獲得最佳效能

 

在調整 MongoDB 的套接字超時時,需要考慮連線超時和套接字超時等幾個要素。前者是指驅動程式在放棄嘗試連線前所等待的時間。後者指的是套接字處於非活動狀態的時間。

 

要在不同的程式語言中確定這個時間,可以使用某些選項,如 connectTimeoutMS 或 MongoClientOptions 類,這些選項可以透過及時關閉連線來確保更高效的連線,但時間不能太短,以免因缺乏響應而導致經常性故障。

 

調整套接字超時對效能有很大影響,因為對預期持續時間的控制可確保資源不會在無限期的等待中浪費。

 

下面提供了一些示例程式碼,以說明 Java 和 Ruby 中的超時配置。

Java:














List<MongoCredential> creds = new ArrayList<MongoCredential>();  creds.add(MongoCredential.createCredential(username, DBname, password); MongoClientOptions.Builder optionsBuilder = MongoClientOptions.builder(); optionsBuilder.connectTimeout(CONNECTION_TIME_OUT_MS); optionsBuilder.socketTimeout(SOCKET_TIME_OUT_MS); optionsBuilder.serverSelectionTimeout(SERVER_SELECTION_TIMEOUT_MS); MongoClientOptions options = optionsBuilder.build(); Mongo m = new MongoClient(new ServerAddress(server , port), creds, options);

 

NodeJs:















var uri =  'mongodb://[username:password@]host[:port1]/[database]';var options = { server:               { socketOptions:                     {                         socketTimeoutMS: SOCKET_TIME_OUT_MS,                         connectTimeoutMS: CONNECTION_TIMEOUT_MS                     }                }              };MongoClient.connect(uri, options, function(err, db) {  if(!err) {    console.log("We are connected");  }});

 

常見的超時故障排除

MongoDB 伺服器選擇超時問題,其根本原因可能有很多。這些原因包括副本集被認為沒有主伺服器、pod 意外崩潰或配置不正確(如 IP 和驗證詳細資訊儲存不當)。

 

 

診斷連線超時問題

在嘗試診斷 MongoDB 中的連線超時錯誤時,必須檢查伺服器端和客戶端的配置。要有效做到這一點,觀察 "serverSelectionTimeoutMS "和connectTimeoutMS等設定,同時根據需要修改這些值,有助於防止由於網路故障或伺服器/客戶端引數配置不正確而導致的此類問題。

 

寫操作延遲也可能導致超時,在排除故障時應將其考慮在內。

 

解決伺服器選擇延遲

應調整 MongoDB 中的超時值,以減少伺服器選擇延遲並提高伺服器效能。

 

可能導致延遲的問題包括配置不正確的 IP 列表、伺服器選擇過程中超時、帶鎖的密集併發操作以及在副本集沒有找到主節點的情況。

 

透過自定義超時的相關值,可以在響應速度和可靠性之間取得適當的平衡,從而減少 MongoDB 功能造成的延遲。

 

處理套接字超時異常

配置 MongoDB 時,必須適當調整套接字超時值,以確保可靠的網路連線並防止超時觸發。

 

為此,可以使用 MongoDB Ruby 驅動程式中包含的 connect_timeout 設定,這些設定會限制操作在超時前等待響應的時間。

 

除了正確調整這些選項外,還必須採取其他步驟,例如最佳化連線池設定,以及在使用較新版本的軟體時檢查任何潛在的底層網路問題。

 

在透過提高超時限制來提高應用程式可靠性,或透過降低超時限制來提高效能之間找到最佳平衡點,是防止意外套接字超時異常發生,同時保持資料庫環境足夠響應時間的關鍵。

 

副本集中的超時考慮因素

在使用 MongoDB 時,副本伺服器的可用性和狀態會嚴重影響初始連線超時。將 serverSelectionTimeoutMS 降低到 15 秒、配置日誌大小以實現副本間的高效同步,以及適當調整保持連線的時間間隔,都有助於最佳化伺服器選擇,從而最大限度地減少等待時間。

 

在進行更改之前必須慎重考慮。所做的調整可能會因等待時間過長或過短而影響整體效能,如果相關資料庫不能立即可用,可能會導致更多的超時。

 

負載平衡和超時管理

在負載平衡請求時,超時值會受到網路延遲和資料傳輸延遲的影響。在調整負載平衡設定時,必須確定合適的請求超時時間,以獲得有效的效能結果。


來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70027826/viewspace-3002312/,如需轉載,請註明出處,否則將追究法律責任。

相關文章