前言
在平時的學(xué)習(xí)開發(fā)中,我們一般都是在單點模式下進行的弄痹,也就是使用單臺服務(wù)器饭入,一個mongod服務(wù)器進程。對于單點模式肛真,首先部署起來很方便谐丢,只需要幾個簡單的參數(shù)或者使用默認配置就能將實例啟動,其次單點模式很節(jié)省資源蚓让。但是在生成環(huán)境中乾忱,如果服務(wù)器崩潰或者不可訪問怎么辦?數(shù)據(jù)庫至少有一段時間不可用历极。如果硬盤損壞或?qū)M饭耳,可能需要將數(shù)據(jù)轉(zhuǎn)移到另一個機器上。在最壞的情況下执解,硬盤或網(wǎng)絡(luò)出現(xiàn)問題可能會導(dǎo)致數(shù)據(jù)損壞或者數(shù)據(jù)不可訪問寞肖。這是就可以使用MongoDB的復(fù)制功能,即使一臺或多臺服務(wù)器出錯衰腌,也可以保證應(yīng)用程序正常運行和數(shù)據(jù)安全新蟆。
復(fù)制集介紹
MongoDB復(fù)制集是從傳統(tǒng)主從結(jié)構(gòu)(Master/Slave)演變而來,是由一組擁有相同數(shù)據(jù)集的mongod實例所組成的集群右蕊。
讀寫分離的主從結(jié)構(gòu):
讀寫分離的基本原理就是讓主數(shù)據(jù)庫處理事務(wù)性增琼稻、改、刪(寫)操作饶囚,而從數(shù)據(jù)庫處理查詢(讀)操作帕翻。數(shù)據(jù)庫復(fù)制被用來把事務(wù)性操作導(dǎo)致的變更同步到其他從數(shù)據(jù)庫。以SQL為例萝风,主庫負責(zé)寫數(shù)據(jù)嘀掸、讀數(shù)據(jù)。讀庫僅負責(zé)讀數(shù)據(jù)规惰。每次有寫庫操作睬塌,同步更新到讀庫。寫庫就一個歇万,讀庫可以有多個揩晴,采用日志同步的方式實現(xiàn)主庫和多個讀庫的數(shù)據(jù)同步。
一個復(fù)制集包含多個數(shù)據(jù)節(jié)點和一個選舉節(jié)點贪磺。數(shù)據(jù)節(jié)點中僅有一個為主節(jié)點(Primary)硫兰,其它的為從節(jié)點(Secondary)。對于主節(jié)點寒锚,所有的請求都是在它上面完成的劫映,從節(jié)點接收主節(jié)點傳來的操作并以此來保證與主節(jié)點上的數(shù)據(jù)完全一致呻粹。需注意只有主節(jié)點能接收寫操作,從節(jié)點是絕對無法寫入的苏研。不同于MySQL設(shè)置read only
的從節(jié)點若有super權(quán)限同樣可進行寫操作等浊。不難看出她紫,復(fù)制集是通過復(fù)制而實現(xiàn)數(shù)據(jù)的冗余而提高數(shù)據(jù)的可靠性戚绕。
從上圖可以看出,所有的讀寫請求都是由客戶端應(yīng)用程序通過驅(qū)動來指向MongoDB數(shù)據(jù)庫蛹含,寫請求都是指向當(dāng)前數(shù)據(jù)庫的主節(jié)點衅鹿,寫請求執(zhí)行完畢后撒踪,會記錄在主節(jié)點的
oplog
中(記錄寫操作而不記錄讀操作),從節(jié)點通過主節(jié)點的oplog
來進行復(fù)制操作大渤。在默認情況下制妄,讀請求也是指向主節(jié)點的。因為MongoDB復(fù)制集是異步復(fù)制形式泵三,會由于磁盤的刷盤效率和網(wǎng)絡(luò)的原因?qū)е聫墓?jié)點的數(shù)據(jù)相對于主節(jié)點有一點延遲耕捞,驅(qū)動在沒有配置的情況下會指向主庫,也就是當(dāng)前最新的數(shù)據(jù)烫幕。當(dāng)然如果對數(shù)據(jù)的時效性要求不高時可以配置讀操作指向某一個從節(jié)點俺抽,實現(xiàn)讀寫分離。
復(fù)制集特點
- MongoDB復(fù)制集的主是唯一的较曼,但不是固定的磷斧。
當(dāng)前主節(jié)點出現(xiàn)故障時,比如網(wǎng)絡(luò)不通等等捷犹,集群會自動容災(zāi)弛饭,通過選舉在從節(jié)點中選出一個合適的充當(dāng)主節(jié)點。我們可以通過配置從節(jié)點優(yōu)先級來決定哪個從節(jié)點盡可能地成為主節(jié)點萍歉。 - MongoDB有一個大多數(shù)原則侣颂。
當(dāng)主節(jié)點出故障時,是否能選舉出新的主節(jié)點翠桦,并不是由復(fù)制集中投票節(jié)點存在與否來決定的横蜒,而是由當(dāng)前復(fù)制集成員存活數(shù)量來決定的胳蛮。當(dāng)存活節(jié)點小于等于二分之一時销凑,將全部降為從節(jié)點,只可讀不可寫仅炊。 - 從庫無法寫入斗幼,這點在前面已經(jīng)介紹。
-
傳統(tǒng)主從結(jié)構(gòu)僅剩的一絲尊嚴
在某些情況下抚垄,可能由于硬盤空間的限制蜕窿,從節(jié)點并不想完全復(fù)制主節(jié)點中的數(shù)據(jù)谋逻,只想給特定的數(shù)據(jù)庫做冗余。這時就可以用主從結(jié)構(gòu)桐经,在搭建從節(jié)點時在配置文件中指定only
選項毁兆,并把要復(fù)制的數(shù)據(jù)庫的庫名作為參數(shù)放在后面。但是only
并不能應(yīng)用于復(fù)制集中阴挣,想象一下气堕,如果當(dāng)前主節(jié)點A擁有三個庫1、2畔咧、3茎芭,從節(jié)點只復(fù)制其中的一個庫1。當(dāng)主節(jié)點A掛了誓沸,則選舉出新的主節(jié)點B梅桩。當(dāng)A恢復(fù)正常重新投入使用,它要從新的主節(jié)點B中復(fù)制數(shù)據(jù)時拜隧,發(fā)現(xiàn)B中沒有2宿百、3庫,那么這時復(fù)制就會出錯洪添,這就是復(fù)制集不支持復(fù)制指定庫的原因犀呼。 -
限制
在3.0.0版本中,復(fù)制集最多擁有50個節(jié)點(之前的版本僅支持12個)且參與選舉的數(shù)據(jù)節(jié)點只能有7個薇组,超過該限制就需要使用主從結(jié)構(gòu)外臂。