實戰MongoDBweb
Master-Slavemongodb
MongoDB支持不一樣服務之間的異步的數據複製,來實現failover(故障轉移,故障切換,故障恢復) and redundancy(數據冗餘)。ubuntu
同一時間,只有一個服務節點(primary或者master)支持寫入。異步
MongoDB支持兩種複製的模式:ide
介紹Master/Slave的官方地址:google
http://www.mongodb.org/display/DOCS/Master+Slavespa
介紹Replica Set的官方地址:日誌
http://www.mongodb.org/display/DOCS/Replica+Setscode
今天實戰的是replica set,也就是複製集複製。orm
一般用於下面幾個場景
首先仍是啓動mongod,用於replica set的參數有兩個:
--replSet <setname>,複製集的名稱。
--oplogSize <MB>,操做日誌的大小,單位爲MB。
這回咱們在ubuntu下面配置replica set,先啓動兩個mongod節點。
- 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
你會注意到,上面兩個mongod的啓動參數replSet指定了相同的值shard1,也就是兩個個mongod節點處於同一個replica set中。
Replica Set的初始化
光啓動了兩個個mongod節點,還不能提供任何的服務,這時候你使用mongo鏈接以後,進行db.book.insert會提示你no master,也就是說沒有primary節點,因此他不知道往哪個節點寫入數據。
在啓動了兩個個mongod節點以後,須要進行初始化。
首先用mongo鏈接到任意一個mongod節點,而後執行下面的命令。
- cfg={_id:'shard1',members:[
- {_id:0,host:'192.168.0.21:10001'},
- {_id:1,host:'192.168.0.21:10002'}]
- }
- rs.initiate(cfg)
出現下面的提示信息就表明成功了,若是沒有成功,能夠google一下錯誤提示,會找到不少的答案的。
- {
- "info" : "Config now saved locally. Should come online in about a minute.",
- "ok" : 1
- }
繼續執行
- rs.status()
能夠查看replica set的狀態,包括名稱,時間,當前登陸的mongod是primary仍是secondary,以及成員的信息等。
在replica set的信息中,其中重要的是:
成員信息中包括地址,健康狀態,是primary仍是secondary等。
成員信息中比較重要的是
這時候登陸primary的mongod,插入一條數據。
- //假設10001是primary,能夠經過查詢rs.status來獲取
- mongo 192.168.0.21:10001
- use test
- db.book.insert({'title':'computer'})
而後查看secondary的log文件,會發現發生了複製行爲。
這時候登陸secondary,use test,db.book.find(),能夠報錯了。
- error: { "$err" : "not master and slaveok=false", "code" : 13435 }
沒有關係,在secondary讀取數據還須要咱們作最後的一步,在須要讀取數據的secondary上執行。
- rs.slaveOK()
這時候再次db.book.find(),正常顯示結果了,沒有問題了。
添加節點
啓動新mongod節點
- mongod --dbpath /home/andyshi/mongo3/ --logpath /home/andyshi/mongo3/log.log --replSet shard1 --port 10003 --bind_ip 192.168.0.21
鏈接primary節點,執行下面的命令。
- rs.add('192.168.0.21:10003')
- rs.addArb('192.168.0.21:10003')
- //從新配置
- rs.reconfig(rs.conf())
強制一個節點成爲primary
在mongodb2.0以後可使用下面
相比master-slave,replica set的優勢就是沒有單點故障,primary故障以後,整個replica set會自動選擇一個健康的節點成爲primary,承擔寫的任務,可用性比master-slave的高,提供更高的可用性。