云上災(zāi)備和多活架構(gòu)
云數(shù)據(jù)庫MongoDB版推出MongoDB實(shí)例間的同步產(chǎn)品:云上災(zāi)備和多活,助力企業(yè)快速復(fù)制阿里巴巴異地多活架構(gòu)。
云上災(zāi)備功能即將下線,未來計(jì)劃通過數(shù)據(jù)傳輸服務(wù)DTS(Data Transmission Service)來支持災(zāi)備、雙活或多活,滿足多數(shù)據(jù)中心和容災(zāi)等業(yè)務(wù)需求。
架構(gòu)
Oplog(operations log):MongoDB的日志,所有對(duì)數(shù)據(jù)庫的修改都會(huì)保存在Oplog中。
ReplicaA、ReplicaB:ReplicaA、ReplicaB分別是獨(dú)立的MongoDB三節(jié)點(diǎn)副本集實(shí)例。
為保證雙活,ReplicaA、ReplicaB都需要可寫入。由用戶端保證同一數(shù)據(jù)不會(huì)在ReplicaA、ReplicaB同時(shí)寫入。
Oplog同步:通過BLS互相同步Oplog數(shù)據(jù)后,再在目的端重放數(shù)據(jù)。
在MongoDB云上災(zāi)備和多活中,主要有以下三大組件:
BLS Manager:中心控制模塊,負(fù)責(zé)Collector、Receiver的調(diào)度和監(jiān)控等任務(wù)。
BLS Collector:數(shù)據(jù)采集模塊,負(fù)責(zé)從源MongoDB數(shù)據(jù)庫拉取Oplog數(shù)據(jù),然后發(fā)送到Kafka通道。
BLS Receiver:數(shù)據(jù)回放模塊,負(fù)責(zé)從Kafka通道中獲取數(shù)據(jù),然后寫入目的端MongoDB數(shù)據(jù)庫。
下圖是MongoDB云上災(zāi)備和多活內(nèi)部系統(tǒng)的整體架構(gòu)圖,其中Tunnel用kafka實(shí)現(xiàn)。
全量加增量
同步模型采用全量+增量的方式,即在創(chuàng)建實(shí)例時(shí)對(duì)源數(shù)據(jù)庫進(jìn)行全量數(shù)據(jù)同步,后續(xù)的修改通過增量數(shù)據(jù)來同步。
雙活以及多活模型
由于數(shù)據(jù)復(fù)制是異步方式,所以對(duì)于雙活或者多活模式,由用戶端保證不會(huì)對(duì)同一個(gè)唯一鍵同時(shí)進(jìn)行修改。
同時(shí)修改同一個(gè)唯一鍵可能導(dǎo)致數(shù)據(jù)錯(cuò)亂,目前的沖突解決策略為覆蓋(后面修改的數(shù)據(jù)覆蓋前面的數(shù)據(jù))或者忽略。
高效性保證
以下三條策略實(shí)現(xiàn)實(shí)例間數(shù)據(jù)同步的高效性:
從源數(shù)據(jù)庫并行拉取數(shù)據(jù),并解決沖突依賴。
將源數(shù)據(jù)庫數(shù)據(jù)并行發(fā)往Kafka通道。
將數(shù)據(jù)并行寫入目的端數(shù)據(jù)庫,同時(shí)解決依賴問題。
因地域和網(wǎng)絡(luò)類型不同,實(shí)例間的數(shù)據(jù)同步延遲也不同。MongoDB云上災(zāi)備和多活產(chǎn)品理論TPS能夠接近20萬,即每秒傳輸20萬條Oplog。為保證數(shù)據(jù)批量傳輸?shù)母咝裕瑪?shù)據(jù)發(fā)送過程中有緩存機(jī)制,少量數(shù)據(jù)的同步延遲可能超過5秒。
環(huán)形復(fù)制
為防止環(huán)形復(fù)制(數(shù)據(jù)從源復(fù)制到目的,又從目的復(fù)制到源),我們?cè)?span id="z68uejxpaoma" class="help-letter-space">Oplog日志中加入gid來解決環(huán)形復(fù)制問題。
可靠性傳輸
支持?jǐn)帱c(diǎn)續(xù)傳,實(shí)例重啟時(shí)數(shù)據(jù)同步不受影響。
高可用
鏈路同步具有高可用性,如果同步進(jìn)程出錯(cuò),備用進(jìn)程啟動(dòng)接管服務(wù)。
限制說明
目前僅副本集實(shí)例支持云上災(zāi)備功能,單節(jié)點(diǎn)實(shí)例和分片集群實(shí)例暫不支持。
源實(shí)例數(shù)據(jù)庫版本須是3.2版本或3.4版本,暫不支持4.0版本。
源實(shí)例存儲(chǔ)引擎必須是WiredTiger。
暫不支持在兩個(gè)已有MongoDB實(shí)例之間直接搭通道同步數(shù)據(jù)。
數(shù)據(jù)同步時(shí),源實(shí)例會(huì)重啟一次,重啟過程中將gid加入Oplog中。如果源實(shí)例過大,重啟時(shí)間將會(huì)達(dá)到分鐘級(jí)。
實(shí)例同步后,不支持DDL同步。如果在源實(shí)例上進(jìn)行了DDL操作,目的實(shí)例將無法同步源實(shí)例的DDL操作。
當(dāng)前只支持雙活功能,即兩個(gè)MongoDB實(shí)例之間同步數(shù)據(jù)。
支持云上災(zāi)備產(chǎn)品的區(qū)域
以下區(qū)域中的實(shí)例支持實(shí)例間的數(shù)據(jù)同步,可以跨越城市或者國家,例如上海和新加坡。
中國內(nèi)地
地域名稱
所在城市
Region ID
華北 1
青島
cn-qingdao
華北 2
北京
cn-beijing
華東 1
杭州
cn-hangzhou
華東 2
上海
cn-shanghai
華南 1
深圳
cn-shenzhen
其他國家和地區(qū)
地域名稱
所在城市
Region ID
中國(香港)
中國香港
cn-hongkong
美國西部
硅谷
us-west-1
美國東部
弗吉尼亞
us-east-1