云數據庫 MongoDB 版副本集實例支持高可用以及讀寫分離,但您必須使用正確的方法連接實例來保障高可用,并設置相關配置實現讀寫分離。
背景信息
MongoDB副本集實例的主節點(Primary節點)不是固定的某個節點,當出現異常時,系統會觸發主備切換,原來的主節點會降為從節點(Secondary節點)。
當您使用主節點的直連地址連接數據庫時,所有讀寫操作都會在主節點完成,從而導致該節點壓力大,且一旦發生主備切換,您連接的主節點會變為從節點,此時通過該地址連接的客戶端將無法執行寫操作,這會嚴重影響到您的業務正常運行。
高可用
云數據庫 MongoDB 版提供了ConnectionStringURI高可用地址,該地址包含實例所有節點的地址,發生主備切換后,寫請求將會被路由到新的主節點上,不會出現無法執行寫操作的情況。
更多關于MongoDB副本集實例連接地址的說明,請參見副本集實例連接說明。
為實現高可用,建議您生產環境的應用程序都通過ConnectionStringURI地址連接實例。
目前所有官方Driver都支持通過ConnectionStringURI地址連接MongoDB。
獲取高可用地址
訪問MongoDB副本集實例列表,在上方選擇資源組和地域,然后單擊目標實例ID。
在目標實例頁面的左側導航欄,單擊數據庫連接。
獲取ConnectionStringURI高可用地址。
使用ConnectionStringURI地址連接實例后,客戶端會自動檢測節點的主備關系,當主備關系發生變化時,自動將寫操作切換到新的Primary節點上,以保證服務的高可用。
讀寫分離
ConnectionStringURI高可用地址提供了readPreference
和readPreferenceTags
參數,readPreference
參數可實現讀寫分離和負載均衡;readPreferenceTags
可以將讀請求優先發送到標簽對應的節點。
靈活使用readPreference
和readPreferenceTags
參數,通過不同標簽的組合,可以滿足您不同場景的需求。
讀請求失敗的處理方法 | 讀請求發送的節點 | 參數組合方案 |
讀請求失敗情況下,讀請求發送到主節點 | 優先讀主節點 |
|
優先讀從節點和只讀節點 |
| |
優先讀從節點(僅支持云盤版實例) |
| |
優先讀只讀節點 |
| |
讀請求失敗情況下,讀請求不發送到主節點 | 僅讀從節點和只讀節點 |
|
僅讀從節點(僅支持云盤版實例) |
| |
僅讀只讀節點 |
|
高可用地址實現讀寫分離
如果您希望實現讀寫分離,且有明確的需求場景,在ConnectionStringURI地址后添加readPreference
和readPreferenceTags
參數即可實現讀寫分離。
例如,您希望所有寫請求發送到主節點,讀請求僅發送到只讀節點,且讀請求失敗情況下,讀請求不發送到主節點,僅需在ConnectionStringURI地址后添加&readPreference=secondary&readPreferenceTags=role:readonly
。示例如下:
mongodb://root:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-6108****&readPreference=secondary&readPreferenceTags=role:readonly
測試環境使用的驅動版本如下:
pymongo 3.11.4
mongodb-driver-sync 4.6.1
mongosh 2.2.15