本文轉(zhuǎn)自張友東的文章,文章鏈接: http://www.mongoing.com/archives/2369
創(chuàng)新互聯(lián)網(wǎng)站建設(shè)提供從項(xiàng)目策劃、軟件開(kāi)發(fā),軟件安全維護(hù)、網(wǎng)站優(yōu)化(SEO)、網(wǎng)站分析、效果評(píng)估等整套的建站服務(wù),主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,成都app軟件開(kāi)發(fā)以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。創(chuàng)新互聯(lián)深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
正好解釋了我的問(wèn)題,所以轉(zhuǎn)發(fā)記錄下
MongoDB復(fù)制集里的Secondary會(huì)從Primary上同步數(shù)據(jù),以保持副本集所有節(jié)點(diǎn)的數(shù)據(jù)保持一致,數(shù)據(jù)同步主要包含2個(gè)過(guò)程:
先通過(guò)init sync同步全量數(shù)據(jù),再通過(guò)replication不斷重放Primary上的oplog同步增量數(shù)據(jù)。
Secondary啟動(dòng)后,如果滿足以下條件之一,會(huì)先進(jìn)行initial sync
initial sync結(jié)束后,Secondary會(huì)建立到Primary上local.oplog.rs的tailable cursor,不斷從Primary上獲取新寫入的oplog,并應(yīng)用到自身。
Tailable cursor每次會(huì)獲取到一批oplog,Secondary采用多線程重放oplog以提高效率,通過(guò)將oplog按照所屬的namespace進(jìn)行分組,劃分到多個(gè)線程里,保證同一個(gè)namespace的所有操作都由一個(gè)線程來(lái)replay,以保證統(tǒng)一namespace的操作時(shí)序跟primary上保持一致(如果引擎支持文檔鎖,只需保證同一個(gè)文檔的操作時(shí)序與primary一致即可)。
1. 副本集初始化
初始化選出Primary后,此時(shí)Secondary上無(wú)有效數(shù)據(jù),oplog是空的,會(huì)先進(jìn)行initial sync,然后不斷的應(yīng)用新的oplog
2. 新成員加入
因新成員上無(wú)有效數(shù)據(jù),oplog是空的,會(huì)先進(jìn)行initial sync,然后不斷的應(yīng)用新的oplog
3. 有數(shù)據(jù)的節(jié)點(diǎn)加入
有數(shù)據(jù)的節(jié)點(diǎn)加入有如下情況:
此時(shí),如果該節(jié)點(diǎn)最新的oplog時(shí)間戳,比所有節(jié)點(diǎn)最舊的oplog時(shí)間戳還要小,該節(jié)點(diǎn)將找不到同步源,會(huì)一直處于RECOVERING而不能服務(wù);反之,如果能找到同步源,則直接進(jìn)入replication階段,不斷的應(yīng)用新的oplog。
因oplog太舊而處于RECOVERING的節(jié)點(diǎn)目前無(wú)法自動(dòng)恢復(fù),需人工介入處理(故設(shè)置合理的oplog大小非常重要),最簡(jiǎn)單的方式是發(fā)送resync命令,讓該節(jié)點(diǎn)重新進(jìn)行initial sync。
張友東,就職于阿里云飛天技術(shù)部,主要關(guān)注分布式存儲(chǔ)、NOSQL等技術(shù)領(lǐng)域,參與 TFS(淘寶分布式文件系統(tǒng))、 AliCloudDB for redis等項(xiàng)目的開(kāi)發(fā)工作,歡迎交流