本文實例講述了MongoDB 復制(副本集)。分享給大家供大家參考,具體如下:
replication set復制集,
復制集,多臺服務器維護相同的數據副本,提高服務器的可用性。
MongoDB復制是將數據同步在多個服務器的過程。
復制提供了數據的冗余備份,并在多個服務器上存儲數據副本,提高了數據的可用性, 并可以保證數據的安全性。
復制還允許您從硬件故障和服務中斷中恢復數據。
設置過程:
(1)創建示例
假設創建三臺,創建三個實例目錄和日志目錄:
mkdir /home/m17 /home/m18 /home/m19 /home/mlog
啟動三個示例,端口分別為27017、27018、27019。
1
2
3
|
. /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進行配置:
1
|
[ test @localhost bin]$ . /mongo |
要管理配置,所以切換到admin上:
1
|
>use admin |
(配置是json格式)
1
2
3
4
5
6
7
8
|
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
1
2
3
4
5
6
7
8
|
var rsconf = { _id: 'rs2' , members:[ {_id:0,host: '127.0.0.1:27017' }, {_id:1,host: '127.0.0.1:27018' }, {_id:2,host: '127.0.0.1:27019' } ] } |
執行后,使用 printjson(rsconf)查看剛才的配置。
然后執行初始化:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
>rs.initiate(rsconf); > rs.initiate(rsconf); { "ok" : 1, "operationTime" : Timestamp(1539933041, 1), "$clusterTime" : { "clusterTime" : Timestamp(1539933041, 1), "signature" : { "hash" : BinData(0, "AAAAAAAAAAAAAAAAAAAAAAAAAAA=" ), "keyId" : NumberLong(0) } } } rs2:SECONDARY> |
查看節點:
1
|
rs.status() |
刪除節點:
1
|
rs.remove( '127.0.0.1:27019' ) |
添加節點:
1
|
rs.add( '127.0.0.1:27019' ) |
切換節點:
默認是在27017端口,即rs2:PRIMARY>狀態,
退出mongo客戶端命令模式,
切換到另一個端口:
1
|
[ test @localhost bin]$ . /mongo --port=27018, |
即切換到rs2:SECONDARY>狀態。
測試:
在主服務上,創建庫和集合,
1
2
3
4
5
6
|
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默認不允許讀寫:
1
|
>rs.slaveOk(); |
然后就可以看到主服務器創建的庫和集合了。
同理27019也需要執行這個命令才能自動同步和讀寫。
當主服務器27017停掉的時候,
第二個27018就自動變成主服務器master狀態。
但是27019需要再次執行rs.slaveOk()才能自動同步讀寫。
shell腳本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#!/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' , members:[ {_id:0,host: '${IP}:27017' }, {_id:1,host: '${IP}:27018' }, {_id:2,host: '${IP}:27019' } ] } rs.initiate(rsconf) |
希望本文所述對大家MongoDB數據庫程序設計有所幫助。
原文鏈接:https://www.cnblogs.com/gyfluck/p/9816943.html