這是正確的行爲。大多數副本集必須彼此聯繫起來,然後舉行選舉,以便擁有主要的副本並接受任何寫入操作。您不能配置副本集,以便當1/3成員啓動時(從某些角度來看),該集可以接受寫入。爲什麼?假設我們有一個3構件副本集,在一個不同的數據中心的每個成員,並且該孤副本集成員被允許使自己初級
DC1: rs0/serverA
DC2: rs0/serverB
DC3: rs0/serverC
逆反侏儒切割所有所述數據中心之間的線的;服務器A,B和C不能再彼此通信。服務器A將這種情況視爲「我還活着,但B和C已經死了,我必須成爲主要!」服務器B和C對自己說同樣的話。三個客戶端X,Y,Z連接,一個A,一個B,一個C.他們發送涉及寫入以下操作:在數據中心之間
X: db.mission_control.drop()
Y: db.mission_control.update({ }, { "fire_all_missiles" : true }, { "multi" : true })
Z: db.mission_control.update({ }, { "world_peace_mode" : "engage" }, { "multi" : true })
現在導線已恢復,A,B ,C可以再次相互交談。我們應該怎樣處理mission_control
系列?放下它,然後試圖發射導彈,然後嘗試參與世界和平?發射導彈,然後放下它,然後嘗試參與世界和平?也許,最卑鄙的是,我們應該參與世界和平,那麼一旦所有人放鬆警惕,發射導彈,然後通過放棄收集來破壞證據。 MongoDB如何知道在這種情況下該做什麼?
因此,您不能擁有一個沒有多數的主節點(接受寫入的節點)。儘管如此,您仍然可以在沒有主服務器時從輔助服務器讀取數據。你只需要設置一個secondary read preference。
感謝它清楚了事情,但通過這個比喻我有2個更多的問題。 所以如果以某種方式我需要監視我的數據(只讀,我認爲),我只能訪問'rs0/serverA'。我怎樣才能做到這一點,而無需操縱副本集配置? 如果我有2個數據中心:A(有3個mongo節點)和B(有2個mongo節點)。有一天,A - B之間的連接被切斷。這是不是說這兩個數據中心都有自己的PRIMARY節點? – DennyHiu 2015-04-03 03:00:39