真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

MongoDB復(fù)制集數(shù)據(jù)同步流程

本文轉(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ò)程:

  1. initial sync
  2. replication (oplog sync)

先通過(guò)init sync同步全量數(shù)據(jù),再通過(guò)replication不斷重放Primary上的oplog同步增量數(shù)據(jù)。

initial sync

Secondary啟動(dòng)后,如果滿足以下條件之一,會(huì)先進(jìn)行initial sync

  1. Secondary上oplog為空,比如新加入的空節(jié)點(diǎn)
  2. local.replset.minvalid集合里_initialSyncFlag標(biāo)記被設(shè)置。當(dāng)initial sync開(kāi)始時(shí),同步線程會(huì)設(shè)置該標(biāo)記,當(dāng)initial sync結(jié)束時(shí)清除該標(biāo)記,故如果initial sync過(guò)程中途失敗,節(jié)點(diǎn)重啟后發(fā)現(xiàn)該標(biāo)記被設(shè)置,就知道應(yīng)該重新進(jìn)行initial sync。
  3. BackgroundSync::_initialSyncRequestedFlag被設(shè)置。當(dāng)向節(jié)點(diǎn)發(fā)送resync命令時(shí),該標(biāo)記會(huì)被設(shè)置,此時(shí)會(huì)強(qiáng)制重新initial sync。

initial sync同步流程

  1. minValid集合設(shè)置_initialSyncFlag
  2. 獲取同步源當(dāng)前最新的oplog時(shí)間戳t0
  3. 從同步源Clone所有的集合數(shù)據(jù)
  4. 獲取同步源最新的oplog時(shí)間戳t1
  5. 同步t0~t1所有的oplog
  6. 獲取同步源最新的oplog時(shí)間戳t2
  7. 同步t1~t2所有的oplog
  8. 從同步源讀取index信息,并建立索引
  9. 獲取同步源最新的oplog時(shí)間戳t3
  10. 同步t2~t3所有的oplog
  11. minValid集合清除_initialSyncFlag,initial sync結(jié)束

replication (sync oplog)

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一致即可)。

同步場(chǎng)景分析

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)加入有如下情況:

  1. 該節(jié)點(diǎn)與副本集其他節(jié)點(diǎn)斷開(kāi)連接,一段時(shí)間后恢復(fù)
  2. 該節(jié)點(diǎn)從副本集移除(處于REMOVED)狀態(tài),通過(guò)replSetReconfig命令將其重新加入
  3. 其他? 因同一個(gè)副本集的成員replSetName配置必須相同,除非有誤配置,應(yīng)該不會(huì)有其他場(chǎng)景

此時(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。

參考資料

  1. Replica Set Data Synchronization
  2. Resync a Member of a Replica Set
  3. Create tailable cursor

作者簡(jiǎn)介

張友東,就職于阿里云飛天技術(shù)部,主要關(guān)注分布式存儲(chǔ)、NOSQL等技術(shù)領(lǐng)域,參與 TFS(淘寶分布式文件系統(tǒng))、 AliCloudDB for redis等項(xiàng)目的開(kāi)發(fā)工作,歡迎交流


分享題目:MongoDB復(fù)制集數(shù)據(jù)同步流程
網(wǎng)站路徑:http://weahome.cn/article/googii.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部