溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MongoDB副本集的示例分析

發(fā)布時(shí)間:2021-11-11 14:28:45 來源:億速云 閱讀:182 作者:小新 欄目:關(guān)系型數(shù)據(jù)庫

小編給大家分享一下MongoDB副本集的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!


實(shí)驗(yàn)環(huán)境使用的Mongodb版本為mongodb-linux-x86_64-2.6.0
由三臺虛擬機(jī)搭建,配置為單核,1G內(nèi)存。
實(shí)驗(yàn)環(huán)境如下:
MongoDB副本集的示例分析
MongoDB的副本集不同于以往的主從模式。
在集群Master故障的時(shí)候,副本集可以自動(dòng)投票,選舉出新的Master,并引導(dǎo)其余的Slave服務(wù)器連接新的Master,
而這個(gè)過程對于應(yīng)用是透明的。可以說MongoDB的副本集是自帶故障轉(zhuǎn)移功能的主從復(fù)制。

1 相對于傳統(tǒng)主從模式的優(yōu)勢
傳統(tǒng)的主從模式,需要手工指定集群中的Master。
如果Master發(fā)生故障,一般都是人工介入,指定新的Master。
這個(gè)過程對于應(yīng)用一般不是透明的,往往伴隨著應(yīng)用重新修改配置文件,重啟應(yīng)用服務(wù)器等。
MongoDB副本集的示例分析
而MongoDB副本集,集群中的任何節(jié)點(diǎn)都可能成為Master節(jié)點(diǎn)。
一旦Master節(jié)點(diǎn)故障,則會(huì)在其余節(jié)點(diǎn)中選舉出一個(gè)新的Master節(jié)點(diǎn)。
并引導(dǎo)剩余節(jié)點(diǎn)連接到新的Master節(jié)點(diǎn)。這個(gè)過程對于應(yīng)用是透明的。
MongoDB副本集的示例分析

2 Bully選舉算法
Bully算法是一種協(xié)調(diào)者(主節(jié)點(diǎn))競選算法,主要思想是集群的每個(gè)成員都可以聲明它是主節(jié)點(diǎn)并通知其他節(jié)點(diǎn)。
別的節(jié)點(diǎn)可以選擇接受這個(gè)聲稱或是拒絕并進(jìn)入主節(jié)點(diǎn)競爭。被其他所有節(jié)點(diǎn)接受的節(jié)點(diǎn)才能成為主節(jié)點(diǎn)。
節(jié)點(diǎn)按照一些屬性來判斷誰應(yīng)該勝出。這個(gè)屬性可以是一個(gè)靜態(tài)ID,也可以是更新的度量像最近一次事務(wù)ID(最新的節(jié)點(diǎn)會(huì)勝出)
他的選舉過程大致如下:
? 得到每個(gè)服務(wù)器節(jié)點(diǎn)的最后操作時(shí)間戳。每個(gè)mongodb都有oplog機(jī)制會(huì)記錄本機(jī)的操作,方便和主服務(wù)器進(jìn)行對比數(shù)據(jù)是否同步還可以用于錯(cuò)誤恢復(fù)。
? 如果集群中大部分服務(wù)器down機(jī)了,保留活著的節(jié)點(diǎn)都為 secondary狀態(tài)并停止,不選舉了。
? 如果集群中選舉出來的主節(jié)點(diǎn)或者所有從節(jié)點(diǎn)最后一次同步時(shí)間看起來很舊了,停止選舉等待人來操作。
? 如果上面都沒有問題就選擇最后操作時(shí)間戳最新(保證數(shù)據(jù)是最新的)的服務(wù)器節(jié)點(diǎn)作為主節(jié)點(diǎn)。

選舉的觸發(fā)條件
初始化一個(gè)副本集時(shí)。
副本集和主節(jié)點(diǎn)斷開連接,可能是網(wǎng)絡(luò)問題。
主節(jié)點(diǎn)掛掉。
人為介入,比如修改節(jié)點(diǎn)優(yōu)先級等

選舉還有個(gè)前提條件,參與選舉的節(jié)點(diǎn)數(shù)量必須大于副本集總節(jié)點(diǎn)數(shù)量的一半,如果已經(jīng)小于一半了所有節(jié)點(diǎn)保持只讀狀態(tài)。

3 搭建副本集集群
每個(gè)虛擬機(jī)都使用如下的配置文件啟動(dòng)實(shí)例:
dbpath        =/home/lihuilin/mongodata
smallfiles      =true
replSet        =mvbox
然后在任意一臺虛擬機(jī)登陸mongo,輸入如下設(shè)置
config = { _id:"mvbox", members:[
{_id:0,host:"192.168.1.1:27017"},
{_id:1,host:"192.168.1.2:27017"},
{_id:2,host:"192.168.1.3:27017"}]
}
rs.initiate(config);
可以看到副本集已經(jīng)生效

MongoDB副本集的示例分析

可以使用rs.status()查看集群狀態(tài),或者rs.isMaster()
MongoDB副本集的示例分析

4 更改節(jié)點(diǎn)優(yōu)先級
修改節(jié)點(diǎn)的優(yōu)先級可以觸發(fā)重新選舉,這樣可以人工指定主節(jié)點(diǎn)。
使用如下命令,在主節(jié)點(diǎn)登錄,將192.168.1.3提升為Master。
rs.conf();
cfg=rs.conf();
cfg.members[0].priority=1
cfg.members[1].priority=1
cfg.members[2].priority=10
rs.reconfig(cfg);
需要注意的是,修改節(jié)點(diǎn)優(yōu)先級需要登錄Master節(jié)點(diǎn)運(yùn)行。否則報(bào)錯(cuò)。
MongoDB副本集的示例分析

再次查看集群狀態(tài),可以看到192.168.1.3已經(jīng)作為Master運(yùn)行
MongoDB副本集的示例分析


5 節(jié)點(diǎn)類型
MongoDB的節(jié)點(diǎn)類型有主節(jié)點(diǎn)(Master),副本節(jié)點(diǎn)(Slave或者稱為Secondary),仲裁節(jié)點(diǎn),Secondary-Only節(jié)點(diǎn),Hidden節(jié)點(diǎn),Delayed節(jié)點(diǎn)和Non-Voting節(jié)點(diǎn)。

仲裁節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),只是負(fù)責(zé)故障轉(zhuǎn)移的群體投票,這樣就少了數(shù)據(jù)復(fù)制的壓力。

Secondary-Only:不能成為primary節(jié)點(diǎn),只能作為secondary副本節(jié)點(diǎn),防止一些性能不高的節(jié)點(diǎn)成為主節(jié)點(diǎn)。

Hidden:這類節(jié)點(diǎn)是不能夠被客戶端制定IP引用,也不能被設(shè)置為主節(jié)點(diǎn),但是可以投票,一般用于備份數(shù)據(jù)。

Delayed:可以指定一個(gè)時(shí)間延遲從primary節(jié)點(diǎn)同步數(shù)據(jù)。主要用于備份數(shù)據(jù),如果實(shí)時(shí)同步,誤刪除數(shù)據(jù)馬上同步到從節(jié)點(diǎn)。所以延遲復(fù)制主要用于避免用戶錯(cuò)誤。

Non-Voting:沒有選舉權(quán)的secondary節(jié)點(diǎn),純粹的備份數(shù)據(jù)節(jié)點(diǎn)。

6 設(shè)置隱藏節(jié)點(diǎn)(Hidden)
隱藏節(jié)點(diǎn)可以在選舉中投票,但是不能被客戶端引用,也不能成為主節(jié)點(diǎn)。也就是說這個(gè)節(jié)點(diǎn)不能用于讀寫分離的場景。
將192.168.1.3設(shè)置為隱藏節(jié)點(diǎn)。
注意,只有優(yōu)先級為0的成員才能設(shè)置為隱藏節(jié)點(diǎn)。
如果設(shè)置優(yōu)先級不為0的節(jié)點(diǎn)為隱藏節(jié)點(diǎn),則報(bào)錯(cuò)如下
MongoDB副本集的示例分析

使用如下命令設(shè)置隱藏節(jié)點(diǎn)
cfg=rs.conf();
cfg.members[0].priority=10
cfg.members[1].priority=1
cfg.members[2].priority=0
cfg.members[2].hidden=1
rs.reconfig(cfg);
設(shè)置完成之后,使用rs.status()查看該節(jié)點(diǎn)還是SECONDARY狀態(tài)。
但是通過rs.isMaster()和rs.conf()可以看到這個(gè)節(jié)點(diǎn)的變化。
rs.isMaster()的hosts中192.168.1.3節(jié)點(diǎn)已經(jīng)不可見
MongoDB副本集的示例分析
并且rs.conf()顯示該節(jié)點(diǎn)狀態(tài)為hidden

MongoDB副本集的示例分析


7 設(shè)置仲裁節(jié)點(diǎn)
仲裁節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),只是用于投票。所以仲裁節(jié)點(diǎn)對于服務(wù)器負(fù)載很低。
節(jié)點(diǎn)一旦以仲裁者的身份加入集群,他就只能是仲裁者,無法將仲裁者配置為非仲裁者,反之也是一樣。
另外一個(gè)集群最多只能使用一個(gè)仲裁者,額外的仲裁者拖累選舉新Master節(jié)點(diǎn)的速度,同時(shí)也不能提供更好的數(shù)據(jù)安全性。
初始化集群時(shí),設(shè)置仲裁者的配置如下
config = { _id:"mvbox", members:[
{_id:0,host:"192.168.1.1:27017"},
{_id:1,host:"192.168.1.2:27017",arbiterOnly:true},
{_id:2,host:"192.168.1.3:27017"}]
}
使用仲裁者主要是因?yàn)镸ongoDB副本集需要奇數(shù)成員,而又沒有足夠服務(wù)器的情況。在服務(wù)器充足的情況下,不應(yīng)該使用仲裁者節(jié)點(diǎn)。

8 設(shè)置延遲復(fù)制節(jié)點(diǎn)
MongoDB官方?jīng)]有增量備份方案,只有一個(gè)導(dǎo)出的工具mongodump。
他不能像數(shù)據(jù)庫一樣,通過binlog或者歸檔日志將數(shù)據(jù)推到事故發(fā)生的前一刻。
假設(shè)每天凌晨2點(diǎn)使用mongodump備份,而下午5點(diǎn)發(fā)生事故,數(shù)據(jù)庫損毀,則凌晨2點(diǎn)到下午5點(diǎn)的數(shù)據(jù)全部都會(huì)丟失。
雖然副本集可以一定程度避免這個(gè)問題,但是默認(rèn)情況下不能避免人為的失誤。
比如沒有指定篩選條件刪除了全部的數(shù)據(jù)。副本節(jié)點(diǎn)會(huì)應(yīng)用這個(gè)命令,刪除所有副本節(jié)點(diǎn)的數(shù)據(jù)。
在這個(gè)場景下,可以使用延遲節(jié)點(diǎn),它會(huì)延遲應(yīng)用復(fù)制。
如果主節(jié)點(diǎn)發(fā)生了人為的失誤,而這個(gè)操作因?yàn)檠舆t的原因,還沒有應(yīng)用在延遲節(jié)點(diǎn)。
這個(gè)時(shí)候,修改延遲節(jié)點(diǎn)的優(yōu)先級為最高級,使他成為新的Master服務(wù)器。

延遲節(jié)點(diǎn)的優(yōu)先級必須為0.這個(gè)和hidden節(jié)點(diǎn)是一樣的。
設(shè)置192.168.1.2為延遲節(jié)點(diǎn)
cfg=rs.conf();
cfg.members[1].priority=0
cfg.members[1].slaveDelay=3600
rs.reconfig(cfg);
slaveDelay的單位是秒
在192.168.1.1主節(jié)點(diǎn)刪除一個(gè)集合所有數(shù)據(jù),模擬人為失誤。

MongoDB副本集的示例分析
在192.168.1.3查看,發(fā)現(xiàn)數(shù)據(jù)已經(jīng)全部丟失。
MongoDB副本集的示例分析
而在192.168.1.2延遲節(jié)點(diǎn),可以看到因?yàn)檠舆t復(fù)制的緣故,數(shù)據(jù)還在。
MongoDB副本集的示例分析
這個(gè)時(shí)候千萬不要提升延遲節(jié)點(diǎn)的優(yōu)先級。因?yàn)檫@樣他會(huì)立即應(yīng)用原主節(jié)點(diǎn)的所有操作,并成為新的主節(jié)點(diǎn)。這樣誤操作就同步到了延遲節(jié)點(diǎn)。
首先,關(guān)閉副本集中其他的成員,除了延遲節(jié)點(diǎn)。
刪除其他成員數(shù)據(jù)目錄中的所有數(shù)據(jù)。確保每個(gè)其他成員的數(shù)據(jù)目錄都是空的(除了延遲節(jié)點(diǎn))
重啟其他成員,他們會(huì)自動(dòng)從延遲節(jié)點(diǎn)中恢復(fù)數(shù)據(jù)。


9 設(shè)置Secondary-Only節(jié)點(diǎn)
Priority為0的節(jié)點(diǎn)永遠(yuǎn)不能成為主節(jié)點(diǎn),所以設(shè)置Secondary-only節(jié)點(diǎn)只需要將其priority設(shè)置為0.

10 設(shè)置Non-Voting節(jié)點(diǎn)
假設(shè)設(shè)置192.168.1.1不能投票,則使用如下命令
cfg=rs.conf();
cfg.members[0].votes=0;
rs.reconfig(cfg);


11 副本集成員狀態(tài)
副本集成員狀態(tài)指的是rs.status()的stateStr字段
MongoDB副本集的示例分析
STARTUP:剛加入到復(fù)制集中,配置還未加載

STARTUP2:配置已加載完,初始化狀態(tài)

RECOVERING:正在恢復(fù),不適用讀

ARBITER: 仲裁者

DOWN:節(jié)點(diǎn)不可到達(dá)

UNKNOWN:未獲取其他節(jié)點(diǎn)狀態(tài)而不知是什么狀態(tài),一般發(fā)生在只有兩個(gè)成員的架構(gòu),腦裂

REMOVED:移除復(fù)制集

ROLLBACK:數(shù)據(jù)回滾,在回滾結(jié)束時(shí),轉(zhuǎn)移到RECOVERING或SECONDARY狀態(tài)

FATAL:出錯(cuò)。查看日志grep “replSet FATAL”找出錯(cuò)原因,重新做同步

PRIMARY:主節(jié)點(diǎn)

SECONDARY:備份節(jié)點(diǎn)


12 讀寫分離
如果Master節(jié)點(diǎn)讀寫壓力過大,可以考慮讀寫分離的方案。

MongoDB副本集的示例分析




不過需要考慮一種場景,就是主服務(wù)器的寫入壓力非常的大,所以副本節(jié)點(diǎn)復(fù)制的寫入壓力同樣很大。
這時(shí)副本節(jié)點(diǎn)如果讀取壓力也很大的話,根據(jù)MongoDB庫級別讀寫鎖的機(jī)制,
很可能復(fù)制寫入程序拿不到寫鎖,從而導(dǎo)致副本節(jié)點(diǎn)與主節(jié)點(diǎn)有較大延遲。

如果進(jìn)行讀寫分離,首先需要在副本節(jié)點(diǎn)聲明其為slave,
MongoDB副本集的示例分析
然后在JAVA程序中進(jìn)行設(shè)置
MongoDB副本集的示例分析
其中的ReadRreference有幾種設(shè)置,


MongoDB副本集的示例分析
primary:默認(rèn)參數(shù),只從主節(jié)點(diǎn)上進(jìn)行讀取操作;

primaryPreferred:大部分從主節(jié)點(diǎn)上讀取數(shù)據(jù),只有主節(jié)點(diǎn)不可用時(shí)從secondary節(jié)點(diǎn)讀取數(shù)據(jù)。

secondary:只從secondary節(jié)點(diǎn)上進(jìn)行讀取操作,存在的問題是secondary節(jié)點(diǎn)的數(shù)據(jù)會(huì)比primary節(jié)點(diǎn)數(shù)據(jù)“舊”。

secondaryPreferred:優(yōu)先從secondary節(jié)點(diǎn)進(jìn)行讀取操作,secondary節(jié)點(diǎn)不可用時(shí)從主節(jié)點(diǎn)讀取數(shù)據(jù);

nearest:不管是主節(jié)點(diǎn)、secondary節(jié)點(diǎn),從網(wǎng)絡(luò)延遲最低的節(jié)點(diǎn)上讀取數(shù)據(jù)。


以上是“MongoDB副本集的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI