MongoDB復(fù)制集(一)

前言

在平時(shí)的學(xué)習(xí)開發(fā)中,我們一般都是在單點(diǎn)模式下進(jìn)行的,也就是使用單臺(tái)服務(wù)器,一個(gè)mongod服務(wù)器進(jìn)程。對(duì)于單點(diǎn)模式,首先部署起來很方便,只需要幾個(gè)簡(jiǎn)單的參數(shù)或者使用默認(rèn)配置就能將實(shí)例啟動(dòng),其次單點(diǎn)模式很節(jié)省資源。但是在生成環(huán)境中,如果服務(wù)器崩潰或者不可訪問怎么辦?數(shù)據(jù)庫至少有一段時(shí)間不可用。如果硬盤損壞或?qū)M,可能需要將數(shù)據(jù)轉(zhuǎn)移到另一個(gè)機(jī)器上。在最壞的情況下,硬盤或網(wǎng)絡(luò)出現(xiàn)問題可能會(huì)導(dǎo)致數(shù)據(jù)損壞或者數(shù)據(jù)不可訪問。這是就可以使用MongoDB的復(fù)制功能,即使一臺(tái)或多臺(tái)服務(wù)器出錯(cuò),也可以保證應(yīng)用程序正常運(yùn)行和數(shù)據(jù)安全。

復(fù)制集介紹

MongoDB復(fù)制集是從傳統(tǒng)主從結(jié)構(gòu)(Master/Slave)演變而來,是由一組擁有相同數(shù)據(jù)集的mongod實(shí)例所組成的集群。

讀寫分離的主從結(jié)構(gòu):
讀寫分離的基本原理就是讓主數(shù)據(jù)庫處理事務(wù)性增、改、刪(寫)操作,而從數(shù)據(jù)庫處理查詢(讀)操作。數(shù)據(jù)庫復(fù)制被用來把事務(wù)性操作導(dǎo)致的變更同步到其他從數(shù)據(jù)庫。以SQL為例,主庫負(fù)責(zé)寫數(shù)據(jù)、讀數(shù)據(jù)。讀庫僅負(fù)責(zé)讀數(shù)據(jù)。每次有寫庫操作,同步更新到讀庫。寫庫就一個(gè),讀庫可以有多個(gè),采用日志同步的方式實(shí)現(xiàn)主庫和多個(gè)讀庫的數(shù)據(jù)同步。

一個(gè)復(fù)制集包含多個(gè)數(shù)據(jù)節(jié)點(diǎn)和一個(gè)選舉節(jié)點(diǎn)。數(shù)據(jù)節(jié)點(diǎn)中僅有一個(gè)為主節(jié)點(diǎn)(Primary),其它的為從節(jié)點(diǎn)(Secondary)。對(duì)于主節(jié)點(diǎn),所有的請(qǐng)求都是在它上面完成的,從節(jié)點(diǎn)接收主節(jié)點(diǎn)傳來的操作并以此來保證與主節(jié)點(diǎn)上的數(shù)據(jù)完全一致。需注意只有主節(jié)點(diǎn)能接收寫操作,從節(jié)點(diǎn)是絕對(duì)無法寫入的。不同于MySQL設(shè)置read only的從節(jié)點(diǎn)若有super權(quán)限同樣可進(jìn)行寫操作。不難看出,復(fù)制集是通過復(fù)制而實(shí)現(xiàn)數(shù)據(jù)的冗余而提高數(shù)據(jù)的可靠性。

replica-set-read-write-operations-primary

  從上圖可以看出,所有的讀寫請(qǐng)求都是由客戶端應(yīng)用程序通過驅(qū)動(dòng)來指向MongoDB數(shù)據(jù)庫,寫請(qǐng)求都是指向當(dāng)前數(shù)據(jù)庫的主節(jié)點(diǎn),寫請(qǐng)求執(zhí)行完畢后,會(huì)記錄在主節(jié)點(diǎn)的oplog中(記錄寫操作而不記錄讀操作),從節(jié)點(diǎn)通過主節(jié)點(diǎn)的oplog來進(jìn)行復(fù)制操作。在默認(rèn)情況下,讀請(qǐng)求也是指向主節(jié)點(diǎn)的。因?yàn)镸ongoDB復(fù)制集是異步復(fù)制形式,會(huì)由于磁盤的刷盤效率和網(wǎng)絡(luò)的原因?qū)е聫墓?jié)點(diǎn)的數(shù)據(jù)相對(duì)于主節(jié)點(diǎn)有一點(diǎn)延遲,驅(qū)動(dòng)在沒有配置的情況下會(huì)指向主庫,也就是當(dāng)前最新的數(shù)據(jù)。當(dāng)然如果對(duì)數(shù)據(jù)的時(shí)效性要求不高時(shí)可以配置讀操作指向某一個(gè)從節(jié)點(diǎn),實(shí)現(xiàn)讀寫分離。

復(fù)制集特點(diǎn)

  • MongoDB復(fù)制集的主是唯一的,但不是固定的。
    當(dāng)前主節(jié)點(diǎn)出現(xiàn)故障時(shí),比如網(wǎng)絡(luò)不通等等,集群會(huì)自動(dòng)容災(zāi),通過選舉在從節(jié)點(diǎn)中選出一個(gè)合適的充當(dāng)主節(jié)點(diǎn)。我們可以通過配置從節(jié)點(diǎn)優(yōu)先級(jí)來決定哪個(gè)從節(jié)點(diǎn)盡可能地成為主節(jié)點(diǎn)。
  • MongoDB有一個(gè)大多數(shù)原則。
    當(dāng)主節(jié)點(diǎn)出故障時(shí),是否能選舉出新的主節(jié)點(diǎn),并不是由復(fù)制集中投票節(jié)點(diǎn)存在與否來決定的,而是由當(dāng)前復(fù)制集成員存活數(shù)量來決定的。當(dāng)存活節(jié)點(diǎn)小于等于二分之一時(shí),將全部降為從節(jié)點(diǎn),只可讀不可寫。
  • 從庫無法寫入,這點(diǎn)在前面已經(jīng)介紹。
  • 傳統(tǒng)主從結(jié)構(gòu)僅剩的一絲尊嚴(yán)
    在某些情況下,可能由于硬盤空間的限制,從節(jié)點(diǎn)并不想完全復(fù)制主節(jié)點(diǎn)中的數(shù)據(jù),只想給特定的數(shù)據(jù)庫做冗余。這時(shí)就可以用主從結(jié)構(gòu),在搭建從節(jié)點(diǎn)時(shí)在配置文件中指定only選項(xiàng),并把要復(fù)制的數(shù)據(jù)庫的庫名作為參數(shù)放在后面。但是only并不能應(yīng)用于復(fù)制集中,想象一下,如果當(dāng)前主節(jié)點(diǎn)A擁有三個(gè)庫1、2、3,從節(jié)點(diǎn)只復(fù)制其中的一個(gè)庫1。當(dāng)主節(jié)點(diǎn)A掛了,則選舉出新的主節(jié)點(diǎn)B。當(dāng)A恢復(fù)正常重新投入使用,它要從新的主節(jié)點(diǎn)B中復(fù)制數(shù)據(jù)時(shí),發(fā)現(xiàn)B中沒有2、3庫,那么這時(shí)復(fù)制就會(huì)出錯(cuò),這就是復(fù)制集不支持復(fù)制指定庫的原因。
  • 限制
    在3.0.0版本中,復(fù)制集最多擁有50個(gè)節(jié)點(diǎn)(之前的版本僅支持12個(gè))且參與選舉的數(shù)據(jù)節(jié)點(diǎn)只能有7個(gè),超過該限制就需要使用主從結(jié)構(gòu)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容