MongoDB三節點副本集搭建

 

 

 

一個副本集的最小結構有用三個成員。一個三個成員的副本集可以有三個成員保存數據,或者有兩個保存,一個爲監督者。副本集應始終具有奇數個成員。這確保選舉順利進行。

主節點和兩個從節點

主節點和一個從節點一個監督者節點

三個保存數據的副本集成員

擁有:

  • 一個主節點
  • 兩個從節點。兩個從節點都有可能在選舉中成爲主節點。

這裏寫圖片描述

這樣部署提供了除了主節點兩個數據集的完整全時拷貝。這個副本集提供了額外的容錯和高可用性,如果主節點不可用了,副本集會選舉一個從節點成爲主節點然後繼續運行下去。當原來的主節點可用時會重新加入到副本集中。

這裏寫圖片描述

一個主節點和一個從節點和監督者成員

一個擁有兩個保存數據成員的副本集擁有:

  • 一個主節點
  • 一個從節點。 從節點可以再選舉中成爲主節點。
  • 一個監督者成員。監督者只能在選舉中投票。

這裏寫圖片描述

因爲監督者沒有保存數據的拷貝,這樣部署只提供了疑問數據完整的備份。監督者只佔有極少的資源,犧牲了額外的冗餘和容錯性。

但是,部署一個主節點、從節點、監督者成員在主節點或從節點不可用時保證了副本集的可用性。如果主節點不可用了,副本集會選舉從節點成爲主節點。

這裏寫圖片描述

 

搭建副本集

1、環境

一個服務器上模擬mongodb的兩種三個成員副本集

1
2
3
4
5
6
7
8
172.17.39.186:27017  PRIMARY
172.17.39.186:27018  SECONDARY
172.17.39.186:27019  SECONDARY
 
或者<br>
172.17.39.186:27017  PRIMARY
172.17.39.186:27018  SECONDARY
172.17.39.186:27019  arbitrate

  

2、下載與安裝的MongoDB

進入官網,選擇社區服務器進行下載

https://www.mongodb.com/download-center?jmp=nav#community

或者可以直接

1
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.2.tgz

 

3、解壓改名

1
2
3
# mkdir -p /data/mongodb
# tar xvf mongodb-linux-x86_64-rhel70-4.0.2.tgz -C /data/mongodb/
# mv mongodb-linux-x86_64-rhel70-4.0.2  mongodb1

  

4、在mongodb1的文件夾下新建data,log和conf文件夾

1
2
# cd mongodb
# mkdir {data,log,conf}

 

5、將mongodb1複製爲mongodb2,mongodb3

1
2
3
4
5
6
7
# cp -ra mongodb1 mongodb2
# cp -ra mongodb1 mongodb3
# ll
total 12
drwxr-xr-x 6 root root 4096 Sep 26 16:31 mongodb1
drwxr-xr-x 6 root root 4096 Sep 26 16:31 mongodb2
drwxr-xr-x 6 root root 4096 Sep 26 16:31 mongodb3

 

6、在三個文件夾的conf文件夾下編寫配置文件“vi mongodb.conf”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# cat mongodb1/conf/mongodb.conf
port=27017
bind_ip=172.17.39.186
logappend=true
dbpath=/data/mongodb/mongodb1/data/
logpath=/data/mongodb/mongodb1/log/r1.log
fork=true
oplogSize=2048
smallfiles=true
replSet=dbset
 
 
# cat mongodb2/conf/mongodb.conf
port=27018
bind_ip=172.17.39.186
logappend=true
dbpath=/data/mongodb/mongodb2/data/
logpath=/data/mongodb/mongodb2/log/r2.log
fork=true
oplogSize=2048
smallfiles=true
replSet=dbset
 
 
# cat mongodb3/conf/mongodb.conf
port=27019
bind_ip=172.17.39.186
logappend=true
dbpath=/data/mongodb/mongodb3/data/
logpath=/data/mongodb/mongodb3/log/r3.log
fork=true
oplogSize=2048
smallfiles=true
replSet=dbset

參數:

port = 27017 #mongodb端口

logappend = true#以追加的方式記錄日誌

dbpath = / usr / local / mongodb1 / data / master#數據存放目錄

logpath = / usr / local / mongodb1 / log / master.log#日誌存放目錄

fork = true#後臺運行

oplogSize = 2048#同步操作記錄文件大小(MB)

smallfiles = true#使用較小的默認文件

replSet = dbset#副本集名稱,同一個副本集,名稱必須一致 

 

7、啓動

1
2
3
/data/mongodb/mongodb1/bin/mongod -f /data/mongodb/mongodb1/conf/mongodb.conf
/data/mongodb/mongodb2/bin/mongod -f /data/mongodb/mongodb2/conf/mongodb.conf
/data/mongodb/mongodb3/bin/mongod -f /data/mongodb/mongodb3/conf/mongodb.conf

  

8、登陸,進入你想成爲master的那臺機器,進入mongodb客戶端,在想成爲master的mongodb的bin目錄下輸入“./mongo -port 對應端口”(mongo指令中不輸入port默認爲27017端口)

1
/data/mongodb/mongodb3/bin/mongo 172.17.39.186:27017

 

9、接下來配置副本集,第一個id是副本集名稱

9.1 

注意:這裏配置的是有兩個保存數據,一個爲監督者

1
config={_id : 'dbset',members : [{_id : 1, host : '127.0.0.1:27017'},{_id : 2, host : '127.0.0.1:27018'}]}

回車鍵輸出

  

接下來初始化副本集配置,在客戶端內輸入“rs.initiate( config )”

1
rs.initiate( config )

添加仲裁服務器,在客戶端輸入“rs.addArb("127.0.0.1:27019") ”

1
rs.addArb("127.0.0.1:27019")

可以通過查看副本集狀態(輸入“rs.status()”),查看三個mongodb的狀態

1
rs.status()

此時副本集已搭建完成。

 

9.2

注意:這裏配置的是三個保存數據的副本集成員,就不再截圖說明了

1
2
3
4
5
6
> config={_id : 'dbset',members : [{_id : 1, host : '172.17.39.186:27017'},{_id : 2, host : '172.17.39.186:27018'},{_id : 3, host : '172.17.39.186:27019'}]}
回車鍵輸出
> rs.initiate( config )
> rs.status()
 
此時副本集已搭建完成。

 

mongodb副本集測試

1、在master的mongodb上新建test,並插入集合acc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# ./mongo 172.17.39.186:27017
 
.......<br>
dbset:PRIMARY> use test
switched to db admin
db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
WriteResult({ "nInserted" : 1 })
dbset:PRIMARY> show tables
acc
dbset:PRIMARY> db.acc.find()
"_id" : ObjectId("5bab55810630ebfb7b618f6a"), "AccountID" : 1, "UserName" "123""password" "123456" }
 
dbset:PRIMARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
dbset:PRIMARY>

2、在從節點的mongodb查看是否完成複製  

# ./mongo 172.17.39.186:27018
dbset:SECONDARY> use test
dbset:SECONDARY> show tables

mongodb默認是從主節點讀寫數據的,副本節點上不允許讀,需要設置rs.slaveOk() ,副本節點可以讀。

複製代碼
dbset:SECONDARY> rs.slaveOk() 
dbset:SECONDARY> show dbs;
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
dbset:SECONDARY> db.acc.find()
複製代碼

 

3、主從替換:

通過模擬主節點宕機來檢驗主從替換,以通過殺死指令殺死主進程來達到宕機效果

當主宕機後訪問27018(從節點)端口,可以看到該端口對應的mongodb變成了主節點,以及當執行rs.status()命令時,顯示27017端口的mongodb的狀態爲不可達/健康

 

 

 過程中用過的命令

1
2
3
4
5
6
7
8
9
10
/data/mongodb/bin/mongod --dbpath /data/mongodbtest/replset/data   --replSet repset
 
如果想移除某一個節點
rs.remove("127.0.0.1:27018")
這個不能刪除主節點
 
 
rs.reconfig()
 
db.getMongo().setSlaveOk()

  

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章