远程备份服务介绍
- 已经提供了远程备份服务的机器,会自动生成远程备份路径,备份的目录统一在/home/bsbackup/backup/下面。
- 系统会自动在每日凌晨的4:10将放在远程备份路径下的数据传送到远程数据中心。
- 存放在远程备份中心的数据,将会保留14天,过期会自动清除。
- 远程备份路径如下所示:
/home/bsbackup/backup/ ├── 20200504 │ ├── data │ ├── data.md5 │ ├── save │ ├── save.md5 │ ├── XXX │ └── XXX.md5 └── 20200505 ├── data ├── data.md5 ├── save ├── save.md5 ├── XXX └── XXX.md5
远程备份操作说明
要完成数据的远程备份,服主需要进一步自行完成日期目录的创建、数据的存放、与数据的md5计算。方法如下:
日期目录的创建-
- 系统每日会自动备份/home/bsbackup/backup/下面的命名格式为当天日期的文件夹下面的所有文件,比如今天是2020年5月7日,则系统会在2020年5月7日04:10的时候,将/home/bsbackup/backup/20200507/目录下面的所有数据备份到远程数据中心(其他日期的目录和错误格式的目录不会被备份到远程数据中心)。服主需要自行在/home/bsbackup/backup/下创建每日远程备份需要用到的日期目录。如下所示:
/home/bsbackup/backup/ ├── 20200506 └── 20200507
- 服主用户和root用户均可创建日期目录
数据的存放
- 创建好日期目录之后,服主需要将数据放到日期存档下面(这里强烈建议服主将所有数据打包或者压缩成一个文件,以减少总文件数量,每个服在远程数据中心的总文件数限制为100w),比如将当天的数据库、日志、地图等文件打包压缩后放到日期目录下,如下所示:
/home/bsbackup/backup/ ├── 20200506 │ ├── sql.tar.gz #将所有sql数据打包压缩成sql.tar.gz,以下同理 │ ├── map.tar.gz │ └── log.tar.gz └── 20200507 ├── sql.tar.gz ├── map.tar.gz └── log.tar.gz
- 当然也可以将所有数据放到打包压缩成一个文件:如下所示:
/home/bsbackup/backup/ ├── 20200506 │ ├── data.tar.gz #将所有需要备份的数据打包压缩成data.tar.gz,以下同理 └── 20200507 └── data.tar.gz
计算md5
- 当数据存放好后,需要对日期目录下面的所有数据进行md计算并生成MD5文件(没有md5文件的数据不会被远程备份)
- 如果日期目录下的数据是文件,则计算该文件的md5,并保存到与该文件同名的MD5后缀的文件里。
- 如果日期目录下的数据是文件夹,则计算该文件夹下面所有文件的MD5值再排序后的md5值,并保存到与该文件夹同名的MD5后缀的文件里。如下所示:
/home/bsbackup/backup/
├── 20200505
│ ├── save
│ │ ├── log
│ │ ├── map
│ │ │ ├── map1
│ │ │ └── map2
│ │ └── sql
│ └── save.md5 #save文件夹下面所有文件的MD5值排序后计算的MD5值
├── 20200506
│ ├── sql.tar.gz
│ ├── sql.tar.gz.md5 #sql.tar.gz文件的MD5值,以下同理
│ └── log.tar.gz
│ ├── log.tar.gz.md5
│ ├── map.tar.gz
│ └── map.tar.gz.md5
└── 20200507
├── data.tar.gz
└── data.tar.gz.md5
一个MD5文件的内容应该如下(只有MD5字段,不包含其他字段):
$ cat 20200505/save.md5
68b329da9893e34099c7d8ad5cb9c940
【文件MD5计算】如上所示,20200506/sql.tar.gz的MD5文件的shell命令行生成方法为:
$ md5sum 20200506/sql.tar.gz | awk '{print $1}' > 20200506/sql.tar.gz.md5
【文件夹MD5计算】如上所示,20200505/save的MD5文件的shell命令行生成方法为:
$ find 20200505/save -type f | xargs md5sum | awk '{print $1}' | sort | md5sum | awk '{print $1}' > 20200505/save.md5
- 以上三个步骤服主均可使用脚本完成,完成后系统会在4:10后对当天日期目录下的数据进行远程备份
检查远程备份上传结果
- 通过日志检查:使用服主用户或者root用户执行下面命令
例如检查2020.5.26的执行的远程备份是否上传成功。(是基于日志检查的,所以这里指的是2020.5.26执行的远程备份是否成功,与日期目录的日期没关系)
$ grep "2020-05-26.*SUCCESS" /home/bsbackup/log/bsclient-root.INFO.log > /dev/null && echo ok || echo fail
备份成功返回ok,失败返回fail
服主可以自行替换命令中的日期进行检查
此命令用于检查当前机器的备份情况,如有多个机器,需要在每台机器上面分别执行检查。
- 通过检查存档检查:使用root用户执行下面命令
例如检查日期目录为20200616的存档是否上传成功。
$ bscheck --config /home/bsbackup/conf/local.py -d 20200616
[2020-06-17 12:01:19] INFO: [bscheck:33] [MainProcess:28283 MainThread] - sleep 46
[2020-06-17 12:02:05] INFO: [bscheck:33] [MainProcess:28283 MainThread] - {"msg": "Update Version Done."}
[2020-06-17 12:02:05] INFO: [bscheck:33] [MainProcess:28283 MainThread] - [bsctls3_INFO 1 baks found in 20200616, BSCHECK OK
#如果上传成功,日志最后一行会显示”BSCHECK OK“字段,不成功的话会显示”ERR_BAK_NOT_FOUND“
#服主可以自行替换命令中的日期进行检查
#此命令用于检查当前机器的备份情况,如有多个机器,需要在每台机器上面分别执行检查。
恢复远程备份操作说明
- 如果服主需要恢复远程备份的数据,可以直接在讨论组联系服务器管理员进行操作。(服主切勿自行尝试恢复远程)
远程备份建议
- 服主可以将远程备份需要使用到的所有操作写成脚本,使用crontab定时任务定时执行(在凌晨4:10前完成),系统会自动在4:10进行远程备份,从而实现整套流程的自动化。
打包命令
- 可以使用tar命令进行打包压缩,说明如下
打包压缩成tar.gz文件: tar -zcvf 新文件名.tar.gz 待压缩文件夹名 (注意文件名前后顺序)
解包解压tar.gz文件: tar -zxvf 待解包解压文件名 (默认解压到当前目录)
使用到的参数如下(更多参数可自行查阅)
-c或--create 建立新的备份文件。
-C<目的目录>或--directory=<目的目录> 切换到指定的目录。
-f<备份文件>或--file=<备份文件> 指定备份文件。
-v或--verbose 显示指令执行过程。
-x或--extract或--get 从备份文件中还原文件。
-z或--gzip或--ungzip 通过gzip指令处理备份文件。
...
- 使用例子
#测试目录~/data目录结构如下
$ tree ~/data
~/data
├── sql
├── save
├── log
└── XXX
#打包压缩测试目录到当天远程备份的日期目录下(假设今天2020年5月7日)
$ tar -zcvf /home/bsbackup/backup/20200507/data.tar.gz ~/data
#查看打包压缩后的文件结构
$ tree /home/bsbackup/backup/20200507/
/home/bsbackup/backup/20200507/
└── data.tar.gz
#解包解压上面的data.tar.gz到指定目录
$ tar -zxvf /home/bsbackup/backup/20200507/data.tar.gz -C ~/tmp/
#查看解包解压后的文件结构
$ tree ~/tmp/
~/tmp/
└── data
├── sql
├── save
├── log
└── XXX
- 提醒:打包压缩过程中,服务器的io会受影响,请服主们尽量在业务低峰期进行打包压缩操作。在打包压缩前,需要对机器硬盘剩余容量进行预估,以免硬盘写满
定时任务的使用
- 服主可以使用crontab工具来进行查看和设置定时任务, 使用方法如下:
常用的几个操作:
crontab -l 列出目前用户的定时任务
crontab -e 编辑目前用户的定时任务(打'e'的时候注意不要打成'r')
crontab -r 清空目前用户的定时任务,如果之前没有对定时任务做过备份的话,就GG了
以上操作均可以指定用户,例如指定fuzhu用户,查看fuzhu用户的定时任务crontab -u fuzhu -l
建议将定时任务写到文件里,再使用crontab [文件名]的方式全量导入定时任务,这样可以留个底。
- crontab定时任务的格式
主要格式如下:
f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推
例子:
#每日凌晨3点0分,执行/home/fuzhu/test.sh脚本
#正确:
0 3 * * * /bin/bash /home/fuzhu/test.sh
#错误:
0 3 * * * bash /home/fuzhu/test.sh
原因:因为系统执行定时任务的时候是没有环境变量的,所以并不能找到bash命令的路径,所以在设置定时任务(包括定时任务用到的脚本的内容)的时候一定要用绝对路径
写绝对路径很麻烦,更好的方法,直接导入环境变量,例子:
#每日凌晨3点0分,执行/home/fuzhu/test.sh脚本
0 3 * * * source /etc/profile && bash /home/fuzhu/test.sh
这样就无需考虑命令的路径了。
服主可以将远程备份用到的操作写成shell脚本,再设置定时任务执行。