日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
MongoDB數(shù)據(jù)庫的備份與恢復(fù)詳解

MongoDB是怎么實(shí)現(xiàn)數(shù)據(jù)的備份與恢復(fù),故障切換以及數(shù)據(jù)庫服務(wù)器的負(fù)載均衡等功能的呢?本文我們就介紹這些知識。

成都創(chuàng)新互聯(lián)于2013年創(chuàng)立,先為硚口等服務(wù)建站,硚口等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為硚口企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

備份與恢復(fù)

在創(chuàng)建MongoDB服務(wù)的時候,通過--dbpath指定目錄就是存放mongdb數(shù)據(jù)庫文件目錄,我們可以通過復(fù)制這些文件實(shí)現(xiàn)數(shù)據(jù)庫的冷備,但是這種方式不太安全。因此在冷備前,要關(guān)閉服務(wù)器,這個在第一節(jié)中介紹過平滑關(guān)閉server的命令。

 
 
 
 
  1. >use admin
  2. >db.shutdownServer()

或者可以通過fsync方式使MongoDB將數(shù)據(jù)寫入緩存中,然后再復(fù)制備份

 
 
 
 
  1. >use admin
  2. >db.runCommand({"fsync":1,"lock":1})

這個時候我往test.foo 插入了一條數(shù)據(jù) f:6 ,在執(zhí)行db.foo.find()后,并沒有查到這條記錄,說明記錄沒有直接寫入數(shù)據(jù)庫,而是被緩沖到緩存中了。

備份完后,要解鎖(防止這個時候停電或其它原因,導(dǎo)致未緩存中的數(shù)據(jù)丟失)。

 
 
 
 
  1. >use admin
  2. >db.$cmd.sys.unlock.findOne()
  3. >db.currentOp()    如果currentOp 只返回{"inprog":[]}結(jié)果,說明解鎖成功。

解鎖后,緩存中的數(shù)據(jù)會寫入數(shù)據(jù)庫文件中,我們?nèi)ゲ樵僨oo結(jié)果。

上面是冷備的方式,我們可以在不停止服務(wù)的情況下,使用MongoDB提供的兩個工具來實(shí)現(xiàn)備份和恢復(fù)。這個兩個工具在MongoDB的bin目錄下可以看到:mongodump.exe/mongorestor.exe

mongodump.exe備份的原理是通過一次查詢獲取當(dāng)前服務(wù)器快照,并將快照寫入磁盤中,因此這種方式保存的也不是實(shí)時的,因?yàn)樵讷@取快照后,服務(wù)器還會有數(shù)據(jù)寫入,為了保證備份的安全,同樣我們還是可以利用fsync鎖使服務(wù)器數(shù)據(jù)暫時寫入緩存中。

備份命令:

 
 
 
 
  1. ......bin>mongodump -d test -o backup            //( backup是備份目錄,默認(rèn)創(chuàng)建到bin目錄)

恢復(fù)命令: (可以在恢復(fù)前往foo表插入一條記錄 g:7)

 
 
 
 
  1. .....bin>mongorestore -d test --drop backup/test/

看一下運(yùn)行結(jié)果:

以上就是mongodb的備份和恢復(fù)過程。當(dāng)數(shù)據(jù)庫文件出現(xiàn)問題或者損壞時,MongoDB還提供了修復(fù)數(shù)據(jù)文件的命令。

在啟動mongod服務(wù)時通過--repair 修改:

 
 
 
 
  1. ....bin>mongod --dbpath "C:\Program Files\mongodb\data\dbs\master"  --repair 

另外我們也可以在mongo shell 中修復(fù)正在運(yùn)行的數(shù)據(jù)庫存

 
 
 
 
  1. >use test
  2. >db.repairDataBase()

#p#

接下來我們在來看一下另外二種讀擴(kuò)展式的備份機(jī)制。

Master-Slave

主從復(fù)制模式:即一臺主寫入服務(wù)器,多臺從備份服務(wù)器。從服務(wù)器可以實(shí)現(xiàn)備份,和讀擴(kuò)展,分擔(dān)主服務(wù)器讀密集時壓力,充當(dāng)查詢服務(wù)器。但是主服務(wù)器故障時,我們只能手動去切換備份服務(wù)器接替主服務(wù)器工作。這種靈活的方式,使擴(kuò)展多如備份或查詢服務(wù)器相對比較容易,當(dāng)然查詢服務(wù)器也不是無限擴(kuò)展的,因?yàn)檫@些從服務(wù)器定期在輪詢讀取主服務(wù)器的更新,當(dāng)從服務(wù)器過多時反而會對主服務(wù)器造成過載。

我們以之前創(chuàng)建的端口為27017做為主服務(wù)器,再創(chuàng)建個端口為27018從服務(wù)器

重新啟動27017為主服務(wù)器 --master 主服務(wù)器

 
 
 
 
  1. ....bin>mongod  --dbpath "C:\Program Files\mongodb\data\dbs\master" --master

創(chuàng)建27018為從服務(wù)器  --slave 從服務(wù)器  --source 指定主服務(wù)器

 
 
 
 
  1. ....bin>mongod --port 27018 --dbpath "C:\Program Files\mongodb\data\dbs\slave27018"   --slave --source localhost:27017

主服務(wù)器可以通過自己local庫的slave集合查看從服務(wù)器列表

從服務(wù)器可以通過自己local庫的source集合查看主服務(wù)器信息或維護(hù)多個主服務(wù)器。 (一個slave服務(wù)器可以服務(wù)多個master服務(wù)器)

或者我們可以通過http console查看狀態(tài)

Replica Sets

副本集模式:具有Master-Slave模式所有特點(diǎn),但是副本集沒有固定的主服務(wù)器,當(dāng)初始化的時候會通過多個服務(wù)器投票選舉出一個主服務(wù)器。當(dāng)主服務(wù)器故障時會再次通過投票選舉出新的主服務(wù)器,而原先的主服務(wù)器恢復(fù)后則轉(zhuǎn)為從服務(wù)器。Replica Sets的在故障發(fā)生時自動切換的機(jī)制可以極時保證寫入操作。

創(chuàng)建多個副本集節(jié)點(diǎn) --replSet   (注意要區(qū)分大小寫,官方建議命名空間使用IP地址)

 
 
 
 
  1. ....bin>mongod --dbpath "C:\Program Files\mongodb\data\dbs\replset27017"   --port 27017 --replSet replset/127.0.0.1:27018
  2. ....bin>mongod --dbpath "C:\Program Files\mongodb\data\dbs\replset27018"   --port 27018 --replSet replset/127.0.0.1:27017
  3. ....bin>mongod --dbpath "C:\Program Files\mongodb\data\dbs\replset27019"   --port 27019 --replSet replset/127.0.0.1:27017

首先建立3個是為了投票不會沖突,當(dāng)服務(wù)器為偶數(shù)時可能會導(dǎo)致無法正常選舉出主服務(wù)器。

其次上面3個replset 節(jié)點(diǎn)沒有全部串聯(lián)起來,是因?yàn)閞eplset 有自檢測功可以自動搜索連接其它服務(wù)器。

完成上面的工作后,要初始化副本集,隨便連接一臺服務(wù)器執(zhí)行以下命令 (priority 0~1,被選為主服務(wù)器的優(yōu)先級)

 
 
 
 
  1. >use admin
  2. >db.runCommand(
  3. {"replSetInitiate":{
  4.  "_id":"replset",
  5.  "members":[
  6. {
  7. "_id":1,
  8. "host":"127.0.0.1:27017",
  9. "priority":1
  10. },
  11. {
  12. "_id":2,
  13. "host":"127.0.0.1:27018",
  14. "priority":1
  15. },
  16. {
  17. "_id":3,
  18. "host":"127.0.0.1:27019",
  19. "priority":1
  20. }]}}
  21. )

查看結(jié)果,可以看出127.0.0.1:27017 被自動選為replSet:Primary>

在增加一個從服務(wù)器節(jié)點(diǎn)

 
 
 
 
  1. ....bin>mongod --dbpath "C:\Program Files\mongodb\data\dbs\replset27020" --port 27020 --replSet replset/127.0.0.1:27017

通過rs.add命令往system.replset添加新的從服務(wù)器成員

 
 
 
 
  1. rs.add("127.0.0.1:27020");   或者rs.add({"_id":4,"host":"127.0.0.1:27020"}) 

這里在簡單的介紹一下Master Slave/ Replica Sets 備份機(jī)制,這兩種模式都是基于主服務(wù)器的oplog 來實(shí)現(xiàn)所有從服務(wù)器的同步。

oplog記錄了增刪改操作的記錄信息(不包含查詢的操作),但是oplog有大小限制,當(dāng)超過指定大小,oplog會清空之前的記錄,重新開始記錄。

Master Slave方式主服備器會產(chǎn)生 oplog.$main 的日志集合。

Replica Sets  方式 所有服務(wù)器都會產(chǎn)生oplog.rs 日志集合。

兩種機(jī)制下,所有從服務(wù)器都會去輪詢主服務(wù)器oplog日志,若主服務(wù)器的日志較新,就會同步這些新的操作記錄。但是這里有個很重要的問題,從服務(wù)器由于網(wǎng)絡(luò)阻塞,死機(jī)等原因無法極時同步主服務(wù)器oplog記錄:一種情況 主服務(wù)器oplog不斷刷新,這樣從服務(wù)器永遠(yuǎn)無法追上主服務(wù)器。另外一種情況,剛好主服務(wù)器oplog超出大小,清空了之前的oplog,這樣從服務(wù)器就與主服務(wù)器數(shù)據(jù)就可能會不一致了,這第二種情況,我是推斷的,沒有證實(shí)。

另外要說明一下Replica Sets 備份的缺點(diǎn),當(dāng)主服務(wù)器發(fā)生故障時,一臺從服務(wù)器被投票選為了主服務(wù)器,但是這臺從服務(wù)的oplog 如果晚于之前的主服務(wù)器oplog的話,那之前的主服務(wù)器恢復(fù)后,會回滾自己的oplog操作和新的主服務(wù)器oplog保持一致。由于這個過程是自動切換的,所以在無形之中就導(dǎo)致了部分?jǐn)?shù)據(jù)丟失。

關(guān)于MongoDB備份與恢復(fù)的知識就介紹到這里了,希望能夠帶給您收獲。


網(wǎng)頁名稱:MongoDB數(shù)據(jù)庫的備份與恢復(fù)詳解
分享URL:http://www.5511xx.com/article/dhscdsc.html