咱們以前的案例都是在單個節點上實現的,在生產環境中這種作法是有風險的,若是服務宕機、崩潰或者硬盤壞了都會對公司業務形成損失,所以咱們須要數據備份。在MongoDB中咱們能夠經過副本集來實現這一需求,MongoDB副本集(Replica Set)是有自動故障恢復功能的主從集羣,有一個Primary節點和一個或多個Secondary節點組成,若是Primary崩潰了,會自動從Secondary中選擇一個將其升級爲新的主服務器,本文咱們先來看看副本集環境的搭建。 node
本文是MongoDB系列的第十五篇文章,瞭解前面的文章有助於更好的理解本文:mongodb
1.Linux上安裝MongoDB
2.MongoDB基本操做
3.MongoDB數據類型
4.MongoDB文檔更新操做
5.MongoDB文檔查詢操做(一)
6.MongoDB文檔查詢操做(二)
7.MongoDB文檔查詢操做(三)
8.MongoDB查看執行計劃
9.初識MongoDB中的索引
10.MongoDB中各類類型的索引
11.MongoDB固定集合
12.MongoDB管道操做符(一)
13.MongoDB管道操做符(二)
14.MongoDB中MapReduce使用shell
咱們在實際的生產環境中確定是多臺服務器部署,可是在本身學習過程當中,咱們能夠在一臺服務器上來模擬這個環境,這樣能夠簡化咱們的操做,讓小夥伴們快速上手。下一小節我會和你們分享如何在真實的生產環境中建立副本集。 數據庫
好了,開始吧。 服務器
首先咱們在Linux根目錄下建立/data/db目錄做爲咱們的數據保存目錄,而後執行以下命令啓動一個mongo shell:學習
mongo --nodb
--nodb表示啓動時不鏈接任何數據庫,而後經過以下命令建立一個副本集:測試
replicaSet=new ReplSetTest({nodes:3})
在建立的日誌中,咱們能夠看到三個實例的端口號,我這裏分別是20000、2000一、20002,此時咱們的副本集建立好了,可是並未啓動,接下來執行以下命令啓動三個mongodb實例:spa
replicaSet.startSet()
再執行以下命令配置複製功能:命令行
replicaSet.initiate()
這樣環境基本就配好了,此時當前的shell不要關閉,咱們從新打開一個Linux命令窗口,執行以下命令:日誌
mongo 192.168.248.128:20000/sang_1
表示鏈接端口爲20000的那個實例中的sang_1數據庫,鏈接成功後,咱們能夠執行以下命令查看當前實例的身份,以下:
db.isMaster()
返回的數據不少,其中有一條是"ismaster" : true
,表示這是一個主節點,此時咱們再分別打開兩個Linux窗口,分別執行以下兩條命令,進入另外兩個節點:
mongo 192.168.248.128:20001/sang_1 mongo 192.168.248.128:20002/sang_1
鏈接成功以後,依然能夠經過db.isMaster()
命令來查看備份節點的身份,咱們發現此時"ismaster" : false
,表示這是一個備份節點,此時咱們能夠先作個簡單的測試了,此時我在主節點(端口爲20000)那個節點上寫一個文檔,寫完以後,咱們看看其餘副本集成員上是否有我剛纔的寫的文檔的副本,執行命令順序以下:
主節點寫入數據:
db.collect1.insert({x:"hahaha"})
任意一個副本節點,先執行以下命令表示能夠從備份節點讀取數據:
db.setSlaveOk()
而後再在備份節點中執行以下命令讀取數據:
db.collect1.find()
此時,咱們發現數據已經備份成功了。
若是此時咱們嘗試向備份節點中直接寫入文檔,會發現寫入失敗,這裏須要注意備份節點中的數據都是備份來的,不能夠直接寫入,想寫入,除非等它的身份轉爲主節點才能夠。
此時,咱們嘗試經過以下命令關閉主節點:
use admin db.shutdownServer()
而後查看兩個備份節點的db.isMaster(),發現有一個備份節點自動上位成爲了主節點。
最後若是想關閉副本集,能夠回到第一個shell命令行中,輸入以下命令:
replicaSet.stopSet()
OK,以上操做是咱們單臺服務器模擬搭建副本集,方便咱們作實驗,在生產環境中,咱們可能有多個服務器,多臺服務器又要如何搭建副本集呢?各位看官繼續向下看。
首先準備好三臺裝好了MongoDB的服務器,地址分別以下:
192.168.248.128 192.168.248.135 192.168.248.136
修改每臺服務器的配置文件mongodb.conf,添加replSet=rs,表示副本集的名稱,修改後的配置文件內容以下:
dbpath=/opt/mongodb/db logpath=/opt/mongodb/logs/mongodb.log port=27017 fork=true replSet=rs
修改完成以後,分別啓動三臺服務器上的MongoDB,啓動成功以後,鏈接上任意一臺的shell,鏈接成功以後,先定義配置文件,以下:
config={_id:"rs",members:[{_id:0,host:"192.168.248.128:27017"},{_id:1,host:"192.168.248.135:27017"},{_id:2,host:"192.168.248.136:27017"}]}
id後面跟着的是副本集的名稱,也就是咱們在mongodb.conf中定義的名稱,後面三個是副本集的成員,定義好以後,再執行以下命令初始化副本集:
rs.initiate(config)
初始化成功以後,咱們就能夠經過rs.status()來查看副本集的狀態,也能夠看到每一個服務器的角色,部分日誌內容以下:
{ "members" : [ { "_id" : 0, "name" : "192.168.248.128:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", }, { "_id" : 1, "name" : "192.168.248.135:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "syncingTo" : "192.168.248.128:27017" }, { "_id" : 2, "name" : "192.168.248.136:27017", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "syncingTo" : "192.168.248.128:27017", } ] }
咱們能夠看到每臺服務器的角色,有primary,也有secondary,secondary上還註明了從哪一個服務器上同步數據。全部這些工做作好以後,咱們就能夠按照上文介紹的方式來測一下這裏的副本集了,測試工做我就再也不重複介紹了。
好了,MongoDB中副本集的搭建咱們就先說到這裏,小夥伴們有問題歡迎留言討論。
參考資料:
1.《MongoDB權威指南第2版》
更多資料請關注公衆號: