一個復制集的隱藏成員被配置為priority: 0,為了阻止它們被選舉為主,設置hidden: true,阻止客戶端連接到復制集路由讀操作到它,即使他們指定了一個讀偏好為secondary。
從一個隱藏成員讀,你會看到一個獨立的連接,而不是MongoReplicaSetClient類型,并指定slave_ok。
隱藏成員設置
你可以使用mongo shell來隱藏一個存在復制集的成員:
$ mongo admin -uxucy -p PRIMARY> conf = rs.config() { "_id" : "test", "version" : 21, "members" : [ { "_id" : 0, "host" : "xucy.local:27017", }, { "_id" : 1, "host" : "xucy.local:28017", }, { "_id" : 2, "host" : "xucy.local:29017", } ] } PRIMARY> conf.members[1].priority = 0 PRIMARY> conf.members[1].hidden = true PRIMARY> conf.version += 1 PRIMARY> rs.reconfig(conf)
xucy.local:28017現在隱藏。他將繼續復制和像往常一樣在選舉中投票,但是連接到復制集的客戶端將不會從它讀取,即使xucy.local:29017下線:
irb(main):012:0> rs = Mongo::MongoReplicaSetClient.new(["xucy.local:27017", "xucy.local:28017", "xucy.local:29017"]) => <Mongo::MongoReplicaSetClient:0x3fe06e4fe564 @seeds=[["xucy.local", 27017], ["xucy.local", 28017], ["xucy.local", 29017]] @connected=true> irb(main):013:0> rs.primary => ["xucy.local", 27017] irb(main):014:0> rs.secondaries => #<Set: {}> # an empty set -- as far as this connection is concerned, there are no secondaries.
報表代碼將會像這樣(使用Ruby):
require 'mongo' reporting = Mongo::MongoClient.new("xucy.local", "28017", slave_ok: true) # error checking goes here reporting['my_application']['users'].aggregate(...)
考慮
使用隱藏的成員是一個最簡單的方式去配置實例用于專屬的工作負載像報表,然而:
隱藏成員不能在緊急情況下讀取
帶有2個普通和1個隱藏成員在一個復制集中,對于寫的錯誤容忍等價于一個常規的3個成員的集合。然而,你失去兩個節點,你的生產應用將不能優雅的降級到只讀模式,因為你的隱藏成員將不允許復制集客戶端讀取。如果你只是喜歡一個隱藏成員的簡單,并且花費不是問題,使用一個5成員(帶有一個成員隱藏)的集合代替。
對于復制集的包裝代碼不能被使用
很多團隊創建應用定制的包裝代碼添加基礎知識給客戶端,由MongoDB驅動提供。因為你需要使用獨立連接到你的報表實例,你不能重用投資,將會讓你很傷心。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。