用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脚本即可。
转载请注明原文地址: https://www.6miu.com/read-32313.html