天天看點

MongoDB遷移的那些事:冷備份+增量備份恢複

作者介紹

胡國青,dbaplus社群群副,oracle ocm10g。曾任職惠普、快樂購-芒果tv等公司服務,主要負責dba和技術架構工作。熱衷于oracle、mysql、mongodb、redis、 linux、java、python、shell等技術。目前服務于初創公司和沒有dba的部分公司,負責sql優化、db教育訓練、db架構設計等相關工作。

本文分享某客戶實施方案,在今年9月中旬已經實施完畢。

一、環境建構步驟

1線上環境

都是副本集模式看,3個業務通路節點+1個隐藏節點+1個延遲節點(隐藏節點做hadoop、spark資料同步使用以及資料報表查詢等)。

2主機以及配置說明

10.21.18.22  secondary節點  優先級為90

10.21.18.23  secondary節點  優先級為80

10.21.18.24  隐藏節點            優先級為0

系統配置:128g記憶體,64core cpu,2tb ssd硬碟

3mongodb版本

percona-server-mongodb-3.0.12-1.8

4資料量

目前該副本集資料量為1.3tb;

單個集合最大資料量目前為6.7億+,超過5億+的集合有11張,超過2億+的集合有27個;

沒有做sharding叢集,副本集支撐現有業務。

5參數配置

幾台伺服器配置完全一樣。

# for documentation of all options, see:

#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.

systemlog:

  destination: file

  logappend: true

  logrotate: reopen

  path: /data/users/mgousr01/mongodb/logs/userinfo01.log

# where and how to store data.

storage:

  dbpath: /data/users/mgousr01/mongodb/dbdata

  journal:

    enabled: true

  directoryperdb: true

  engine: wiredtiger

#########storage.wiredtiger options

  wiredtiger:

    engineconfig:

      cachesizegb: 64

      directoryforindexes: true

    indexconfig:

      prefixcompression: true

##########operationprofiling options

operationprofiling:

   slowopthresholdms: 50

   mode: "all"

########processmanagement options

processmanagement:

  fork: true

  pidfilepath: /data/users/mgousr01/mongodb/dbdata/userinfo01.pid

# network interfaces

net:

  port: 28010

  #bindip:

  maxincomingconnections: 27600

#operationprofiling:

##########replication options

replication:

  oplogsizemb: 95360

  secondaryindexprefetch: all

#sharding:

  #clusterrole: shardsvr    #configsvr or shardsvr

## enterprise-only options

#auditlog:

#snmp:

setparameter:

  enablelocalhostauthbypass: true

  #replwriterthreadcount: 32

  #wiredtigerconcurrentreadtransactions: 1000

     #wiredtigerconcurrentwritetransactions: 1000

注意說明:keyfilers0.key表示認證檔案,需要自己生成;權限為600否則啟動失敗,幾台key也都是一樣。

先将security和keyfile參數注釋,待如下(4)(5)(6)操作完畢後,在将security和keyfile參數注釋去掉即可。

6啟動

mongod –f mguserinfo.conf

7配置副本集的方法

登陸10.46.183.219主機操作

1)

>config={_id:"userrs",members:[{_id:1,host:"10.21.18.21:28010",priority:100,tags:{'use':'usersinfo-01-312'}}]}

> rs.initiate(config)

2)添加節點

userrs:primary> rs.add({_id:3, host:"10.21.18.23:28010", priority:80, tags:{'use':'usersinfo-03-312'}})

userrs:primary> rs.add({_id:5, host:"10.21.18.24:28010", priority:0,hidden:true, tags:{'use':'usersinfo-03-312-hidden'}})

3)建立使用者

use admin

db.createuser( 

    user: "admin", 

    pwd: "123456", 

    roles: 

    [ 

      {role: "useradminanydatabase", db: "admin"},

      { role: "readanydatabase", db: "admin" },

      { role: "dbowner", db: "admin" },

      { role: "useradmin", db: "admin" },

      { role: "root", db: "admin" },

      { role: "clustermonitor", db: "admin" },

      { role: "dbadmin", db: "admin" },

    ] 

  } 

)

使用者名為admin,密碼為123456

二、如何實作增量備份

1上述環境是我們線上的生産環境

2将其中一個secondary節點關閉

我選擇了10.21.18.22:28010主機節點

1)登陸主節點操作如下

rs.remove("10.21.18.22:28010");

從現有叢集中移除該節點

2)shutdown mongod程序

登陸10.21.18.22主機 将mongod程序shutdown

mongod –f mguserinfo.conf --shutdown

3參數調整

将10.21.18.22:28010該節點參數中的replsetname和keyfile以及security注釋,并啟動到單節點模式(以減少應用業務通路或者連結沒有釋放的線程,選擇了業務最低峰淩晨3點操作,如果不及時操作的話,将該節點設定為隐藏節點即可,然後在進行後續操作)。

啟動:

4登陸到該節點做如下操作

mongo 10.21.18.22:28010

> use admin

> db.system.version.find()

{ "_id" : "authschema", "currentversion" : 5 }

2)目前認證級别為5,将其修改為3

>db.system.version.update({ "_id" : "authschema"},{$set: {"currentversion" : 3} })

3)重新開機

将10.21.18.22:28010該節點參數中的replsetname和keyfile以及security注釋去掉;啟動即可

mongod –f mguserinfo.conf –shutdown

這樣該節點又加入到該叢集中。

5切換primary節點

切換現有primary節點到10.21.18.22 secondary主機

1)調整優先級

将10.21.18.21主機mongodb primary節點的優先級修改為85即可

2)操作指令

cfg = rs.conf()

cfg.members[1].priority = 85

rs.reconfig(cfg)

核心提示:我的主機節點members是1,下标從0開始。大家操作時需要仔細觀察自己環境的配置,以免帶來不必要的麻煩。

6主節點建立備份使用者

根據調整優先級,已将primary節點切換到10.21.18.22主機

登陸22主機

    user: "bakinc", 

三、冷備份

--将隐藏節點主機shutdown

1登陸主節點操作如下

rs.remove("10.21.18.24:28010");

從現有叢集中移除該節點。

2登陸10.21.18.24主機 将mongod程序shutdown

3将資料目錄dbdata全部copy到上海資料中心 使用nohup背景copy

4記錄shutdown時的時間點

5資料copy完後,将該節點啟動,加入副本集模式中

将隐藏節點shutdown的原因是因為隐藏節點不會接受到業務處理的線程資料。

四、增量備份

1使用mongobackup 在primary節點操作備份oplog即可

mongo_inc.sh内容如下:

#!/bin/bash

data1=`date +%y%m%d%h%m%s`  #目前時間

data2=`date +%s`

data3=`echo $((${data2}-10860))`  #目前時間 減去 3個小時零1分 多備份恢複之後的一分鐘資料,以免有寫資料沒有恢複到目标主機

echo $data2

echo $data3

/data/mongodb/users/mgousr02/mongobackup -h10.21.18.22 --port 28010 -u bakinc -p " uk#r$k25a9" --authenticationdatabase admin

--backup -s ${data3},0  -t ${data2},0 -o backup${data1}

該腳本是每天生成一個備份目錄,有可以幾個小時備份一次,根據自己的業務來。

2增量恢複

将備份檔案scp到目标主機進行

./mongobackup -h10.66.168.68 --port 28010 --recovery   -s 1475031191,0  -t 1475032271,0  ./backup20160928110254

說明:-s是開始時間,-t是結束時間。

五、問題說明

不修改system.version集合,進行備份出現如下錯誤:

檢視日志,發現有一句:

.failed to authenticate admin@admin with mechanism mongodb-cr: authenticationfailed mongodb-cr credentials missing in the user document 

在一個國外網站發現原來還是mongodb資料庫的版本問題,查詢版本

解決思路:在非權限驗證狀态下,首先,删除已有使用者并;其次,修改version表的currentversion,功能後在重新建立使用者;當然也可以不删除之前的使用者。

五、測試資料

1、

<a>for(var i=1;i&lt;=100000;i++) db.users.insert({"_id":i,"ip" : "192.168.168.254","g_roup" : "kiwi","mac" : "of:fd:67:8c:2f:8f","address" : "hongmei1801num","user_id" : i,"name" : "user10000000"+i,"title" : "system","database" : "mongodb","telphone" : numberlong("15718441234"),"mail" : "[email protected]","os" : "win7","company" : "chinapnr","created":new date(),"age":math.floor(math.random()*120)})</a>

2、

for(var i=1;i&lt;=1000000;i++) db.infos.insert({"_id":i,"ip" : "192.168.168.254","g_roup" : "kiwi","mac" : "of:fd:67:8c:2f:8f","address" : "hongmei1801num","user_id" : i,"name" : "user10000000"+i,"title" : "system","database" : "mongodb","telphone" : numberlong("15718441234"),"mail" : "[email protected]","os" : "win7","company" : "chinapnr","created":new date(),"age":math.floor(math.random()*120)})

3、

for(var i=1;i&lt;=600000;i++) db.addrs.insert({"_id":i,"ip" : "192.168.168.254","g_roup" : "kiwi","mac" : "of:fd:67:8c:2f:8f","address" : "hongmei1801num","user_id" : i,"name" : "user10000000"+i,"title" : "system","database" : "mongodb","telphone" : numberlong("15718441234"),"mail" : "[email protected]","os" : "win7","company" : "chinapnr","created":new date(),"age":math.floor(math.random()*120)})

插入資料後,将資料全量恢複到目标後,再源庫進行插入、修改、删除後,進行增量備份後,然後再次進行增量恢複到目标主機。

六、闡述

mongodb增量遷移的方法有多種:

第一種是使用腳本語言實作,我這邊實作了資料dml後的閃回操作;友善開發人員對資料進行dml誤操作後能進行及時恢複(但是要保證oplog不被覆寫的情況下);

第二種是使用現有工具集實作,比如我們使用了mongobackup,還有其他工具;

第三種是使用程式遷移,我們之前使用java程式将mongodb曆史資料遷移到了hbase中;

前兩種都是根據mongodb的oplog日志操作。

mongodb增量備份恢複方案目前開源方面還不太理想,商業版mongodb沒有接觸過,也不清楚有哪些功能。一款開源nosql能夠得到大家的認可并在生産環境大規模使用,mongodb的誕生無疑是一件意義深遠的事情。那麼多的nosql,為什麼mongodb在nosql中排名第一,在所有db中排名第4?說明了可信度、穩定性以及其自帶的功能等足夠優越。我不是mongodb公司的員工,隻是其使用者之一,作為技術人員使用mongodb服務客戶,了解什麼樣的業務場景選擇mongodb比較适合,我覺得就是成功的關鍵。

<b></b>

<b>本文來自雲栖社群合作夥伴"dbaplus",原文釋出時間:2016-10-18</b>