一、背景
需求:本地git服务器A:192.168.251.10,远程备份服务器B:192.168.251.11,需要将服务器A中的git目录下的git工程文件定时备份到远程服务器B中。
因Gitlab具有自动备份功能,但我们目前的需求,主要是针对git版本的工程文件进行备份,所有,不能使用gitlab自动备份功能。初步采用:
第一步,先在本地git服务器上将文件压缩备份到本地上;
第二步,再将本地服务器上的压缩文件定时拷贝到远程服务器B上;
第三步,最后,定时删除备份服务器B上的过期备份文件。
二、本地定时备份
1、创建本地定时备份脚本
1)创建定时备份脚本 touch /home/local_backup.sh;
2)在脚本中添加下列信息:
#!/bin/sh
#创建一个临时文件(要保存备份的路径)
mkdir /data/backups/git
#数据存在/home/git目录下,备份到backups目录下,所以先将数据拷过来
cp -r /home/git /data/backups/git
#将数据所在文件夹backups打包
tar -zcPvf /data/backups/gitbackup$(date +%Y%m%d).tar.gz /data/backups/git
#删除临时文件内容
rm -rf /data/backups/git
#删除备份文件夹下超过30天的文件
find /data/backups -type f -mtime +30 -name "*.tar.gz" -exec rm -rf {} \;
3)修改本地定时备份脚本的权限
chmod 777 local_backup.sh
2、定时执行脚本
1)查看你crond服务状态:service crond status
2)添加定时任务:
输入crontab -e 后,在打开的文件下添加定时命令
0 0 1 * * sh /home/local_backup.sh #表示每月的1号0时0分执行一次备份脚本
注意:脚本路径前面的sh不能省略
补充:sh脚本前面五个字段分别表示分钟(0-59)、小时(0-23)、日(1-31)、月(0-12)、星期几(0-6)后面的为脚本所在目录
3)重新启动crond服务
service crond restart
2、测试验证
修改定时任务中的时间:例如可设置每分钟或者具体的时间执行脚本,查看文件备份是否正常。
三、远程定时备份
远程定时备份主要是对本地服务器与远程备份服务器进行密钥配对,取消scp传输文件所需密码验证的限制。
方法:将本地服务器A生成的公钥文件拷贝到远程服务器B,使得本地服务器A可以免密登录操作远程备份服务器B
1、在本地服务器A上生成密钥对
1)生成rsa证书
ssh-keygen -t rsa
一直回车,接受默认值即可。
在当前用户的.ssh目录下生成文件如下:
2)将生成的公钥文件拷贝备份
cp id_rsa.pub id_rsa.pub.A
2、将服务器A上的公钥文件上传到服务器B上
1)进入远程服务器B中的root/.ssh目录中,若没有当前目录,可以先创建一个
2)使用scp命令,远程拷贝服务器A中的公钥文件到远程服务器B中的.ssh目录下
scp /root/.ssh/id_rsa.pub.A [email protected]:/root/.ssh/
3、密钥配对
1)创建authorized_keys文件
touch /root/.ssh/authorized_keys
2)将拷贝过来的id_rsa.pub.A文件追加到authorized_keys文件中
cat id_rsa.pub.A >> authorized_keys
3)修改authorized_keys文件权限
chmod 400 authorized_keys
4)测试验证,在服务器A上使用scp命令拷贝文件到远程服务器B上,是否还需要输入密码
4、定时将服务器A上的备份文件上传到服务器B上
1)在服务器A上创建远程备份脚本
vim /root/auto_backup_to_remote.sh
2)在脚本中添加下列内容,并保存
#!/bin/bash
# git 服务器文件备份路径
LocalBackDir=/data/backups
# 远程备份服务器 git备份文件存放路径
RemoteBackDir=/root/git_backup
# 远程备份服务器 登录账户
RemoteUser=root
# 远程备份服务器 IP地址
RemoteIP=192.168.251.11(备份服务器B的地址,请你自行修改,注意:=后面不要有空格)
#当前系统日期
DATE=`date +"%Y-%m-%d"`
#Log存放路径
LogFile=$LocalBackDir/log/$DATE.log
# 查找 gitlab本地备份目录下 时间为60分钟之内的,并且后缀为.tar的gitlab备份文件
BACKUPFILE_SEND_TO_REMOTE=$(find $LocalBackDir -type f -mmin -60 -name '*.tar*')
#新建日志文件
touch $LogFile
#追加日志到日志文件
echo "Gitlab auto backup to remote server, start at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
echo "---------------------------------------------------------------------------" >> $LogFile
# 输出日志,打印出每次scp的文件名
echo "---------------------The file to scp to remote server is: $BACKUPFILE_SEND_TO_REMOTE-------------------------------" >> $LogFile
#备份到远程服务器
scp $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP:$RemoteBackDir
#追加日志到日志文件
echo "---------------------------------------------------------------------------" >> $LogFile
3)修改远程备份脚本auto_backup_to_remote.sh的权限
chmod 777 auto_backup_to_remote.sh
4)创建日志存在目录
mkdir -p /data/backups/log
5、创建定时计划
在本地服务器A中添加定时任务
1)输入命令 crontab -e ;
2)在打开的文件中添加定时脚本
0 0 * * * sh /root/auto_backup_to_remote.sh #每天0时0分执行以下远程备份脚本文件
3)重启crontab,使得定时任务生效
systemctl restart crond
6、测试验证远程备份
修改本地服务器中的定时任务执行时间,查看远程服务器B中是否有备份的git文件。
四、定时删除过期备份文件
因远程备份文件在服务器B上,所以,定时删除过期备份文件需要在服务器B上创建定时任务
我们定义删除脚本,备份文件超过30天的将自动删除掉。
1、创建删除过期备份文件的脚本
1)创建删除脚本
touch /home/root/auto_remove_old_backup.sh
2)在脚本文件中添加如下内容
#!/bin/bash
# 远程备份服务器 git备份文件存放路径
GitlabBackDir=/root/git_backup
# 查找远程备份路径下,超过30天 且文件后缀为.tar 的 Git备份文件 然后删除
find $GitlabBackDir -type f -mtime +30 -name '*.tar*' -exec rm {} \;
3)修改删除过期备份脚本的权限
chmod 777 auto_remove_old_backup.sh
2、定时执行删除脚本
一般添加定时任务有两种方式:
方式一:使用命令crontab -e ,将定时任务添加后保存并重启crond服务,使得定时任务生效,之前服务器A上采用的该方式;
方式二:将定时任务添加到/etc/crontab文件中,服务器B采用该方式。
1)打开/etc/crontab文件
vim /etc/crontab
2)在文件中添加定时任务命令
# 添加定时任务,每天凌晨2点,执行删除过期的Git备份文件
0 2 * * * root /home/root/auto_remove_old_backup.sh
3)重启crond服务
#重新加载cron配置文件
sudo service crond reload
#重启cron服务
sudo service crond restart
3、测试验证
1)首先在备份目录下,创建日期超出30天的tar文件,假设当前时间为2018年12月14日,创建以下几个文件;
touch -t 201811011230 test1.tar
touch -t 201811131230 test2.tar
touch -t 201811141230 test3.tar
touch -t 201811151230 test4.tar
2)修改定时任务中的执行时间;
3)查看是否已将过期的备份文件正常删除