mongodb複制集(replica set)通過<code>存儲多份資料副本</code>來保證資料的高可靠,通過<code>自動的主備切換機制</code>來保證服務的高可用。但需要注意的時,連接配接副本集的<code>姿勢</code>如果不對,服務高可用将不複存在。
mongodb複制集裡primary節點是不固定的,當遇到複制集輪轉更新、primary當機、網絡分區等場景時,複制集可能會選舉出一個新的primary,而原來的primary則會降級為secondary,即發生主備切換。
總而言之,mongodb複制集裡primary節點是不固定的,不固定的,不固定的,重要的事情說3遍。
當連接配接複制集時,如果直接指定<code>primary</code>的位址來連接配接,當時可能可以正确讀寫資料的,但一旦複制集發生主備切換,你連接配接的primary會降級為secondary,你将無法繼續執行寫操作,這将嚴重影響到你的線上服務。
是以生産環境千萬不要直連primary,千萬不要直連primary,千萬不要直連primary。
說了這麼多,到底該如何連接配接複制集?
要正确連接配接複制集,需要先了解下mongodb的connection string uri,所有官方的driver都支援以connection string的方式來連接配接mongodb。
下面就是connection string包含的主要内容
mongodb:// 字首,代表這是一個connection string
username:password@ 如果啟用了鑒權,需要指定使用者密碼
hostx:portx 複制內建員的ip:port資訊,多個成員以逗号分割
/database 鑒權時,使用者帳号所屬的資料庫
?options 指定額外的連接配接選項
以連接配接aliclouddb for mongodb為例,當你購買阿裡雲mongodb複制集時,就會得到複制集的名稱、以及複制內建員的位址資訊。
為了友善使用者使用,控制台上也生成了連接配接複制集的connection string及通過mongo shell連接配接到指令。
例如通過java來連接配接,更多的demo
通過正确的connection string來連接配接mongodb複制集時,用戶端會自動檢測複制集的主備關系,當主備關系發生變化時,自動将寫切換到新的主上,以保證服務的高可用。
在options裡添加<code>readpreference=secondarypreferred</code>即可實作,讀請求優先到secondary節點,進而實作讀寫分離的功能,更多<code>讀選項</code>參考read preferences
在options裡添加<code>maxpoolsize=xx</code>即可将用戶端連接配接池限制在xx以内。
在options裡添加<code>w= majority</code>即可保證寫請求成功寫入大多數節點才向用戶端确認,更多<code>寫選項</code>參考write concern