mongodb基礎整理篇————副本概念篇[外篇]( 二 )

可以看下哪些是自己想要的 。
簡單的實驗非主節點是否可以寫入數據:

mongodb基礎整理篇————副本概念篇[外篇]

文章插圖
結果是不行的 。
主節點寫入是否從節點會同步:
連接27017 判斷是否是主節點:
mongodb基礎整理篇————副本概念篇[外篇]

文章插圖
那么開始連接一個從節點,并從節點上讀取數據,和mysql 一樣 。
mongodb基礎整理篇————副本概念篇[外篇]

文章插圖
可以看到不讓我們進行訪問
這里面是一個這樣的機制:
因為從節點落后于主節點,那么默認情況下是不讓從從節點上讀取數據 。
這和mysql 是不一樣的 。
那么是否能修改配置來從從節點上讀取數據,這也是可以的 。
mongodb基礎整理篇————副本概念篇[外篇]

文章插圖
可以修改客戶端的連接配置,可以來進行完成,然后就可以訪問從節點數據了 。
下面來實驗,如果主節點沒了,那么是否這個副本集是否就沒法使用了?
db.adminCommand({"shutdown":1});使用上面這個命令進行關閉 。
mongodb基礎整理篇————副本概念篇[外篇]

文章插圖
可以看到的確關閉了 。
那么隨便進入一個節點看下 。
進入27018 查看 。
mongodb基礎整理篇————副本概念篇[外篇]

文章插圖
那么主節點就變成了27018了 。
用rs.status() 查看27017的狀況:
mongodb基礎整理篇————副本概念篇[外篇]

文章插圖
已經不健康了,那么再次啟動27017一下 。
【mongodb基礎整理篇————副本概念篇[外篇]】
mongodb基礎整理篇————副本概念篇[外篇]

文章插圖
27017 就變成從節點了 。
這個時候要增加副本集怎么辦:
可以使用rs.add({"localhost":"27020"})
如果要刪除怎么辦:
可以使用rs.remove({"localhost":"27020"})
如果進行修改怎么辦:
var config = rs.config()config.members[0].host="localhost":"27017"rs.reconfig(config)
這樣就從新加載了 。
副本集的一些理論知識前面知道了 , 副本集3個情況下 , 如果一個沒了 , 還是可以運行的 。
那么如果兩個掛了,是否最后一個可以繼續運行呢?
答案是不能的,這里就不實驗了 。
因為有一個理論知識:
副本集在絕大多數活著的情況下才能正常運行 。
也就是說3個有兩個正常才能運行,5個就要3個 。
為什么這樣呢? 假設一個問題 , 現在有3個副本集,一個因為網絡問題,無法與其他節點連接 。
那么它自己就選自己為主節點,其他兩個選他們自己其中一個為主節點 。
那么問題來了,就有兩個主節點了 , 這樣就可以寫入不同的主節點,那么就出現問題了,兩邊數據無法同步了 。
下一個問題,副本集是如何選舉的呢? 什么時候進行選舉呢?
當一個從節點無法與主節點連通時候,他就會聯系并請求其他的副本集成員將自己選舉為主節點 。
沒錯 , 就像邊關大將,如果察覺皇帝不在了,就開始密謀向其他邊關大臣推舉自己作為皇帝 。
然后其他邊關大臣要確認是不是皇帝駕崩了,如果確認皇帝沒有駕崩,那么是不會進行支持的 。
如果確定皇帝不在了,那么也不一樣選發起的這個邊關大將 。
而是先考慮哪個副本集是最新數據,然后是優先級最高的節點作為主節點 。
如果一個副本是最新數據,而其他沒有,那么會選擇這個節點作為主節點 。但是值得注意的是,如果優先級更高的節點同步了最新數據后 , 那么優先級更高的節點,將會成為新的主節點 。
副本集之間會互相間隔兩秒發送一次心跳 。如果某個成員在10秒內沒有反饋心跳,則其他成員會將改不良成員標記為無法訪問 。
前文提及到優先級最高的會作為主節點:
那么如何設置優先級呢?
rs.add({"host":"localhost:27017", "priority":1.5})這個優先級有一個特殊值,如果選擇0的話,那么這個節點永遠不會成為新的節點 。
然后優先級更高的一般會成為主節點 , 是這樣的,如果設置了優先級更高的副本集,那么當這個副本集擁有最新數據的時候 , 當前節點會自動退位給這個節點 。

推薦閱讀