MongoDB高可用方案之主從復(fù)制
MongoDB 是當(dāng)前比較流行的文檔型數(shù)據(jù)庫,其擁有易使用、易擴(kuò)展、功能豐富、性能卓越等特性。
主節(jié)點(diǎn)會記錄寫有關(guān)的操作,讀操作不記錄。這些操作記錄在local數(shù)據(jù)庫中的oplog.admin和slave兩個(gè)集合。slave記錄從節(jié)點(diǎn)信息。
從節(jié)點(diǎn)會定時(shí)去連接主節(jié)點(diǎn),獲取主節(jié)點(diǎn)的操作日志從而執(zhí)行主節(jié)點(diǎn)一樣的操作,從而達(dá)到數(shù)據(jù)同步。從節(jié)點(diǎn)的local數(shù)據(jù)庫會有 source、me兩個(gè)集合。source記錄主節(jié)點(diǎn)信息,me記錄從節(jié)點(diǎn)標(biāo)識。
下面看一下怎么一步步搭建MongoDB的主從復(fù)制節(jié)點(diǎn):
準(zhǔn)備兩臺機(jī)器 10.43.159.56 和 10.43.159.58。10.43.159.56當(dāng)作主節(jié)點(diǎn), 10.43.159.58作為從節(jié)點(diǎn)。
分別下載MongoDB安裝程序包。在10.43.159.56上建立文件夾/data/MongoDBtest/master,10.43.159.58建立文件夾/data/MongoDBtest/slave。
在10.43.159.56啟動(dòng)MongoDB主節(jié)點(diǎn)程序。注意后面的這個(gè) “ –master ”參數(shù),標(biāo)示主節(jié)點(diǎn):
mongod –dbpath /data/MongoDBtest/master–master
輸出日志如下,成功:
[initandlisten] MongoDB starting :pid=18285 port=27017 dbpath=/data/MongoDBtest/master master=1
在10.43.159.58啟動(dòng)MongoDB從節(jié)點(diǎn)程序。關(guān)鍵配置:指定主節(jié)點(diǎn)ip地址和端口 –source 10.43.159.56:27017 和標(biāo)示從節(jié)點(diǎn) –slave參數(shù):
mongod –dbpath /data/MongoDBtest/slave–slave –source 10.43.159.56:27017
輸出日志如下,成功:
[initandlisten] MongoDB starting : pid=17888port=27017 dbpath=/data/MongoDBtest/slave slave=1
日志顯示從節(jié)點(diǎn)從主節(jié)點(diǎn)同步復(fù)制數(shù)據(jù) :
[replslave] repl: from host: 10.43.159.56:27017
這樣,主從結(jié)構(gòu)的MongoDB集群就搭建好了,是不是很簡單?
下面我們來看看這個(gè)集群能做什么?先登錄到從節(jié)點(diǎn)shell上,執(zhí)行插入數(shù)據(jù):
mongo 127.0.0.1:27017
> db.testdb.insert({"test3":"testval3"});
not master
可以看到 MongoDB的從節(jié)點(diǎn)是只能讀,不能執(zhí)行寫操作的。
那么如果主服務(wù)器掛掉,從服務(wù)器可以接替工作嗎?
可以試一下,強(qiáng)制關(guān)掉主節(jié)點(diǎn)上的MongoDB進(jìn)程,登錄在從節(jié)點(diǎn)上,再次執(zhí)行插入數(shù)據(jù):
> db.testdb.insert({"test3":"testval3"});
not master
看來從節(jié)點(diǎn)并沒有自動(dòng)接替主節(jié)點(diǎn)的工作,那就只有人工處理了,停止從節(jié)點(diǎn),再以master的方式啟動(dòng)從節(jié)點(diǎn),由于從節(jié)點(diǎn)上數(shù)據(jù)跟主節(jié)點(diǎn)一樣,此時(shí)從節(jié)點(diǎn)是可以替代主節(jié)點(diǎn)工作的,這屬于人工切換。
此外,我們可以搭建多個(gè)從節(jié)點(diǎn),實(shí)現(xiàn)數(shù)據(jù)庫的讀寫分離,比如主節(jié)點(diǎn)負(fù)責(zé)寫,多個(gè)從節(jié)點(diǎn)負(fù)責(zé)讀,對于移動(dòng)APP,絕大部分操作都是讀操作,可以實(shí)現(xiàn)負(fù)荷分擔(dān)。