MongoDB 數據遷移和同步
MongoDB的數據同步
復制
mongodb的復制至少需要兩個實例。其中一個是主節點master,負責處理客戶端請求,其余的都是slave,負責從master上復制數據。
master寫處理:
master負責接收寫請求,具體的流程為:
- 如果開啟journal功能,則先將寫請求記錄到journal中,然后批量執行,同時將操作記錄到oplog中;
- 如果未開啟journal功能,則對每個寫請求進行單獨操作,然后寫入oplog。
注:oplog是冪等的,當有累加操作inc時,會記錄成set操作,從而無論重復執行多少次操作獲得的結果都是一樣的。
從節點同步:
- 如果是一個新的從節點,首先先從master的數據庫文件進行復制,同時記錄起始時間;當從節點從master的復制完成后,會根據復制的起始時間開始追oplog,進而與master進行同步。
- 初始化同步完成后的slave定期從master的oplog中獲取最新的操作,然后對自己的數據副本執行這些操作,從而保證slave的數據與master最終一致性。
注意:當slave同步的速度趕不上master更新的速度時,oplog會因為追加了過多的操作而發生將舊記錄覆蓋掉,這樣slave可能無法保證同步所有的數據,這時,slave會開始從頭重新同步。
MongoDB的主從同步
原理
主從復制是MongoDB最常用的復制方式,這種方式很靈活,可用於備份、故障恢復和讀擴展等。需要在啟動進程時指定master和slave,slave要指定master的地址,這種方式沒有自動故障轉移功能。
默認情況下,slave既不能寫也不能讀,但可以通過配置將slave改為可讀模式,從而做到讀寫分離,提高系統性能。
操作
操作可以選擇兩種方式:命令行和配置文件。
命令行
master啟動命令
# mongod --config /etc/mongodb.conf --master
slave啟動命令
# mongod --config /etc/mongodb.conf --slave --autoresync --slavedelay=10 --source master-ip:master-port
配置
master配置:
master = true
slave配置:
slave = true
autoresync = true
slavedelay = 10
選項
-
-only
在從節點上指定只復制特定的某個數據庫(默認是復制所有數據庫)。 -
-slavedelay
用在從節點上,當應用主節點的操作時,從節點增加延時復制(單位秒)。這樣就能輕松設置延時從節點,這種節點對用戶無意中刪除重要文檔或者插入垃圾數據等有防護作用,這些不良操作都會被復制到所有的從節點上,通過延時執行操作,可以有個恢復的時間差。 -
-fastsync
以主節點的數據快照為基礎啟動從節點。如果數據目錄一開始是主節點的數據快照,從節點用這個選項啟動要比做完整的同步快的多。 -
-autoresync
如果從節點與主節點不同步了,則自動重新同步。 -
-oplogsize
主節點oplog的大小(單位MB)。默認的oplog大小是剩余磁盤空間的5%。
MongoDB副本集
原理
副本集(Replica Set)就是有自動故障恢復功能的主從集群。主從集群和副本集最明顯的區別是副本集沒有固定的”主節點”,整個集群會選舉出一個”主節點”,當其不能工作時則變更到其他節點.副本集總會有一個活躍節點(primary)和一個或多個備份節點(secondary)。
副本集可以在活躍節點有問題時自動切換。
節點類型
任何時間,集群中只有一個活躍節點,其他的都是備份節點.活躍節點實際上是活躍服務器,指定的活躍節點可以隨時間而改變。
有幾種不同類型的節點可以存在與副本集中:
-
standard 標准節點
這是常規節點,它存儲一份完整的數據副本,參與選舉投票有可能成為活躍節點。 -
passive 被動結點
存儲了完整的數據副本,參與投票,不能成為活躍節點。 -
arbiter 仲裁者
仲裁者只能參與投票,不接收復制的數據,也不能成為活躍節點。
優先級
每個參與節點(非仲裁)有優先權,優先權按照優先值從大到小,默認優先級為1,可以是0-1000(含)。
在節點配置中修改priority鍵,來配置標准節點或者被動節點。
> members.push({"_id":3,"host":"127.0.0.1:10002","priority":40})
“arbiterOnly”鍵可以指定仲裁節點
> members.push({"_id":4,"host":"127.0.0.1:10003","arbiterOnly":true})
備份節點會從活躍節點抽取oplog,並執行操作,就像活躍備份系統中的備份服務器一樣.活躍節點也會寫操作到自己的本地oplog.oplog中的操作包含嚴格遞增的序號,這個序號來判定數據的時效性。
選舉策略
如果活躍節點出現故障,其余節點會選一個新的活躍節點.選舉過程可以由任何非活躍節點發起,新的活躍節點由副本集中的大多數選舉產生。其中仲裁節點也參與選舉,避免出現僵局。新的活躍節點將是優先級最高的節點,優先級相同則數據較新的節點獲勝。
不論活躍節點何時變化,新的活躍節點的數據就被假定為系統的最新數據。對其他幾點(原來的活躍節點)的操作都會回滾,即便是之前的活躍節點已經恢復工作了。為了完成回滾,所有節點連接新的活躍節點后重新同步。這些節點會查看自己的oplog,找出活躍節點沒有的操作,然后向活躍節點請求這些操作影響的文檔最新副本。正在執行重新同步的節點被視為恢復中,在完成這個過程之前不能成為活躍節點的候選者。
操作
命令行初始化操作
設置副本集比設置主從集群稍微復雜一點。
先給副本集起個名稱,是為了易於與別的副本集區分,也是為了方便將整個集合視為一個整體,這里取名:refactor
啟動服務器–replSet的作用是讓服務器知道這個“refactor”副本集還有別的同伴,位置在 refactor/127.0.0.1:10001
# mongod --dbpath /data1/mongodb --port 10000 --replSet refactor/127.0.0.1:10001 --logpath /data1/log/mongodb/mongodb.log --rest
以同樣的方式啟動另一台:
# mongod --dbpath /data1/mongodb --port 10001 --replSet refactor/127.0.0.1:10000 --logpath /data1/log/mongodb/mongodb.log --rest
如果想要添加第三台,兩種方式:
# mongod --dbpath /data1/mongodb --port 10002 --replSet refactor/127.0.0.1:10000 --logpath /data1/log/mongodb/mongodb.log --rest
注:副本集有自動檢測功能:在其中指定單台服務器后,MongoDB就會自動搜索並連接其余的節點。
mongo內部命令初始化操作
> use admin
> db.runCommand(
{
"replSetInitiate":
{
"_id":"refactor",//副本集的名稱
"members"://副本集中的服務器列表
[
{
"_id":1,//每個服務器的唯一id
"host":"127.0.0.1:10000"//指定服務器的主機
},
{
"_id":2,
"host":"127.0.0.1:10001"
}
]
}
}
)
>
MongoDB的數據遷移
mongodump & mongorestore
MongoDB數據備份
在Mongodb中我們使用mongodump命令來備份MongoDB數據。該命令可以導出所有數據到指定目錄中。
mongodump命令可以通過參數指定導出的數據量級轉存的服務器。
語法
mongodump命令腳本語法如下:
# mongodump -h dbhost -d dbname -o dbdirectory
- -h:
目標MongDB所在服務器地址,例如:127.0.0.1,當然也可以指定端口號:127.0.0.1:27017 - -d:
需要備份的數據庫實例,例如:test - -o:
備份的數據存放位置,例如:/data/mongodb/backup,當然該目錄需要提前建立,在備份完成后,系統自動在dump目錄下建立一個test目錄,這個目錄里面存放該數據庫實例的備份數據。
MongoDB數據恢復
mongodb使用 mongorerstore 命令來恢復備份的數據。
語法
mongorestore命令腳本語法如下:
# mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
- -h:
MongoDB所在服務器地址 - -d:
需要恢復的數據庫實例,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2 - -directoryperdb:
備份數據所在位置,例如:c:\data\dump\test,這里為什么要多加一個test,而不是備份時候的dump,讀者自己查看提示吧! - -drop:
恢復的時候,先刪除當前數據,然后恢復備份的數據。就是說,恢復后,備份前添加修改的數據都會被刪除,慎用!
日志
系統日志
系統日志在Mongdb數據中很中重要,它記錄mongodb啟動和停止的操作,以及服務器在運行過程中發生的任何異常信息。
配置路徑:
# mongod --logpath='/data/db/log/server.log' -logappend
journal日志
Jouranl日志通過預寫入的redo日志為mongodb增加了額外的可靠性保障。開啟該功能時候,數據的更新就先寫入Journal日志,定期集中提交(目前是每100ms提交一次) ,然后在正式數據執行更改。
打開方式:
# mongod --journal
oplog日志
Mongodb的高可用復制策略有一個叫做Replica Sets.ReplicaSet復制過程中有一個服務器充當主服務器,而一個或多個充當從服務器,主服務將更新寫入一個本地的collection中,這個collection記錄着發生在主服務器的更新操作,並將這些操作分發到從服務器上。這個日志是Capped Collection。
注:Capped Collections 是性能出色的有着固定大小的集合,以LRU(Least Recently Used 最近最少 使用)規則和插入順序進行 age-out(老化移出)處理,自動維護集合中對象的插入順序,在創建時要預先指定大小。
# mongod --oplogSize=1024 #單位是M
slow日志
慢查詢記錄了執行時間超過了所設定時間閥值的操作語句。慢查詢日志對於發現性能有問題的語句很有幫助,建議開啟此功能並經常分析該日志的內容。
要配置這個功能只需要在mongod啟動時候設置profile參數即可。例如想要將超過5s的操作都記錄,可以使用如下語句:
# mongod --profile=1 --slowms=5
