DocumentDB 報錯“not master”

gongchengship發表於2024-10-11

DocumentDB 或者 MongoDB 使用中,收到 "not master" 錯誤通常表明當前連線的節點不是主節點(primary),因此它不能處理寫操作。這種錯誤一般出現在複製集的環境下,因為只有複製集的主節點能夠處理寫操作,而次節點(secondary)只能處理讀操作。

可能的原因與解決方案:

  1. 複製集中的主節點變化

    • 在 MongoDB 複製集中,選舉機制可能導致當前主節點(primary)發生變化。如果你嘗試連線的節點不再是主節點,會導致 not master 錯誤。
    • 解決方案:確保你的應用連線到了主節點,或使用 MongoDB URI 中的 replicaSet 引數來自動選擇主節點。例如:
      mongodb://username:password@host1:27017,host2:27017,host3:27017/mydb?replicaSet=myReplicaSet
      

    這個 URI 會讓 MongoDB 驅動程式自動處理節點間的切換,確保連線的是主節點。

  2. 連線字串缺少 readPreference 配置

    • 如果你的應用程式主要進行讀操作,可以設定 readPreferencesecondaryPreferred,允許從次節點讀取資料,避免主節點變化導致錯誤。
    • 解決方案:更新你的連線字串以包含 readPreference
      mongodb://username:password@host1:27017,host2:27017,host3:27017/mydb?replicaSet=myReplicaSet&readPreference=primaryPreferred
      

    這樣可以保證驅動程式在主節點不可用時自動選擇次節點進行讀取。

  3. 連線池未及時更新主節點資訊

    • 當主節點發生變化時,連線池中的連線資訊可能沒有及時更新,導致仍然嘗試與舊的主節點進行通訊。
    • 解決方案:你可以透過重啟應用或者重新初始化連線來重新整理連線池,確保應用程式重新獲取到正確的主節點資訊。
  4. 讀寫分離的需求

    • 某些場景下,可能需要特定的資料讀寫分離配置,以確保只向主節點傳送寫請求,向次節點傳送讀請求。
    • 解決方案:設定適當的 readPreference,並確保只向主節點傳送寫請求。如果你的應用需要讀寫分離,確保正確配置 readConcernwriteConcern
  5. 主節點不可用

    • 如果主節點由於某些原因(如網路問題、效能瓶頸)不可用,可能導致 not master 錯誤。
    • 解決方案:檢查你的複製集狀態,使用命令 rs.status() 來檢視複製整合員的狀態,確保主節點正常工作。如果主節點當機,需要等待選舉新的主節點。

操作步驟:

  1. 檢查複製集狀態
    在 MongoDB Shell 中執行以下命令,確認哪個節點是主節點:

    rs.status()
    
  2. 連線字串最佳化
    如果你使用的是 MongoDB 驅動程式,確保你使用的連線字串包含複製集配置,並正確設定 readPreferencewriteConcern

    mongodb://username:password@host1:27017,host2:27017,host3:27017/mydb?replicaSet=myReplicaSet&readPreference=primaryPreferred&readConcern=majority&writeConcern=majority
    
  3. 重啟或更新應用程式連線
    如果問題由於連線池未重新整理導致,考慮重啟你的應用程式或重新整理連線池。

總結

"not master" 錯誤通常是因為你正在嘗試對非主節點進行寫操作。解決方法包括確保連線字串正確,使用自動主節點切換機制,更新連線池,或檢查複製集的狀態以確定主節點的健康狀態。

相關文章