作者介紹
胡國青,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<=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<=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<=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>