您好,登錄后才能下訂單哦!
實(shí)戰(zhàn)MongoDB
Master-Slave
MongoDB支持不同服務(wù)之間的異步的數(shù)據(jù)復(fù)制,來實(shí)現(xiàn)failover(故障轉(zhuǎn)移,故障切換,故障恢復(fù)) and redundancy(數(shù)據(jù)冗余)。
同一時(shí)間,只有一個(gè)服務(wù)節(jié)點(diǎn)(primary或者master)支持寫入。
MongoDB支持兩種復(fù)制的模式:
介紹Master/Slave的官方地址:
http://www.mongodb.org/display/DOCS/Master+Slave
介紹Replica Set的官方地址:
http://www.mongodb.org/display/DOCS/Replica+Sets
今天實(shí)戰(zhàn)的是replica set,也就是復(fù)制集復(fù)制。
通常用于下面幾個(gè)場景
首先還是啟動mongod,用于replica set的參數(shù)有兩個(gè):
--replSet <setname>,復(fù)制集的名稱。
--oplogSize <MB>,操作日志的大小,單位為MB。
這回我們在ubuntu下面配置replica set,先啟動兩個(gè)mongod節(jié)點(diǎn)。
- mongod --dbpath /home/andyshi/mongo1/ --logpath /home/andyshi/mongo1/log.log --replSet shard1 --port 10001 --bind_ip 192.168.0.21
- mongod --dbpath /home/andyshi/mongo2/ --logpath /home/andyshi/mongo2/log.log --replSet shard1 --port 10002 --bind_ip 192.168.0.21
你會注意到,上面兩個(gè)mongod的啟動參數(shù)replSet指定了相同的值shard1,也就是兩個(gè)個(gè)mongod節(jié)點(diǎn)處于同一個(gè)replica set中。
Replica Set的初始化
光啟動了兩個(gè)個(gè)mongod節(jié)點(diǎn),還不能提供任何的服務(wù),這時(shí)候你使用mongo連接之后,進(jìn)行db.book.insert會提示你no master,也就是說沒有primary節(jié)點(diǎn),所以他不知道往哪一個(gè)節(jié)點(diǎn)寫入數(shù)據(jù)。
在啟動了兩個(gè)個(gè)mongod節(jié)點(diǎn)之后,需要進(jìn)行初始化。
首先用mongo連接到任意一個(gè)mongod節(jié)點(diǎn),然后執(zhí)行下面的命令。
- cfg={_id:'shard1',members:[
- {_id:0,host:'192.168.0.21:10001'},
- {_id:1,host:'192.168.0.21:10002'}]
- }
- rs.initiate(cfg)
出現(xiàn)下面的提示信息就代表成功了,如果沒有成功,可以google一下錯誤提示,會找到很多的答案的。
- {
- "info" : "Config now saved locally. Should come online in about a minute.",
- "ok" : 1
- }
繼續(xù)執(zhí)行
- rs.status()
可以查看replica set的狀態(tài),包括名稱,時(shí)間,當(dāng)前登錄的mongod是primary還是secondary,以及成員的信息等。
在replica set的信息中,其中重要的是:
成員信息中包括地址,健康狀態(tài),是primary還是secondary等。
成員信息中比較重要的是
這時(shí)候登錄primary的mongod,插入一條數(shù)據(jù)。
- //假設(shè)10001是primary,可以通過查詢r(jià)s.status來獲取
- mongo 192.168.0.21:10001
- use test
- db.book.insert({'title':'computer'})
然后查看secondary的log文件,會發(fā)現(xiàn)發(fā)生了復(fù)制行為。
這時(shí)候登錄secondary,use test,db.book.find(),可以報(bào)錯了。
- error: { "$err" : "not master and slaveok=false", "code" : 13435 }
沒有關(guān)系,在secondary讀取數(shù)據(jù)還需要我們做最后的一步,在需要讀取數(shù)據(jù)的secondary上執(zhí)行。
- rs.slaveOK()
這時(shí)候再次db.book.find(),正常顯示結(jié)果了,沒有問題了。
添加節(jié)點(diǎn)
啟動新mongod節(jié)點(diǎn)
- mongod --dbpath /home/andyshi/mongo3/ --logpath /home/andyshi/mongo3/log.log --replSet shard1 --port 10003 --bind_ip 192.168.0.21
連接primary節(jié)點(diǎn),執(zhí)行下面的命令。
- rs.add('192.168.0.21:10003')
- rs.addArb('192.168.0.21:10003')
- //重新配置
- rs.reconfig(rs.conf())
強(qiáng)制一個(gè)節(jié)點(diǎn)成為primary
在mongodb2.0之后可以使用下面
相比master-slave,replica set的優(yōu)點(diǎn)就是沒有單點(diǎn)故障,primary故障之后,整個(gè)replica set會自動選擇一個(gè)健康的節(jié)點(diǎn)成為primary,承擔(dān)寫的任務(wù),可用性比master-slave的高,提供更高的可用性。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。