MongoDB副本集搭建

咱們以前的案例都是在單個節點上實現的,在生產環境中這種作法是有風險的,若是服務宕機、崩潰或者硬盤壞了都會對公司業務形成損失,所以咱們須要數據備份。在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版》

更多資料請關注公衆號:

圖片描述

相關文章
相關標籤/搜索