1. 程式人生 > 資料庫 >MongoDB 複製(副本集)學習筆記

MongoDB 複製(副本集)學習筆記

本文例項講述了MongoDB 複製(副本集)。分享給大家供大家參考,具體如下:

replication set複製集,
複製集,多臺伺服器維護相同的資料副本,提高伺服器的可用性。
MongoDB複製是將資料同步在多個伺服器的過程。
複製提供了資料的冗餘備份,並在多個伺服器上儲存資料副本,提高了資料的可用性, 並可以保證資料的安全性。
複製還允許您從硬體故障和服務中斷中恢復資料。

設定過程:

(1)建立示例

假設建立三臺,建立三個例項目錄和日誌目錄:
mkdir /home/m17 /home/m18 /home/m19 /home/mlog
啟動三個示例,埠分別為27017、27018、27019。

./mongod --dbpath=/home/m17 --logpath=/home/mlog/m17.log --fork --port=27017 --replSet=rs2 --smallfiles
./mongod --dbpath=/home/m18 --logpath=/home/mlog/m18.log --fork --port=27018 --replSet=rs2 --smallfiles
./mongod --dbpath=/home/m19 --logpath=/home/mlog/m19.log --fork --port=27019 --replSet=rs2 --smallfiles

說明:

引數--replSet設定一樣,才能屬於同一個複製集
引數--smallfiles可以節省空間,提高速度。

然後使用ps aux | grep mongo可以檢視到啟動起來的三個埠。

(2)配置

使用客戶端連線mongo進行配置:

[test@localhost bin]$ ./mongo

要管理配置,所以切換到admin上:

>use admin

(配置是json格式)

var rsconf = {
_id:'rs2',members:[
{"_id":0,host:'192.168.8.172:27017'},{_id:1,host:'192.168.8.172:27018'},{_id:2,host:'192.168.8.172:27019'}
]
}

如果沒有配置ip,使用127.0.0.1

var rsconf = {
_id:'rs2',members:[
{_id:0,host:'127.0.0.1:27017'},host:'127.0.0.1:27018'},host:'127.0.0.1:27019'}
]
}

執行後,使用 printjson(rsconf)檢視剛才的配置。

然後執行初始化:

>rs.initiate(rsconf);
> rs.initiate(rsconf);
{
"ok" : 1,"operationTime" : Timestamp(1539933041,1),"$clusterTime" : {
"clusterTime" : Timestamp(1539933041,"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),"keyId" : NumberLong(0)
}
}
}
rs2:SECONDARY>

檢視節點:

rs.status()

刪除節點:

rs.remove('127.0.0.1:27019')

新增節點:

rs.add('127.0.0.1:27019')

切換節點:

預設是在27017埠,即rs2:PRIMARY>狀態,
退出mongo客戶端命令模式,
切換到另一個埠:

[test@localhost bin]$ ./mongo --port=27018,

即切換到rs2:SECONDARY>狀態。

測試:

在主服務上,建立庫和集合,

rs2:PRIMARY> use student
switched to db student
rs2:PRIMARY> db.user.insert({uid:1,name:'zhang san'})
WriteResult({ "nInserted" : 1 })
rs2:PRIMARY> db.user.find();
{ "_id" : ObjectId("5bc9889f85a0986431fd2499"),"uid" : 1,"name" : "zhang san" }

去從服務上檢視

show dbs

然後看到有錯誤,具體錯誤資訊是:

...
"errmsg" : "not master and slaveOk=false",
...

是因為slave預設不允許讀寫:

>rs.slaveOk();

然後就可以看到主伺服器建立的庫和集合了。

同理27019也需要執行這個命令才能自動同步和讀寫。

當主伺服器27017停掉的時候,
第二個27018就自動變成主伺服器master狀態。
但是27019需要再次執行rs.slaveOk()才能自動同步讀寫。

shell指令碼:

#!/bin/bash
IP=127.0.0.1
NA=rs2
sudo mkdir -p /home/m17 /home/m18 /home/m19 /home/mlog
sudo chmod -R 777 /home/m17 /home/m18 /home/m19 /home/mlog
./mongod --dbpath=/home/m17 --logpath=/home/mlog/m17.log --fork --port=27017 --replSet=${NA} --smallfiles
./mongod --dbpath=/home/m18 --logpath=/home/mlog/m18.log --fork --port=27018 --replSet=${NA} --smallfiles
./mongod --dbpath=/home/m19 --logpath=/home/mlog/m19.log --fork --port=27019 --replSet=${NA} --smallfiles
./mongo <<EOF
use admin
var rsconf = {
_id:'rs2',host:'${IP}:27017'},host:'${IP}:27018'},host:'${IP}:27019'}
]
}
rs.initiate(rsconf)

希望本文所述對大家MongoDB資料庫程式設計有所幫助。