monogdb復(fù)制原理詳解

一、復(fù)制介紹

復(fù)制是在多臺(tái)服務(wù)器之間同步數(shù)據(jù)的過(guò)程。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了定襄免費(fèi)建站歡迎大家使用!

 

復(fù)制在為數(shù)據(jù)提供了冗余同時(shí),也提高了數(shù)據(jù)的可用性。由于在不同的數(shù)據(jù)庫(kù)服務(wù)器上擁有多個(gè)數(shù)據(jù)鏡像,復(fù)制可以有效的防止由于單臺(tái)服務(wù)器故障而導(dǎo)致的數(shù)據(jù)丟失。復(fù)制還能夠幫助我們從硬件故障或是服務(wù)中斷中恢復(fù)數(shù)據(jù)。我們也可以通過(guò)增加復(fù)制節(jié)點(diǎn)來(lái)將其用于災(zāi)難恢復(fù)、報(bào)表或是備份。

在某些情況中,我們可以通過(guò)復(fù)制的方式來(lái)提高讀的性能??蛻舳丝梢詫⒆x與寫(xiě)請(qǐng)求分別發(fā)送到不同的服務(wù)器上。我們還能夠通過(guò)在其他數(shù)據(jù)中心建立分布式復(fù)制節(jié)點(diǎn)的方式來(lái)做異地冗災(zāi),以進(jìn)一步提高可用性。

 

MongoDB中的復(fù)制

復(fù)制集是由一組擁有相同數(shù)據(jù)集的 mongod 實(shí)例組成的。其中的一個(gè)節(jié)點(diǎn)為主節(jié)點(diǎn)(Primary),所有的寫(xiě)請(qǐng)求都是在它上面完成的。而其他的節(jié)點(diǎn)都是從節(jié)點(diǎn)(secondary),從節(jié)點(diǎn)接收從主節(jié)點(diǎn)上傳來(lái)的操作并應(yīng)用,并以此來(lái)保證其與主節(jié)點(diǎn)的數(shù)據(jù)集一致。

 

主節(jié)點(diǎn)接收所有來(lái)自客戶端的寫(xiě)操作。一個(gè)復(fù)制集只能有一個(gè)主節(jié)點(diǎn)。由于在一個(gè)復(fù)制集中只有一個(gè)成員能夠接收寫(xiě)操作,復(fù)制集為所有來(lái)自主節(jié)點(diǎn)的讀提供了 嚴(yán)格的一致性校驗(yàn)。主節(jié)點(diǎn)通過(guò)將所有數(shù)據(jù)集的變動(dòng)記錄到 oplog 中以支持復(fù)制的實(shí)現(xiàn)。

monogdb復(fù)制原理詳解

 

從節(jié)點(diǎn)將主節(jié)點(diǎn)上的oplog復(fù)制過(guò)來(lái)并應(yīng)用這些操作來(lái)修改其自己的數(shù)據(jù)集以確保從節(jié)點(diǎn)的數(shù)據(jù)集與主節(jié)點(diǎn)的數(shù)據(jù)集一致。一旦主節(jié)點(diǎn)不可用了,復(fù)制集就會(huì)將一個(gè)從節(jié)點(diǎn)選舉成為新的主節(jié)點(diǎn)。客戶端默認(rèn)是從主節(jié)點(diǎn)進(jìn)行讀操作,但是客戶端也可以通過(guò)指定 復(fù)制集讀選項(xiàng) 來(lái)將讀操作發(fā)送給從節(jié)點(diǎn)。需要注意的是,在從節(jié)點(diǎn)上進(jìn)行讀操作時(shí),所獲得的數(shù)據(jù)可能不是此時(shí)主節(jié)點(diǎn)上的值

monogdb復(fù)制原理詳解

 

我們也可以為復(fù)制集新增一個(gè)額外的 mongod 實(shí)例作為 投票節(jié)點(diǎn)。投票節(jié)點(diǎn)中并不包含數(shù)據(jù)集,投票節(jié)點(diǎn)的作用僅僅是在選舉過(guò)程中參與投票。當(dāng)復(fù)制集的成員個(gè)數(shù)為偶數(shù)時(shí),添加一個(gè)投票節(jié)點(diǎn)可以防止平局的出現(xiàn),通過(guò)多數(shù)選票來(lái)選舉出新的主節(jié)點(diǎn)。由于投票節(jié)點(diǎn)僅提供投票功能,故無(wú)需一個(gè)專用的物理機(jī)。

monogdb復(fù)制原理詳解

 

投票節(jié)點(diǎn)將只做投票使用。當(dāng) 主節(jié)點(diǎn)降職變?yōu)?從節(jié)點(diǎn)的時(shí)候,其他的一個(gè) 從節(jié)點(diǎn)將在選舉中被推選為主節(jié)點(diǎn)。

 

異步復(fù)制

從節(jié)點(diǎn)從主節(jié)點(diǎn)上應(yīng)用操作的過(guò)程是異步的。由于從節(jié)點(diǎn)是在主節(jié)點(diǎn)之后應(yīng)用操作的,所以復(fù)制集在缺少某些成員的時(shí)候仍能繼續(xù)運(yùn)行。然而在這種情況下,從節(jié)點(diǎn)返回給客戶端的數(shù)據(jù)可能并不是最新的數(shù)據(jù)。

 

自動(dòng)化故障切換

當(dāng)主節(jié)點(diǎn)無(wú)法與復(fù)制集中其他成員進(jìn)行溝通超過(guò)10秒時(shí),復(fù)制集將嘗試推舉另一位成員成為新的主節(jié)點(diǎn)。這時(shí),第一個(gè)獲得多數(shù)投票的從節(jié)點(diǎn)將升職為主節(jié)點(diǎn)。

monogdb復(fù)制原理詳解

 

其他特征

復(fù)制集提供了一些選項(xiàng)來(lái)支持實(shí)際應(yīng)用時(shí)的需求。例如,將一個(gè)復(fù)制集分布在多個(gè)數(shù)據(jù)中心 ,又或是通過(guò)設(shè)置 priority 來(lái)控制選舉的結(jié)果。復(fù)制集同時(shí)也支持將成員用于報(bào)表、災(zāi)難恢復(fù)或是備份。

 

二、復(fù)制概念介紹

復(fù)制集成員

MongoDB的 復(fù)制集 是由一組 mongod 實(shí)例所組成的,并提供了數(shù)據(jù)冗余與高可用性。復(fù)制集中的成員有以下幾種:

  • Primary.

  • 主節(jié)點(diǎn) 接收所有的寫(xiě)操作請(qǐng)求。

  • Secondaries.

  • 從節(jié)點(diǎn)通過(guò)應(yīng)用主節(jié)點(diǎn)傳來(lái)的數(shù)據(jù)變動(dòng)操作來(lái)保持其數(shù)據(jù)集與主節(jié)點(diǎn)的一致。從節(jié)點(diǎn)也可以通過(guò)增加額外的參數(shù)配置來(lái)對(duì)應(yīng)特殊的需求。例如,從節(jié)點(diǎn)可以是 non-voting 或是 priority 0 。

我們也可以為復(fù)制集設(shè)置一個(gè) 投票節(jié)點(diǎn) 。投票節(jié)點(diǎn)其本身并不包含數(shù)據(jù)集。但是,一旦當(dāng)前的主節(jié)點(diǎn)不可用時(shí),投票節(jié)點(diǎn)就會(huì)參與到新的主節(jié)點(diǎn)選舉的投票中。

一個(gè)復(fù)制集最多可以擁有12個(gè)成員。 [1] 但是同時(shí)最多只有其中的7個(gè)可以進(jìn)行投票。

一個(gè)復(fù)制集至少需要這幾個(gè)成員:一個(gè) 主節(jié)點(diǎn) ,一個(gè) 從節(jié)點(diǎn) ,和一個(gè) 投票節(jié)點(diǎn) 。但是在大多數(shù)情況下,我們會(huì)保持3個(gè)擁有數(shù)據(jù)集的節(jié)點(diǎn):一個(gè) 主節(jié)點(diǎn) 和兩個(gè) 從節(jié)點(diǎn)

 

復(fù)制集主節(jié)點(diǎn)

在復(fù)制集中,主節(jié)點(diǎn)是唯一能夠接收寫(xiě)請(qǐng)求的節(jié)點(diǎn)。MongoDB在 主節(jié)點(diǎn) 上進(jìn)行寫(xiě)操作,并會(huì)將這些操作記錄到主節(jié)點(diǎn)的 oplog 中。 從節(jié)點(diǎn) 會(huì)將oplog復(fù)制到其本機(jī)并將這些操作應(yīng)用到其自己的數(shù)據(jù)集上。

在擁有下述三個(gè)成員的復(fù)制集中,主節(jié)點(diǎn)將接收所有的寫(xiě)請(qǐng)求,而從節(jié)點(diǎn)會(huì)將oplog復(fù)制到本機(jī)并在其自己的數(shù)據(jù)集上應(yīng)用這些操作。

 

復(fù)制集中任何成員都可以接收讀請(qǐng)求。但是默認(rèn)情況下,應(yīng)用程序會(huì)直接連接到在主節(jié)點(diǎn)上進(jìn)行讀操作。

 

復(fù)制集最多只能擁有一個(gè)主節(jié)點(diǎn)。一旦當(dāng)前的主節(jié)點(diǎn)不可用了,復(fù)制集就會(huì)選舉出新的主節(jié)點(diǎn)。

 

在擁有下述三個(gè)成員的復(fù)制集中,一旦當(dāng)前主節(jié)點(diǎn)不可用了,就會(huì)觸發(fā)選舉機(jī)制,并將在剩下的從節(jié)點(diǎn)中選舉出一個(gè)新的主節(jié)點(diǎn)。

 

復(fù)制集從節(jié)點(diǎn)

從節(jié)點(diǎn)的數(shù)據(jù)集與 主節(jié)點(diǎn) 中的一致。從節(jié)點(diǎn)將主節(jié)點(diǎn)上的 oplog 復(fù)制到本機(jī),并異步的將這些操作記錄應(yīng)用在其自己的數(shù)據(jù)集上。每個(gè)復(fù)制集可以擁有多個(gè)從節(jié)點(diǎn)。

下述由三個(gè)成員組成的復(fù)制集擁有兩個(gè)從節(jié)點(diǎn)。這些從節(jié)點(diǎn)將主節(jié)點(diǎn)上的oplog復(fù)制過(guò)來(lái)并應(yīng)用在其自己的數(shù)據(jù)集上。

 

客戶端雖然無(wú)法在從節(jié)點(diǎn)上進(jìn)行寫(xiě)操作,但卻可以進(jìn)行讀操作。

從節(jié)點(diǎn)是可以升職為主節(jié)點(diǎn)的。一旦現(xiàn)有的主節(jié)點(diǎn)不可用了,那么復(fù)制集將會(huì)發(fā)起 election 來(lái)選擇將哪個(gè)從節(jié)點(diǎn)提升為新的主節(jié)點(diǎn)。

在擁有下述三個(gè)成員的復(fù)制集中,一旦當(dāng)前主節(jié)點(diǎn)不可用了,就會(huì)觸發(fā)選舉機(jī)制,并將在剩下的從節(jié)點(diǎn)中選舉出一個(gè)新的主節(jié)點(diǎn)。

 

我們可以通過(guò)修改參數(shù)的方式來(lái)將從節(jié)點(diǎn)用于特殊的需求。例如:

  • 我們可以通過(guò)禁止從節(jié)點(diǎn)升職為主節(jié)點(diǎn)的方式來(lái)將該節(jié)點(diǎn)永駐為從節(jié)點(diǎn)或是用于冷備。

  • 我們可以通過(guò)禁止應(yīng)用在該從節(jié)點(diǎn)上進(jìn)行讀操作的方式,來(lái)讓一些需要進(jìn)行流量隔離的應(yīng)用在其上進(jìn)行讀。

  • 我們可以通過(guò)設(shè)置 “延時(shí)備份節(jié)點(diǎn)” 的方式來(lái)防止諸如誤刪除等的誤操作或是錯(cuò)誤。

 

優(yōu)先級(jí)為0的復(fù)制集成員

一旦將優(yōu)先級(jí)設(shè)置為0,那么該從節(jié)點(diǎn)將 不能升職為 主節(jié)點(diǎn) 。 優(yōu)先級(jí)為0 的成員不會(huì) 觸發(fā) 選舉 。除此之外該節(jié)點(diǎn)與其他從節(jié)點(diǎn)沒(méi)有區(qū)別,優(yōu)先級(jí)為0 的從節(jié)點(diǎn)擁有與主節(jié)點(diǎn)一致的數(shù)據(jù)集,能接受讀請(qǐng)求,同時(shí)也能參與投票。通過(guò)將從節(jié)點(diǎn)的 優(yōu)先級(jí)設(shè)置為0 來(lái)防止其升職為主節(jié)點(diǎn)可以在分布式數(shù)據(jù)中心的結(jié)構(gòu)中起到很好的作用。

在下述這樣的擁有三個(gè)成員的復(fù)制集中,一個(gè)主節(jié)點(diǎn)和一個(gè)從節(jié)點(diǎn)坐落在某一個(gè)數(shù)據(jù)中心中,另一個(gè)不能升職為主節(jié)點(diǎn)的 優(yōu)先級(jí)為0 的從節(jié)點(diǎn)則在另一個(gè)數(shù)據(jù)中心。

 

將優(yōu)先級(jí)為0的成員作為備用節(jié)點(diǎn)

在很多情況下,我們可能不需要準(zhǔn)備一個(gè) 優(yōu)先級(jí)為0 的備用節(jié)點(diǎn)。然而在一些硬件環(huán)境或是架構(gòu)的 地理分布 較為多變的情境中,一個(gè) 優(yōu)先級(jí)為0 的備用節(jié)點(diǎn)可以很好的保證符合條件的成員升職為主節(jié)點(diǎn)。

一個(gè)擁有特殊硬件配置或是系統(tǒng)優(yōu)化配置的 優(yōu)先級(jí)為0 的備用節(jié)點(diǎn)也可以有效的為特殊需求提供服務(wù)。比如可以將 優(yōu)先級(jí)設(shè)置為0 來(lái)讓其不能升職為主節(jié)點(diǎn)。

如果我們的復(fù)制集中已經(jīng)有了七個(gè)參與投票的節(jié)點(diǎn),那么請(qǐng)將其他節(jié)點(diǎn)設(shè)置為 不參與投票 。

 

優(yōu)先級(jí)為0的節(jié)點(diǎn)與故障切換

當(dāng)配置一個(gè) 優(yōu)先級(jí)為0 的節(jié)點(diǎn)時(shí),我們需要考慮到可能出現(xiàn)的故障切換情況,比如網(wǎng)絡(luò)故障等。需要注意的時(shí),我們要確保在主數(shù)據(jù)中心中擁有足夠多可以參與投票和選舉的節(jié)點(diǎn),并確保其擁有可以順利成為主節(jié)點(diǎn)的成員。

 

 

隱藏節(jié)點(diǎn)

隱藏節(jié)點(diǎn)擁有與 主節(jié)點(diǎn) 一致的數(shù)據(jù)集,但是它對(duì)于應(yīng)用程序來(lái)說(shuō)是 不可見(jiàn)的。隱藏節(jié)點(diǎn)可以很好的與 復(fù)制集 中的其他節(jié)點(diǎn)隔離,并應(yīng)對(duì)特殊的需求。隱藏節(jié)點(diǎn)也應(yīng)該是一個(gè) 不能升職為主節(jié)點(diǎn)優(yōu)先級(jí)為0的節(jié)點(diǎn) 。函數(shù) db.isMaster() 將不會(huì)列出隱藏節(jié)點(diǎn)。隱藏節(jié)點(diǎn)在 選舉 中是 可以進(jìn)行投票的。

在下述這樣擁有五個(gè)節(jié)點(diǎn)的復(fù)制集中,四個(gè)從節(jié)點(diǎn)都擁有與主節(jié)點(diǎn)一致的數(shù)據(jù)集,但其中的一個(gè)從節(jié)點(diǎn)是隱藏節(jié)點(diǎn)。

 

讀操

客戶端將不會(huì)把讀請(qǐng)求分發(fā)到隱藏節(jié)點(diǎn)上,即使我們?cè)O(shè)定了 復(fù)制集讀選項(xiàng) 。這些隱藏節(jié)點(diǎn)將不會(huì)收到來(lái)自應(yīng)用程序的請(qǐng)求。我們可以將隱藏節(jié)點(diǎn)專用于報(bào)表節(jié)點(diǎn)或是備份節(jié)點(diǎn)。 延時(shí)節(jié)點(diǎn) 也應(yīng)該是一個(gè)隱藏節(jié)點(diǎn)。

在分片集群中, mongos 將不與隱藏節(jié)點(diǎn)進(jìn)行交流。

 

投票

在復(fù)制集的選舉中,隱藏節(jié)點(diǎn)是會(huì) 參加 投票的。當(dāng)關(guān)閉一個(gè)隱藏節(jié)點(diǎn)的時(shí)候,請(qǐng)確認(rèn)復(fù)制集中的可用節(jié)點(diǎn)個(gè)數(shù)足夠進(jìn)行選舉,以防 主節(jié)點(diǎn) 降職導(dǎo)致復(fù)制集對(duì)外不可用。

將隱藏節(jié)點(diǎn)用于備份,可以防止我們?cè)趥浞葸^(guò)程中使用 db.fsyncLock()db.fsyncUnlock() 操作來(lái)對(duì) mongod 實(shí)例加或解除寫(xiě)鎖的過(guò)程中應(yīng)用程序的不可用。

 

 

延時(shí)節(jié)點(diǎn)

延時(shí)節(jié)點(diǎn)也將從 復(fù)制集 中主節(jié)點(diǎn)復(fù)制數(shù)據(jù),然而延時(shí)節(jié)點(diǎn)中的數(shù)據(jù)集將會(huì)比復(fù)制集中主節(jié)點(diǎn)的數(shù)據(jù)延后。舉個(gè)例子,現(xiàn)在是09:52,如果延時(shí)節(jié)點(diǎn)延后了1小時(shí),那么延時(shí)節(jié)點(diǎn)的數(shù)據(jù)集中將不會(huì)有08:52之后的操作。

由于延時(shí)節(jié)點(diǎn)的數(shù)據(jù)集是延時(shí)的,因此它可以幫助我們?cè)谌藶檎`操作或是其他意外情況下恢復(fù)數(shù)據(jù)。舉個(gè)例子,當(dāng)應(yīng)用升級(jí)失敗,或是誤操作刪除了表和數(shù)據(jù)庫(kù)時(shí),我們可以通過(guò)延時(shí)節(jié)點(diǎn)進(jìn)行數(shù)據(jù)恢復(fù)。

 

行為

延時(shí)節(jié)點(diǎn)通過(guò)延時(shí)應(yīng)用 oplog 中的操作來(lái)實(shí)現(xiàn)其延時(shí)的效果。當(dāng)我們選擇延時(shí)時(shí)常的時(shí)候,需要考慮到以下內(nèi)容:

  • 必須大于或者等于你的維護(hù)視窗。

  • 必須 小于 oplog的存儲(chǔ)能力

 

分片

在分片集群中,當(dāng) 平衡器 平衡器打開(kāi)的時(shí)候延時(shí)節(jié)點(diǎn)效果有限。因?yàn)檠訒r(shí)節(jié)點(diǎn)延時(shí)的復(fù)制數(shù)據(jù)段,而若在延時(shí)的時(shí)間段內(nèi)進(jìn)行過(guò)數(shù)據(jù)段遷移的話,復(fù)制集中的延時(shí)節(jié)點(diǎn)就無(wú)法為還原分片集群提供有效的幫助

 

例子

在下述這樣擁有五個(gè)成員的復(fù)制集中,主節(jié)點(diǎn)與所有從節(jié)點(diǎn)都擁有數(shù)據(jù)集的副本。其中一個(gè)從節(jié)點(diǎn)延時(shí)3600秒(1小時(shí))應(yīng)用oplog中的操作。這個(gè)延時(shí)節(jié)點(diǎn)同時(shí)也是 隱藏節(jié)點(diǎn)優(yōu)先級(jí)為0 的節(jié)點(diǎn)。

 

配置方式

延時(shí)節(jié)點(diǎn)需要將 priority 設(shè)置為0,還需要將 hidden 設(shè)置為 true ,同時(shí)還需要將 slaveDelay 設(shè)置為想要延遲的時(shí)間(單位為秒):

{
   "_id" : <num>,
   "host" : <hostname:port>,
   "priority" : 0,
   "slaveDelay" : <seconds>,
   "hidden" : true}

 

投票節(jié)點(diǎn)

投票節(jié)點(diǎn) 并不含有復(fù)制集中的數(shù)據(jù)集副本,且也 無(wú)法升職為主節(jié)點(diǎn)。復(fù)制集中可能會(huì)有多個(gè)投票節(jié)點(diǎn)來(lái)為 選舉出新的主節(jié)點(diǎn) 進(jìn)行投票。投票節(jié)點(diǎn)的存在使得復(fù)制集可以以偶數(shù)個(gè)節(jié)點(diǎn)存在,而無(wú)需為復(fù)制集再新增節(jié)點(diǎn)。

 

注意

不要將投票節(jié)點(diǎn)運(yùn)行在復(fù)制集的主節(jié)點(diǎn)或者從節(jié)點(diǎn)機(jī)器上。

 

僅僅在復(fù)制集成員為偶數(shù)個(gè)的時(shí)候加入投票節(jié)點(diǎn)。如果在擁有奇數(shù)個(gè)復(fù)制集成員的復(fù)制集中新增了一個(gè)投票節(jié)點(diǎn),復(fù)制集可能會(huì)遇到 選舉 僵局。

 

文章標(biāo)題:monogdb復(fù)制原理詳解
地址分享:http://muchs.cn/article38/gjsesp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序App開(kāi)發(fā)、網(wǎng)站策劃、企業(yè)建站、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司