在對MongoDB使用的過程中,總結了幾種常用的備份、恢復、同步的方式。
1、冷拷貝
這種方式對數據同步的完整性保持的最好,同時也非常方便,但是會影響服務器的使用。
首先關閉源數據庫服務,之后使用遠程復制命令將數據文件全量拷貝到目標服務器的數據目錄下,再啟動目標服務器。
如果不關閉源數據庫,將會導致部分數據沒有寫到數據文件中,有很大概率目標服務器無法啟動。
2、使用mongodump
mongodump是mongodb官方提供的導出工具,使用起來非常簡單,一個例子如下
mongodump --host example.net --port 37017 -o /opt/backup/mongodump -d dbname -c collectionname
通過host port參數指定主機,通過o參數指定輸出目錄,通過d參數指定數據庫,通過c參數指定集合
mongodump會自動建立備份目錄,並按照數據庫,集合划分目錄與文件。
對應的,官方還提供了mongorestore程序來恢復備份,命令類似於mongodump。使用相同的參數指定主機,數據庫,集合等信息,最后一個參數默認為用來恢復的數據文件目錄即可。
還有幾個需要注意的問題:
mognodb不會導出索引數據,所以在恢復后需要重新建立索引。
備份過程中所做的修改可能無法寫入到備份文件中,如果需要同步這一些數據,可以使用--oplog參數記錄過程中的修改日志,同時需要服務器為副本集或主從模式,否則數據庫不會產生oplog。
3、增量備份
當數據庫為副本集的主節點或主從模式的主節點時,將會生成操作日志,mongodb會使用操作日志對各節點中的數據進行增量同步。
利用這一點,我們也可以對集群之外的節點做同樣的增量同步。
oplog數據存儲在數據庫的local數據庫下。
主要字段如下
名稱 | 說明 |
ts | 操作的時間戳,8字節,mongodb自身的時間戳格式 |
op | 操作類型,包括:i插入,u更新,d刪除,c數據庫命令,n無操作 |
ns | 數據庫與集合名稱 |
h | 操作的唯一id
|
o | 操作的內容 |
o2 | 更新時的條件 |
有了這些信息,我們就可以用代碼模擬mongodb的同步模式,對操作日志實現重播,從而實現數據的增量同步。
基本代碼邏輯如下:
ns = oplog['ns']
index = ns.find('.')
dbname = ns[0:index]
collname = ns[index + 1:]
op = oplog['op']
if op == 'i': # insert
dest_mc[dbname][collname].save(oplog['o']) # if exist,recover it
elif op == 'u': # update
dest_mc[dbname][collname].update(oplog['o2'], oplog['o'])
elif op == 'd': # delete
dest_mc[dbname][collname].remove(oplog['o'])
elif op == 'n': # no-op
logging.info('no-op')
else:
logging.error('unknown command: %s' % (oplog))