您的位置:首页 > 数据库 > Mongodb

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

2017-07-10 15:59 676 查看

用Mongodb自带的Mongoexport,通过shell脚本的方式进行增量备份到HDFS上

1.思路介绍:

Mongodb安装目录下bin目录里有两个工具:mongoexport和mongodump这两个工具可以实现备份mongodb的数据。用法也类似,区别这里不做说明,自行搜索。mongoexport可以导出数据到外部文件中,mongoexport通过指定参数的方式来索要备份的mongodb数据库、集合、以及备份的条件、和导出到外部文件的路径。如:

mongoexport -o /home/result.csv

就是通过-o指定导出的路径。

其中有一个参数:-q 它的作用是指定备份的条
4000
件,通过这个参数,就可以对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脚本即可。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: