標籤:
mongoDB的兩個特性主從複製和複本集,實現了資料的同步備份
一、主從複製
主從複製是一個簡單的資料庫同步備份的叢集技術.例如主伺服器宕機了,可以直接使用從伺服器,主伺服器恢複後在進行同步,保證了業務的連續性
注意點:
- 主伺服器只有一台
- 從伺服器需要知道自己的資料來源,也就是對應的主伺服器
- --master確定主伺服器,--slave和--source來控制從伺服器
1.舉例:
1).主伺服器的連接埠是60000
2).從伺服器的連接埠是60001
如何配置主從複製?
主伺服器的配置:
dbpath = D:\MongoDBMSCopy\Master 主要資料庫地址
port = 60000 主要資料庫連接埠號碼
bind_ip = 127.0.0.1 主要資料庫所在伺服器
master = true 確定我是主伺服器
從伺服器的配置
dbpath = D:\MongoDBMSCopy\Slave 從資料庫地址
port = 60001 從資料庫連接埠號碼
bind_ip = 127.0.0.1 從資料庫所在伺服器
source = 127.0.0.1:60000 確定我資料庫連接埠
slave = true 確定自己是從伺服器
設定檔寫好之後,就可以通過命令來啟動主從伺服器了,
如下:
啟動主伺服器
C:\Windows\system32>mongod --config D:\MongoDBMSCopy\Master\Master.conf
啟動從伺服器
C:\Windows\system32>mongod --config D:\MongoDBMSCopy\Slave\slave.conf
驗證是否進行了複製
①開啟cmd,串連主伺服器,並建立一個Students資料庫,插入一個文檔名為Students
查看一下資料
> db.students.find()
{ "_id" : 1, "name" : "BigOrange", "age" : 25 }
②開啟cmd串連從伺服器
如所示,證明已經進行了複製
2.主從複製的其他設定項
--only 從節點→指定複製某個資料庫,預設是複製全部資料庫
--slavedelay 從節點→設定主要資料庫同步資料的延遲(單位是秒)
--fastsync 從節點→以主要資料庫的節點快照為節點啟動從資料庫
--autoresync 從節點→如果不同步則從新同步資料庫
--oplogSize 主節點→設定oplog的大小(主節點操作記錄儲存到local的oplog中)
3.利用shell動態添加和刪除從節點
在從資料庫中的local資料庫會多一個sources文檔,它儲存著主伺服器的資訊
如何進行動態添加從節點呢,和正常的添加資料的操作一樣,直接通過insert插入remove刪除
掛接主節點:
db.sources.insert({“host”:”127.0.0.1:60000”})
刪除已經掛接的主節點:
db.sources.remove({“host”:”127.0.0.1:60000”})
二、複本集
第一張圖表明A是活躍的B和C是用於備份的
第二張圖當A出現了故障,這時候叢集根據權重演算法推選出B為活躍的資料庫
第三張圖當A恢複後他自動又會變為備份資料庫
例:如何配置一個複本集伺服器叢集
1.假如有上面ABC三台伺服器,如何進行配置呢,同樣需要修改設定檔
對於A伺服器:
dbpath = D:\MongoDBCopy\A\MongoDB_A.conf #A的配置
port=11111 #連接埠號碼
bind_ip=127.0.0.1 #IP地址
replSet = child/127.0.0.1:22222 #設定同伴,這裡是B
對於B伺服器:
dbpath = D:\MongoDBCopy\B\MongoDB_B.conf #A的配置
port=22222 #連接埠號碼
bind_ip=127.0.0.1 #IP地址
replSet = child/127.0.0.1:33333 #設定同伴,這裡是C
對於C伺服器:
dbpath = D:\MongoDBCopy\C\MongoDB_C.conf #A的配置
port=33333 #連接埠號碼
bind_ip=127.0.0.1 #IP地址
replSet = child/127.0.0.1:11111 #設定同伴,這裡是A
2.初始化複本集
使用shell進入一台伺服器,然後設定初始化複本集
use admin db.runCommand({"replSetInitiate":
{ "_id":‘child‘, "members":[{ "_id":1, "host":"127.0.0.1:11111" },{ "_id":2, "host":"127.0.0.1:22222" },{ "_id":3, "host":"127.0.0.1:33333" }] }
})
哪個節點成為活躍節點,這時候是隨機的,如果想要更準確的設定,需要設定權重
3.查看複本集狀態
rs.status()
可以看到,連接埠為11111的伺服器被選擇為活躍伺服器
注意:
備份點不能進行查詢操作的,只有活躍點才能進行查詢操作
①在活躍伺服器上添加一個資料庫並添加一個文檔
child:PRIMARY> show dbs
admin (empty)
local 4.076GB
child:PRIMARY> use Students
switched to db Students
child:PRIMARY> db.student.insert({name:"BigOrange",age:25})
WriteResult({ "nInserted" : 1 })
child:PRIMARY> db.student.find()
{ "_id" : ObjectId("56fa6b9159b5751566c1c37f"), "name" : "BigOrange", "age" : 25
}
child:PRIMARY>
②切換到其中一個備份伺服器,發現不能進行查詢
C:\Windows\system32>mongo 127.0.0.1:22222/test
MongoDB shell version: 2.6.5
connecting to: 127.0.0.1:22222/test
child:SECONDARY> show dbs
Students 0.078GB
admin (empty)
local 2.077GB
child:SECONDARY> use Students
switched to db Students
child:SECONDARY> show collections
2016-03-29T19:50:09.064+0800 error: { "$err" : "not master and slaveOk=false", "
code" : 13435 } at src/mongo/shell/query.js:131
child:SECONDARY> db.student.find()
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
child:SECONDARY>
補充:
節點和初始化進階參數
standard 常規節點:參與投票有可能成為活躍節點
passive 副本節點:參與投票,但是不能成為活躍節點
arbiter 仲裁節點:只是參與投票不複製節點也不能成為活躍節點
進階參數
Priority 0到1000之間 ,0代表是副本節點 ,1到1000是常規節點
arbiterOnly : true 仲裁節點
用法
把上面A設定為仲裁節點
其他的不變,在初始化的時候,寫成如下
use admindb.runCommand({"replSetInitiate":{ "_id":‘child‘, "members":[{ "_id":1, "host":"127.0.0.1:11111", arbiterOnly : true },{ "_id":2, "host":"127.0.0.1:22222", },{ "_id":3, "host":"127.0.0.1:33333" }] }})
其他使用可以參考如下
http://blog.itpub.net/29254281/viewspace-1176553/
4.讀寫分離操作→擴充讀
設定讀寫分離
slaveOkay : true
MongoDB的主從複製和複本集