为防止服务器的磁盘损坏数据无法取出,因此我们得做好代码的备份工作,因此除了每天在Gitlab那台服务器上自动备份之外,还需要将每天的备份文件copy到另外一台文件备份服务器上,已达到双保险的要求。
1.服务器密钥配对,取消scp传输密码限制
远程手动备份数据费时费力且不及时。最好的方法就是通过脚本实现远程自动互备。但远程无论是通过SSH登陆,还是通过scp拷贝文件都需要输入密码。为了克服这个问题,首先需要实现不需要密码的SSH登陆,这样就可以使用 rsync,scp,rexec等命令来做的远程备份了。
前提:本地服务器:A(gitlab服务器), 远程服务器:B
2.生成密钥对
假设A,B两服务器,现在需要在A机上用root登陆B机,而不需要输入密码。那我们可按照下面的步骤来做:
2.1 在本地服务器A上生成rsa证书
在本地服务器A上生成rsa证书,运行命令:
ssh-keygen -t rsa
(1) 生成的过程中提示输入密钥对保存位置,直接回车,接受默认值就行了。
(2) 因为之前已经有/root/.ssh/id_rsa 文件存在,因此提示你是否覆盖,输入y表示覆盖
(3) 接着会提示输入一个密码,直接回车,让它空着。当然,也可以输入一个密码。
(4) 接着输入确认密码,输入完之后,回车密钥对就生成完了。
在/root/.ssh下生成id_rsa 和 id_rsa.pub 两个文件,
其中公共密钥保存在 /root/.ssh/id_rsa.pub,私有密钥保存在/root/.ssh/id_rsa。
2.2 在本地服务器A上cp生成rsa公钥证书
然后在/root/.ssh下复制备份一份id_rsa.pub 命名为 id_rsa.pub.A,以便拷贝到远程服务器B。
执行cp命令复制
cp id_rsa.pub id_rsa.pub.A
2.3 cp生成rsa公钥证书到远程服务器B
使用scp命令进行远程复制,将A机生成的id_rsa.pub.A拷贝到远程服务器B的/root/.ssh目录下
root@ubuntu4146:~/.ssh# scp /root/.ssh/id_rsa.pub.A root@远程服务器ip:/root/.ssh/
root@远程服务器ip's password:
id_rsa.pub.A
这里使用scp命令需要输入密码,当我们把下面的第三步执行完毕之后,以后本地服务器A使用scp命令复制文件到远程服务器B的话,就不需要再次输入密码。
3.密钥配对
3.1 创建authorized_keys文件
现在我们在 B 的/root/.ssh下创建authorized_keys文件,使用如下命令
touch authorized_keys
3.2 设置authorized_keys 文件
通过 cat 命令 把id_rsa.pub.A 追写到 authorized_keys 文件中,命令依次如下:
cat id_rsa.pub.A >> authorized_keys
3.3 修改authorized_keys文件的权限
执行如下命令,修改authorized_keys文件的权限
chmod 400 authorized_keys
authorized_keys文件的权限很重要,如果设置为777,那么登录的时候,还是需要提供密码的。
3.4 测试
测试服务器A使用scp命令复制文件到服务器B是否还需要密码
在服务A上,再次使用刚才的命令,发现已经可以不需要输入密码
4.创建Shell定时远程备份脚本
4.1 在本地服务器A上创建定时远程备份脚本
本地服务器A上创建定期备份脚本auto_backup_to_remote.sh,脚本内容如下
#!/bin/bash
# gitlab 机房备份路径
LocalBackDir=/data/gitlabData/backups
# 远程备份服务器 gitlab备份文件存放路径
RemoteBackDir=/root/gitlabDataBackup
# 远程备份服务器 登录账户
RemoteUser=root
# 远程备份服务器 IP地址
RemoteIP=(你的远程服务器地址)请自己修改
#当前系统日期
DATE=`date +"%Y-%m-%d"`
#Log存放路径
LogFile=$LocalBackDir/log/$DATE.log
# 查找 本地备份目录下 时间为60分钟之内的,并且后缀为.tar的gitlab备份文件
BACKUPFILE_SEND_TO_REMOTE=$(find /data/gitlabData/backups -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
4.2 修改备份脚本权限
chmod 777 auto_backup_to_remote.sh
4.3 手动执行脚本
现在为了验证脚本是否可以正常运行,我们需要手动执行脚本。
先在终端执行find命令,看是否能够正常查找出我们要scp到远程服务器的Gitlab备份文件
root@ubuntu4146:/data/gitlabData/backups# find /data/gitlabData/backups -type f -mmin -1000 -name '*.tar*'
/data/gitlabData/backups/1502906429_2017_08_17_9.4.3_gitlab_backup.tar
将定时远程备份脚本auto_backup_to_remote.sh修改完毕之后,我们试着手动执行该脚本,看是否能够正常运行。
root@ubuntu4146:/data/gitlabData/backups# ./auto_backup_to_remote.sh
切换到远程服务器B,在指定位置查看文件是否复制成功
5.定时执行脚本
5.1 编辑/etc/crontab 文件
即vi /etc/crontab,然后添加相应的任务。
在上面的定时任务后面,再添加一个执行复制刚备份好的Gitlab备份文件到服务器B的脚本任务。如下所示:
# 添加定时任务,每天凌晨三点,执行gitlab备份到远程服务器
0 3 * * * root /data/gitlabData/backups/auto_backup_to_remote.sh
5.2 重启cron服务
/sbin/service crond reload //重新载入配置
/sbin/service crond restart //重启服务
5.3 测试自动化脚本
为了能够测试,该脚本是否能够在指定时间的时候,真的能够自动执行,我们将时间修改为15:55分。修改如下:
# 添加定时任务,每天凌晨三点,执行gitlab备份到远程服务器
55 15 * * * root /data/gitlabData/backups/auto_backup_to_remote.sh
重启cron服务,切换到远程服务器B,查看结果
- 定时删除远程服务器上的备份文件
6.1 创建定期删除过期的备份文件的脚本
创建定期删除过期的备份文件的脚本auto_remove_old_backup.sh
[root@xtgl207940 gitlabDataBackup]# touch auto_remove_old_backup.sh
6.2 编写脚本auto_remove_old_backup.sh
vi auto_remove_old_backup.sh
脚本内容如下 :
#!/bin/bash
# 远程备份服务器 gitlab备份文件存放路径
GitlabBackDir=/root/gitlabDataBackup
# 查找远程备份路径下,超过30天 且文件后缀为.tar 的 Gitlab备份文件 然后删除
find $GitlabBackDir -type f -mtime +30 -name '*.tar*' -exec rm {} \;
6.3定时执行删除脚本
将脚本加入/etc/crontab 文件
#添加定时任务,每天凌晨4点,执行删除过期的Gitlab备份文件
0 4 * * * root /root/gitlabDataBackup/auto_remove_old_backup.sh
6.4重启crond服务