Mongodb通過shell指令碼增量備份到HDFS 阿新 • • 發佈:2018-12-24 用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指令碼即可。