MongoDB中的副本集是一組維護(hù)相同數(shù)據(jù)集合的
mongod
進(jìn)程。副本集提供了冗余和高可用性,并且這是所有生產(chǎn)部署的基礎(chǔ)。本節(jié)介紹MongoDB中的復(fù)制以及副本集的組件和體系結(jié)構(gòu),并提供副本集常見(jiàn)任務(wù)的教程。
復(fù)制提供了冗余并增加了數(shù)據(jù)可用性。對(duì)于不同數(shù)據(jù)庫(kù)服務(wù)器上的多個(gè)數(shù)據(jù)副本,復(fù)制為防止單臺(tái)數(shù)據(jù)庫(kù)服務(wù)器故障提供了一定程度的容錯(cuò)能力。
在某些情況下,復(fù)制可以提高讀取性能,因?yàn)榭蛻?hù)端可以將讀操作發(fā)送到不同的服務(wù)器上。在不同的數(shù)據(jù)中心維護(hù)數(shù)據(jù)副本可以提高分布式應(yīng)用程序的數(shù)據(jù)本地化和可用性。您還可以維護(hù)額外的副本以實(shí)現(xiàn)特殊用途,比如災(zāi)難恢復(fù)、報(bào)告或備份。
mongod
實(shí)例。副本集包含多個(gè)數(shù)據(jù)承載節(jié)點(diǎn)和一個(gè)可選的仲裁節(jié)點(diǎn)。在數(shù)據(jù)承載節(jié)點(diǎn)中,有且僅有一個(gè)成員為主節(jié)點(diǎn),其他節(jié)點(diǎn)為副本節(jié)點(diǎn)。
主節(jié)點(diǎn) 接收所有的寫(xiě)操作。一個(gè)副本集僅有一個(gè)主節(jié)點(diǎn)能夠用
{ w: "majority" }
寫(xiě)關(guān)注點(diǎn)級(jí)別來(lái)確認(rèn)寫(xiě)操作;雖然在某些情況下,另一個(gè)mongod的實(shí)例也可以暫時(shí)認(rèn)為自己是主節(jié)點(diǎn)。[1] 主節(jié)點(diǎn)會(huì)將其數(shù)據(jù)集合所有的變化記錄到操作日志中,即oplog。有關(guān)主節(jié)點(diǎn)操作的更多信息,請(qǐng)參見(jiàn) 副本集主節(jié)點(diǎn)。
副本節(jié)點(diǎn)復(fù)制主節(jié)點(diǎn)的oplog,并將這些操作應(yīng)用于它們的數(shù)據(jù)集,這樣以便副本節(jié)點(diǎn)的數(shù)據(jù)集能反映出主節(jié)點(diǎn)的數(shù)據(jù)集。如果主節(jié)點(diǎn)不可用,一個(gè)候選的副本節(jié)點(diǎn)將會(huì)發(fā)起選舉并使之成為新的主節(jié)點(diǎn)。有關(guān)副本成員的更多信息,請(qǐng)參見(jiàn)副本集副本成員。
在某些情況下(比如您有一個(gè)主節(jié)點(diǎn)和一個(gè)副本節(jié)點(diǎn),但由于成本約束無(wú)法添加另一個(gè)副本節(jié)點(diǎn)),您可以選擇將一個(gè)
mongod
實(shí)例作為仲裁節(jié)點(diǎn)添加到一個(gè)副本集中。仲裁節(jié)點(diǎn)參與選舉但不持有數(shù)據(jù)(即不提供數(shù)據(jù)冗余)。有關(guān)仲裁節(jié)點(diǎn)的更多信息,請(qǐng)參見(jiàn)副本集仲裁節(jié)點(diǎn)。
仲裁節(jié)點(diǎn)永遠(yuǎn)只能是仲裁節(jié)點(diǎn),但在選舉過(guò)程中主節(jié)點(diǎn)也許會(huì)降級(jí)成為副本節(jié)點(diǎn), 副本節(jié)點(diǎn)也可能會(huì)升級(jí)成為主節(jié)點(diǎn)。
有關(guān)復(fù)制機(jī)制的更多信息,請(qǐng)參見(jiàn)副本集Oplog和副本集數(shù)據(jù)同步。
慢操作從4.2版本開(kāi)始(從4.0.6開(kāi)始也是可行的),副本集的副本成員會(huì)記錄oplog中應(yīng)用時(shí)間超過(guò)慢操作閾值的慢操作條目。這些慢oplog信息被記錄在副本節(jié)點(diǎn)的診斷日志中,其路徑位于
REPL
組件的文本
applied op: took ms
中。這些慢日志條目?jī)H僅依賴(lài)于慢操作閾值。它們不依賴(lài)于日志級(jí)別(無(wú)論是系統(tǒng)還是組件級(jí)別)、過(guò)濾級(jí)別,或者慢操作采樣比例。過(guò)濾器不會(huì)捕獲慢日志條目。
復(fù)制延遲 指的是將主節(jié)點(diǎn)的寫(xiě)操作拷貝(即復(fù)制)到副本節(jié)點(diǎn)所花費(fèi)的時(shí)間。一些小的延遲期可能是可以接受的,但是隨著復(fù)制延遲的增長(zhǎng),會(huì)出現(xiàn)嚴(yán)重的問(wèn)題,包括引起主節(jié)點(diǎn)的緩存壓力。
從MongoDB 4.2開(kāi)始,管理員可以限制主節(jié)點(diǎn)應(yīng)用寫(xiě)操作的速度,目的是將
majority committed
延遲保持在可配置參數(shù)
flowControlTargetLagSeconds
的大值之下。
默認(rèn)情況下,流控制是啟用的。
注意:
為了進(jìn)行流控制,復(fù)制集/分片集群必須滿(mǎn)足:參數(shù)featureCompatibilityVersion (FCV) 設(shè)置為
4.2
并啟用majority讀關(guān)注點(diǎn)。也就是說(shuō),如果FCV不是
4.2
,或者讀關(guān)注點(diǎn)majority被禁用,那么啟用流控制將不起作用。
啟用流控制后,當(dāng)延遲快接近
flowControlTargetLagSeconds
參數(shù)指定的秒數(shù)時(shí),主節(jié)點(diǎn)上的寫(xiě)操作必須首先獲得許可單(tickets)才可以獲取寫(xiě)鎖。通過(guò)限制每秒發(fā)出的許可單的數(shù)量,流控制機(jī)制可以將延遲保持在目標(biāo)數(shù)值之下。
為獲取更多信息,請(qǐng)參見(jiàn)檢查復(fù)制延遲和流控制。
electionTimeoutMillis
配置的期限時(shí)(默認(rèn)10s),一個(gè)候選的副本節(jié)點(diǎn)會(huì)發(fā)起選舉來(lái)推薦自己成為新主節(jié)點(diǎn)。集群會(huì)嘗試完成一次新主節(jié)點(diǎn)的選舉并恢復(fù)正常的操作。
副本集在選舉成功前是無(wú)法處理寫(xiě)操作的。如果讀請(qǐng)求被配置運(yùn)行在副本節(jié)點(diǎn)上,則當(dāng)主節(jié)點(diǎn)下線(xiàn)時(shí),副本集可以繼續(xù)處理這些請(qǐng)求。
假設(shè)采用默認(rèn)的副本配置選項(xiàng),集群選擇新主節(jié)點(diǎn)的中間過(guò)渡時(shí)間通常不應(yīng)超過(guò)12秒。這包括了將主節(jié)點(diǎn)標(biāo)記為unavailable、發(fā)起以及完成一次選舉的時(shí)間。您可以通過(guò)修改
settings.electionTimeoutMillis
復(fù)制配置選項(xiàng)來(lái)調(diào)整這個(gè)時(shí)間期限。網(wǎng)絡(luò)延遲等因素可能會(huì)延長(zhǎng)完成副本集選舉所需的時(shí)間,從而影響您的集群在沒(méi)有主節(jié)點(diǎn)的情況下運(yùn)行的時(shí)間。這些因素取決于您實(shí)際的集群架構(gòu)情況。
將
electionTimeoutMillis
復(fù)制配置選項(xiàng)從默認(rèn)的
10000
(10秒)降低可以更快地檢測(cè)主節(jié)點(diǎn)故障。然而,由于諸如臨時(shí)性的網(wǎng)絡(luò)延遲等因素,集群可能會(huì)更頻繁地發(fā)起選舉,即使主節(jié)點(diǎn)在其他方面是健康的。這也許會(huì)增加w : 1 級(jí)別寫(xiě)操作發(fā)生回滾的可能性。
您的應(yīng)用程序連接邏輯應(yīng)該包括對(duì)自動(dòng)故障轉(zhuǎn)移和后續(xù)選舉的容錯(cuò)處理能力。從MongoDB 3.6開(kāi)始,MongoDB驅(qū)動(dòng)程序可以探測(cè)到主節(jié)點(diǎn)的丟失,并自動(dòng)重試某些寫(xiě)操作 一次,提供額外的自動(dòng)故障轉(zhuǎn)移和選舉的內(nèi)置處理:
retryWrites=true
來(lái)顯式地啟用可重試寫(xiě)。請(qǐng)參見(jiàn) 副本集選舉來(lái)獲取副本集選舉的完整信息。
為了解更多關(guān)于MongoDB失敗處理的信息,請(qǐng)參見(jiàn):
默認(rèn)情況下,客戶(hù)端從主節(jié)點(diǎn)讀取[1];然而,客戶(hù)端可以定義一個(gè)讀偏好 將讀操作發(fā)送給副本節(jié)點(diǎn)。
異步復(fù)制至副本節(jié)點(diǎn),意味著從副本節(jié)點(diǎn)讀取返回的數(shù)據(jù)不能反映主節(jié)點(diǎn)上數(shù)據(jù)的狀態(tài)。
包含讀操作的多文檔事務(wù)必須使用讀偏好
primary
。在給定的事務(wù)中所有操作都必須路由至相同的成員節(jié)點(diǎn)。
為了解更多關(guān)于副本集讀的信息,請(qǐng)參見(jiàn)讀偏好。
數(shù)據(jù)可見(jiàn)性根據(jù)讀關(guān)注點(diǎn),客戶(hù)端可以在寫(xiě)持久化前看到寫(xiě)結(jié)果:
"local"
或
"available"
的客戶(hù)端,可以在發(fā)起寫(xiě)操作的客戶(hù)端確認(rèn)其寫(xiě)成功之前查看該客戶(hù)端寫(xiě)的結(jié)果。"local"
或
"available"
的客戶(hù)端,能讀取在副本集故障轉(zhuǎn)移期間可能隨后被回滾掉的數(shù)據(jù)。對(duì)于多文檔事務(wù)中的操作,當(dāng)事務(wù)提交時(shí),在事務(wù)中所做的所有數(shù)據(jù)更改都會(huì)被保存并在事務(wù)外部可見(jiàn)。也就是說(shuō),事務(wù)在回滾其他更改時(shí)不會(huì)提交某些更改。
在事務(wù)提交之前,事務(wù)中所做的數(shù)據(jù)更改在事務(wù)外部是不可見(jiàn)的。
然而,當(dāng)一個(gè)事務(wù)寫(xiě)入多個(gè)分片時(shí),并不是所有外部的讀操作都需要等待提交的事務(wù)的結(jié)果在分片中可見(jiàn)。例如,如果提交了一個(gè)事務(wù),并且在分片a上可以看到寫(xiě)1,但是在分片B上還不能看到寫(xiě)2,那么外部讀關(guān)注點(diǎn)為
"local"
的讀可以在不看到寫(xiě)2的情況下讀取寫(xiě)1的結(jié)果。
更多請(qǐng)參見(jiàn)Read Isolation, Consistency, and Recency。
從MongoDB 4.0開(kāi)始,副本集支持多文檔事務(wù)。
包含讀操作的多文檔事務(wù)必須使用讀偏好
primary
。給定事務(wù)中所有的操作都必須路由至相同的成員節(jié)點(diǎn)。
在事務(wù)提交之前,事務(wù)中所做的數(shù)據(jù)更改在事務(wù)外部是不可見(jiàn)的。
然而,當(dāng)一個(gè)事務(wù)寫(xiě)入多個(gè)分片時(shí),并不是所有外部的讀操作都需要等待提交的事務(wù)的結(jié)果在分片中可見(jiàn)。例如,如果提交了一個(gè)事務(wù),并且在分片a上可以看到寫(xiě)1,但是在分片B上還不能看到寫(xiě)2,那么外部讀關(guān)注點(diǎn)為
"local"
的讀可以在不看到寫(xiě)2的情況下讀取寫(xiě)1的結(jié)果。
從MongoDB 3.6開(kāi)始,副本集和分片集群支持變更流。變更流允許應(yīng)用程序訪(fǎng)問(wèn)實(shí)時(shí)數(shù)據(jù)更改,而不需要跟蹤oplog的復(fù)雜性和風(fēng)險(xiǎn)。應(yīng)用程序可以使用變更流來(lái)訂閱一個(gè)或多個(gè)集合上的所有數(shù)據(jù)更改。
副本集提供了許多選項(xiàng)來(lái)支持應(yīng)用程序的需求。例如,你可以使用多數(shù)據(jù)中心中的成員來(lái)部署一個(gè)副本集,或者通過(guò)調(diào)整一些成員的
members[n].priority
來(lái)控制選舉結(jié)果。副本集還支持用于報(bào)告、災(zāi)難恢復(fù)或備份功能的專(zhuān)用成員。
更多有關(guān)信息請(qǐng)參見(jiàn)優(yōu)先級(jí)0的副本集成員,隱藏副本集成員和延遲副本集成員 。
注意:
(1, 2) 在 某些場(chǎng)景下, 一個(gè)復(fù)制集中的兩個(gè)節(jié)點(diǎn)可能會(huì)認(rèn)為它們是主節(jié)點(diǎn),但最多,他們中的一個(gè)將能夠完成寫(xiě)關(guān)注點(diǎn)為{ w: “majority” }寫(xiě)操作。可以完成 { w: “majority” } 寫(xiě)的節(jié)點(diǎn)是當(dāng)前主節(jié)點(diǎn),而另一個(gè)節(jié)點(diǎn)是原先的主節(jié)點(diǎn),通常是由于網(wǎng)絡(luò)分區(qū)導(dǎo)致它還沒(méi)有意識(shí)到自己的降級(jí)。當(dāng)這種情況發(fā)生時(shí),連接到原先主節(jié)點(diǎn)的客戶(hù)端盡管已經(jīng)請(qǐng)求了讀偏好primary,但可能還會(huì)觀察到過(guò)時(shí)的數(shù)據(jù),并且對(duì)原先主節(jié)點(diǎn)新寫(xiě)的操作最終將回滾掉。
MongoDB中文社區(qū)翻譯小組成員
目前在傳統(tǒng)金融行業(yè)從事DBA職務(wù),5年+工作經(jīng)驗(yàn),主要負(fù)責(zé)公司oracle/mongodb/es/redis各類(lèi)數(shù)據(jù)庫(kù)及數(shù)據(jù)中心監(jiān)控平臺(tái)運(yùn)維工作,oracle ocp,MongoDB認(rèn)證專(zhuān)家,RHCE,現(xiàn)階段對(duì)開(kāi)源分布式數(shù)據(jù)庫(kù)、云計(jì)算等領(lǐng)域有很大興趣;平時(shí)喜歡打羽毛球、看電影等。
原文鏈接:
https://docs.mongodb.com/manual/replication/