在 DocumentDB 或者 MongoDB 使用中,收到 "not master" 錯誤通常表明當前連線的節點不是主節點(primary),因此它不能處理寫操作。這種錯誤一般出現在複製集的環境下,因為只有複製集的主節點能夠處理寫操作,而次節點(secondary)只能處理讀操作。
可能的原因與解決方案:
-
複製集中的主節點變化:
- 在 MongoDB 複製集中,選舉機制可能導致當前主節點(primary)發生變化。如果你嘗試連線的節點不再是主節點,會導致
not master
錯誤。 - 解決方案:確保你的應用連線到了主節點,或使用 MongoDB URI 中的
replicaSet
引數來自動選擇主節點。例如:mongodb://username:password@host1:27017,host2:27017,host3:27017/mydb?replicaSet=myReplicaSet
這個 URI 會讓 MongoDB 驅動程式自動處理節點間的切換,確保連線的是主節點。
- 在 MongoDB 複製集中,選舉機制可能導致當前主節點(primary)發生變化。如果你嘗試連線的節點不再是主節點,會導致
-
連線字串缺少
readPreference
配置:- 如果你的應用程式主要進行讀操作,可以設定
readPreference
為secondaryPreferred
,允許從次節點讀取資料,避免主節點變化導致錯誤。 - 解決方案:更新你的連線字串以包含
readPreference
:mongodb://username:password@host1:27017,host2:27017,host3:27017/mydb?replicaSet=myReplicaSet&readPreference=primaryPreferred
這樣可以保證驅動程式在主節點不可用時自動選擇次節點進行讀取。
- 如果你的應用程式主要進行讀操作,可以設定
-
連線池未及時更新主節點資訊:
- 當主節點發生變化時,連線池中的連線資訊可能沒有及時更新,導致仍然嘗試與舊的主節點進行通訊。
- 解決方案:你可以透過重啟應用或者重新初始化連線來重新整理連線池,確保應用程式重新獲取到正確的主節點資訊。
-
讀寫分離的需求:
- 某些場景下,可能需要特定的資料讀寫分離配置,以確保只向主節點傳送寫請求,向次節點傳送讀請求。
- 解決方案:設定適當的
readPreference
,並確保只向主節點傳送寫請求。如果你的應用需要讀寫分離,確保正確配置readConcern
和writeConcern
。
-
主節點不可用:
- 如果主節點由於某些原因(如網路問題、效能瓶頸)不可用,可能導致
not master
錯誤。 - 解決方案:檢查你的複製集狀態,使用命令
rs.status()
來檢視複製整合員的狀態,確保主節點正常工作。如果主節點當機,需要等待選舉新的主節點。
- 如果主節點由於某些原因(如網路問題、效能瓶頸)不可用,可能導致
操作步驟:
-
檢查複製集狀態:
在 MongoDB Shell 中執行以下命令,確認哪個節點是主節點:rs.status()
-
連線字串最佳化:
如果你使用的是 MongoDB 驅動程式,確保你使用的連線字串包含複製集配置,並正確設定readPreference
和writeConcern
:mongodb://username:password@host1:27017,host2:27017,host3:27017/mydb?replicaSet=myReplicaSet&readPreference=primaryPreferred&readConcern=majority&writeConcern=majority
-
重啟或更新應用程式連線:
如果問題由於連線池未重新整理導致,考慮重啟你的應用程式或重新整理連線池。
總結
"not master" 錯誤通常是因為你正在嘗試對非主節點進行寫操作。解決方法包括確保連線字串正確,使用自動主節點切換機制,更新連線池,或檢查複製集的狀態以確定主節點的健康狀態。