問題描述

寫入數據至云數據庫MongoDB副本集實例時,出現"errmsg": "not master", "code": 10107, "codeName": "NotMaster"、"errmsg": "not master", "code": 10107, "codeName": "NotWritablePrimary"Time out after 30000ms while waiting for a server that matches writableServerSelector.報錯。

常見原因

副本集實例發生了主備切換,導致節點角色發生變化,如果您的業務通過主節點(Primary節點)的地址連接,主備切換后實際連接的節點角色變成了從節點(Secondary節點),所以寫入失敗。
說明 導致實例發生主備切換的原因有很多種,具體請參見為什么實例會發生主備切換?。

每個副本集實例包含一個主節點、一個或多個從節點、一個隱藏節點(Hidden節點)和可選的一個或多個只讀節點(ReadOnly節點)。其中主節點、從節點和隱藏節點合起來統稱為“主備節點”。每個節點有自己的屬性信息,包括節點角色(Primary、Secondary、HiddenReadOnly)、節點ID、節點地址、域名信息和端口等。主備切換會導致節點角色發生變化,而不會改變節點的其他屬性。

副本集實例中節點1的角色是主節點,節點2的角色是從節點,如果主備切換前您連接的是主節點地址,即節點1的地址,實例發生主備切換后,節點1變成了從節點,您實際連接的是從節點地址,所以寫入失敗。

解決方案

  • 手動切換實例的節點角色,將業務實際連接的單節點地址對應節點切換為主節點。如何切換節點角色,請參見切換節點角色
  • 推薦生產環境的應用程序通過ConnectionStringURI地址連接數據庫。當某個節點出現故障時,不會因為主備切換而影響應用的讀寫操作,更多信息,請參見副本集實例連接說明。
  • 請為業務設計重連機制和異常處理能力,連接閃斷后可自動重連,保障業務穩定運行。