1. 程式人生 > >Mongodb通過shell指令碼增量備份到HDFS

Mongodb通過shell指令碼增量備份到HDFS

用Mongodb自帶的Mongoexport,通過shell指令碼的方式進行增量備份到HDFS上


1.思路介紹:


Mongodb安裝目錄下bin目錄裡有兩個工具:mongoexport和mongodump這兩個工具可以實現備份mongodb的資料。用法也類似,區別這裡不做說明,自行搜尋。mongoexport可以匯出資料到外部檔案中,mongoexport通過指定引數的方式來索要備份的mongodb資料庫、集合、以及備份的條件、和匯出到外部檔案的路徑。如:
mongoexport -o /home/result.csv
就是通過-o指定匯出的路徑。
其中有一個引數:-q 它的作用是指定備份的條件,通過這個引數,就可以對mongodb裡的資料做一個篩選,通過篩選出增量資料,然後把它們備份匯出。從而實現增量資料備份。
2.需求:
我的需求如下:網頁產生的資料一直在往Mongodb裡儲存,我需要每小時從Mongodb里拉取一次資料,儲存到hdfs上。
其中:hdfs的三個節點:node1,node2,node3
Mongodb在另一臺機器上。不在叢集節點上。
Mongodb儲存的資料是Bson型別如下:
{ "_id" : "ad22be19473548248c84feceaf8334f0"
 "_class" : "com.cdv.nsite.authc.model.Session"
 "userId" : "admin"
 "userName" : "admin"
 "logonTime" : ISODate("2017-05-10T09:44:34.881Z")
 "logonHost" : "11.9.234.85"
 "logonIp" : "11.9.234.85"
 "lastBang" : NumberLong("1494409485264")
 "extraData" : {  }


 "appName" : "web console"
 "userState" : "On"
 "state" : "Off"
 "sessionGroup" : "default"
 "stationId" : "cdv.com"
 "inner" : false
 "logoffTime" : ISODate("2017-05-10T09:56:08.189Z") }
最終儲存在hdfs上的形式如下,通過豎線分隔。
00482b6e238940f9845693dbd0d7b0a1|lf|呂峰|2017-07-07T08:39:06.850Z|22.72.19.2|bs unknown|web console|editsphere_v1|CV|Off|2017-07-07T08:39:28.955Z






3.實現:
☆只要在任意一臺node1-3節點上存在mongoexport工具就能備份遠端mongodb資料庫的資料到本地。
pullMongoData.sh:
#!/bin/bash


mypath=/home/MongoBackup/`date +%Y%m`
if [ ! -d "$mypath" ]; then
  mkdir -p $mypath
fi
#得到前一個小時的時間精確到小時,格式為:2017071013
start=`date +%Y%m%d%H -d '-1 hours'`
year=`echo ${start:0:4}`
month=`echo ${start:4:2}`
day=`echo ${start:6:2}`
hour=`echo ${start:8:2}`


#拉取資料的起始時間確定為:2017-07-10 13:00:00
#Mongoexport的條件備份:-q 特定的格式的時間格式,才能進行時間的大小判斷。時間要進行如下轉換:
#2017-07-10 13:00:00 --> 1499662800 --> 1499662800000 --> 1499691600000  其中最後一步轉換是因為Mongodb的時間和標準時間差8小時。
#然後進行時間範圍限定的時候採用固定格式:logonTime:{\$gte:Date($timestamp)
startTime=$year-$month-$day' '$hour':'00':'00
timestamp=`date -d "$startTime" +%s`000
timestamp=`expr $timestamp + 28800000`
end=`expr $timestamp + 3600000`
#-h是mongodb的ip --port是埠  -d是資料庫 -c是集合  -q是條件 --type=csv是指定輸出檔案型別  -o是指定輸出路徑
#具體引數的意義可以自行搜尋。
/home/mongodb/bin/mongoexport -h 114.115.147.192  --port 30000 -d nsitedb -c nSite.authc.sessions -q "{logonTime:{\$gte:Date($timestamp),\$lte:Date($end)}}" -f _id,userId,userName,logonTime,logonIp,logonHost,appName,"editsphere_v1","CDV",state,logoffTime --type=csv -o  $mypath/$year$month$day$hour.csv
sed -i s/","/"|"/g "$mypath/$year$month$day$hour.csv"


sed -i '1d' "$mypath/$year$month$day$hour.csv"


if [ -s "$mypath/$year$month$day$hour.csv"  ]; then
        hdfs dfs -put $mypath/$year$month$day$hour.csv /data/mongo/
fi
寫一個定時任務:
crontab -e
* */1 * * * sh /home/shell/pullMongoData.sh
每一個小時執行一次pullMongoData.sh指令碼即可。