MongoDB複製集(Replica Set)經過存儲多份數據副本
來保證數據的高可靠,經過自動的主備切換機制
來保證服務的高可用。但須要注意的時,鏈接副本集的姿式
若是不對,服務高可用將不復存在。html
MongoDB複製集裏Primary節點是不固定的,當遇到複製集輪轉升級、Primary宕機、網絡分區等場景時,複製集可能會選舉出一個新的Primary,而原來的Primary則會降級爲Secondary,即發生主備切換。java
總而言之,MongoDB複製集裏Primary節點是不固定的,不固定的,不固定的,重要的事情說3遍。
mongodb
當鏈接複製集時,若是直接指定Primary
的地址來鏈接,當時可能能夠正確讀寫數據的,但一旦複製集發生主備切換,你鏈接的Primary會降級爲Secondary,你將沒法繼續執行寫操做,這將嚴重影響到你的線上服務。數據庫
因此生產環境千萬不要直連Primary,千萬不要直連Primary,千萬不要直連Primary。網絡
說了這麼多,到底該如何鏈接複製集?app
要正確鏈接複製集,須要先了解下MongoDB的Connection String URI,全部官方的driver都支持以Connection String的方式來鏈接MongoDB。
阿里雲
下面就是Connection String包含的主要內容spa
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
以鏈接AliCloudDB for MongoDB爲例,當你購買阿里雲MongoDB複製集時,就會獲得複製集的名稱、以及複製集成員的地址信息。code
例如經過java來鏈接,更多的DEMOhtm
MongoClientURI connectionString = new MongoClientURI("mongodb://root:****@dds-bp114e3f1fc441342.mongodb.rds.aliyuncs.com:3717,dds-bp114e3f1fc441341.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-677201"); // ****替換爲root密碼 MongoClient client = new MongoClient(connectionString); MongoDatabase database = client.getDatabase("mydb"); MongoCollection<Document> collection = database.getCollection("mycoll");
經過正確的Connection String來鏈接MongoDB複製集時,客戶端會自動檢測複製集的主備關係,當主備關係發生變化時,自動將寫切換到新的主上,以保證服務的高可用。
在options裏添加readPreference=secondaryPreferred
便可實現,讀請求優先到Secondary節點,從而實現讀寫分離的功能,更多讀選項
參考Read preferences
在options裏添加maxPoolSize=xx
便可將客戶端鏈接池限制在xx之內。
在options裏添加w= majority
便可保證寫請求成功寫入大多數節點才向客戶端確認,更多寫選項
參考Write Concern