小編給大家分享一下MongoDB副本集的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
在谷城等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需策劃設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站建設(shè),谷城網(wǎng)站建設(shè)費(fèi)用合理。
實(shí)驗(yàn)環(huán)境使用的Mongodb版本為mongodb-linux-x86_64-2.6.0
由三臺(tái)虛擬機(jī)搭建,配置為單核,1G內(nèi)存。
實(shí)驗(yàn)環(huán)境如下:
MongoDB的副本集不同于以往的主從模式。
在集群Master故障的時(shí)候,副本集可以自動(dòng)投票,選舉出新的Master,并引導(dǎo)其余的Slave服務(wù)器連接新的Master,
而這個(gè)過程對(duì)于應(yīng)用是透明的??梢哉fMongoDB的副本集是自帶故障轉(zhuǎn)移功能的主從復(fù)制。
1 相對(duì)于傳統(tǒng)主從模式的優(yōu)勢(shì)
傳統(tǒng)的主從模式,需要手工指定集群中的Master。
如果Master發(fā)生故障,一般都是人工介入,指定新的Master。
這個(gè)過程對(duì)于應(yīng)用一般不是透明的,往往伴隨著應(yīng)用重新修改配置文件,重啟應(yīng)用服務(wù)器等。
而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è)過程對(duì)于應(yīng)用是透明的。
2 Bully選舉算法 4 更改節(jié)點(diǎn)優(yōu)先級(jí)
Bully算法是一種協(xié)調(diào)者(主節(jié)點(diǎn))競(jìng)選算法,主要思想是集群的每個(gè)成員都可以聲明它是主節(jié)點(diǎn)并通知其他節(jié)點(diǎn)。
別的節(jié)點(diǎn)可以選擇接受這個(gè)聲稱或是拒絕并進(jìn)入主節(jié)點(diǎn)競(jìng)爭(zhēng)。被其他所有節(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)行對(duì)比數(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)先級(jí)等
選舉還有個(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
然后在任意一臺(tái)虛擬機(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)生效
可以使用rs.status()查看集群狀態(tài),或者rs.isMaster()
修改節(jié)點(diǎn)的優(yōu)先級(jí)可以觸發(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)先級(jí)需要登錄Master節(jié)點(diǎn)運(yùn)行。否則報(bào)錯(cuò)。
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)不能用于讀寫分離的場(chǎng)景。
將192.168.1.3設(shè)置為隱藏節(jié)點(diǎn)。
注意,只有優(yōu)先級(jí)為0的成員才能設(shè)置為隱藏節(jié)點(diǎn)。
如果設(shè)置優(yōu)先級(jí)不為0的節(jié)點(diǎn)為隱藏節(jié)點(diǎn),則報(bào)錯(cuò)如下
使用如下命令設(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)不可見
并且rs.conf()顯示該節(jié)點(diǎn)狀態(tài)為hidden
7 設(shè)置仲裁節(jié)點(diǎn)
仲裁節(jié)點(diǎn)不存儲(chǔ)數(shù)據(jù),只是用于投票。所以仲裁節(jié)點(diǎn)對(duì)于服務(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è)場(chǎng)景下,可以使用延遲節(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)先級(jí)為最高級(jí),使他成為新的Master服務(wù)器。
延遲節(jié)點(diǎn)的優(yōu)先級(jí)必須為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ù),模擬人為失誤。
在192.168.1.3查看,發(fā)現(xiàn)數(shù)據(jù)已經(jīng)全部丟失。
而在192.168.1.2延遲節(jié)點(diǎn),可以看到因?yàn)檠舆t復(fù)制的緣故,數(shù)據(jù)還在。
這個(gè)時(shí)候千萬不要提升延遲節(jié)點(diǎn)的優(yōu)先級(jí)。因?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字段
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)讀寫壓力過大,可以考慮讀寫分離的方案。
不過需要考慮一種場(chǎng)景,就是主服務(wù)器的寫入壓力非常的大,所以副本節(jié)點(diǎn)復(fù)制的寫入壓力同樣很大。
這時(shí)副本節(jié)點(diǎn)如果讀取壓力也很大的話,根據(jù)MongoDB庫級(jí)別讀寫鎖的機(jī)制,
很可能復(fù)制寫入程序拿不到寫鎖,從而導(dǎo)致副本節(jié)點(diǎn)與主節(jié)點(diǎn)有較大延遲。
如果進(jìn)行讀寫分離,首先需要在副本節(jié)點(diǎn)聲明其為slave,
然后在JAVA程序中進(jìn)行設(shè)置
其中的ReadRreference有幾種設(shè)置,
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)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!