Mongodb通过shell脚本增量备份到HDFS

来源:互联网 发布:怎样分享淘宝宝贝 编辑:程序博客网 时间:2024/05/29 02:59

用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脚本即可。


原创粉丝点击