手动备份数据费时费力。最好的方法就是通过脚本实现远程自动备份。但远程无论是通过SSH登陆,还是通过scp拷贝文件都需要输入密码。 为了克服这个问题,首先需要实现不需要密码的SSH登陆,这样就可以使用 rsync,scp,rexec等命令来做的远程备份了。
假设A,B两服务器,现在需要在A机上用root登陆B机,而不需要输入密码。那我们可按照下面的步骤来做:
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。
在/root/.ssh下复制备份一份id_rsa.pub 命名为 id_rsa.pub.A,以便拷贝到远程服务器B。
1. cd /root/.ssh
2. cp id_rsa.pub id_rsa.pub.A
先在服务器B上创建目录/root/.ssh。
1. mkdir -p /root/.ssh
使用scp命令进行远程复制,将服务器A生成的id_rsa.pub.A拷贝到服务器B的/root/.ssh目录下。
1. scp /root/.ssh/id_rsa.pub.A [email protected]:/root/.ssh/
此时使用scp命令需要输入密码,当把下面的“2.3 密钥配对”执行后,以后gitlab服务器A使用scp命令复制文件到备份服务器B的话,就不需要输入密码了。
1. touch /root/.ssh/authorized keys
通过 cat 命令 把id_rsa.pub.A 追写到 authorized_keys 文件中。
1. cd /root/.ssh/
2. cat id_rsa.pub.A >> authorized_keys
authorized_keys文件的权限很重要,如果设置为777,那么登录的时候,还是需要提供密码的。
1. chmod 400 authorized_keys
不放心的话,立刻测试下gitlab服务器A使用scp命令复制文件到备份服务器B是否还要输入密码。
1. scp /root/.ssh/id_rsa.pub.A [email protected]:/root/.ssh/
发现在2.3之前,由于没有设置ssh证书授权认证时,上传需要输入密码;2.3操作完后,由于授权认证,已经不需要输入密码了。
在gitlab服务器A上,在/opt/backup/gitlab_backup/目录下创建定期备份脚本gitlab_remote_backup.sh。
1. vim /opt/backup/gitlab_backup/gitlab_remote_backup.sh
添加下面的内容,并wq保存。
1. #!/bin/bash
2.
3. # gitlab 服务器备份路径
4. LocalBackDir=/opt/backup/gitlab_backup/backups
5.
6. #远程备份服务器 gitlab备份文件存放路径
7. RemoteBackDir=/opt/backup/gitlab/backups
8.
9. #远程备份服务器 登录账户
10. RemoteUser=root
11.
12. # 远程备份服务器 IP地址
13. RemoteIP=172.16.10.219
14.
15. #当前系统日期
16. DATE=`date +"%Y-%m-%d"`
17.
18. #Log存放路径
19. LogFile=$LocalBackDir/log/$DATE.log
20.
21. # 查找 gitlab本地备份目录下 时间为400分钟之内的,并且后缀为.tar的gitlab备份文件
22. BACKUPFILE_SEND_TO_REMOTE=$(find $LocalBackDir -type f -mmin -400 -name '*.tar*')
23.
24. #对gitlab备份文件进行打包,删除原目录文件
25. cd $LocalBackDir
26. tar -cPf ./$BACKUPFILE_SEND_TO_REMOTE.tar $BACKUPFILE_SEND_TO_REMOTE
27. rm -rf $BACKUPFILE_SEND_TO_REMOTE
28. cd ..
29.
30. #查找 gitlab本地备份目录下 时间为400分钟之内的,并且后缀为.tar的gitlab备份文件
31. BACKUPFILE_SEND_TO_REMOTE=$(find $LocalBackDir -type f -mmin -4000 -name '*tar')
32.
33. #新建日志文件
34. touch $LogFile
35.
36. #追加日志到日志文件
37. echo "Gitlab auto backup to remote server, start at $(date +"%Y-%m-%d %H:%M:%S")" >> $LogFile
38. echo "---------------------------------------------------------------------------" >> $LogFile
39.
40. # 输出日志,打印出每次scp的文件名
41. echo "---------------------The file to scp to remote server is: $BACKUPFILE_SEND_TO_REMOTE-------------------------------" >> $LogFile
42.
43. #备份到远程服务器
44. scp $BACKUPFILE_SEND_TO_REMOTE $RemoteUser@$RemoteIP:$RemoteBackDir
45.
46. #追加日志到日志文件
47. echo "---------------------------------------------------------------------------" >> $LogFile
要能让系统执行gitlab_remote_backup.sh,必须修改该脚本的权限。
1. chmod 777 gitlab_remote_backup.sh
1.mkdir -p /opt/backup/gitlab_backup/backups/log
现在为了验证脚本是否可以正常运行,我们需要手动执行脚本。
在gitlab服务器A上执行find命令,看是否能够正常查找出我们要scp到远程服务器的gitlab备份文件。
1. find /var/opt/gitlab/backups/log -type f -mmin -400 -name '*.tar*'
手动执行脚本gitlab_remote_backup.sh,看是否能够正常上传
1. cd /opt/backup/gitlab_backup/
2. bash gitlab_remote_backup.sh
等待1-2分钟左右,查看备份服务器B的目录/opt/backup/gitlab/backups下是否有服务器A传过来的备份文件。
在备份服务器B上能找到服务器A传过来的备份文件,说明远程备份脚本的功能OK。
果每次上传都通过人工运行脚本的方式,人工的消耗太大,接着配置定时执行该脚本。
定时备份的思路建立在手动的基础上,通过crontab添加定时计划就可以解决这个问题。
使用命令crontab -e,将定时任务添加后保存
1. crontab -e
结合我之前对公司gitlab本地备份的设计,gitlab_remote_backup.sh在每天凌晨2点进行备份,故添加下面的内容,wq保存。
1. 0 2 * * * /opt/backup/gitlab_backup/gitlab_remote_backup.sh -D 1
重启crontab
1. systemctl restart crond
每个gitlab备份文件都很大。过不了多久的话,备份服务器B上的磁盘空间可能就会被gitlab备份文件占用完。
故需要定期清理备份文件,参考备份服务器的空间,暂定保留30天的备份文件。
设计备份服务器B的/opt/backup/gitlab作为接收远程上传备份文件的目录,故在备份服务器B上,先创建该目录
1. mkdir -p /opt/backup/gitlab
创建删除过期备份文件的脚本delete_expired_files.sh。
1. vim /opt/backup/gitlab/delete_expired_files.sh
添加下面的内容,并wq保存。
1. #!/bin/bash
2.
3. # 远程备份服务器 gitlab备份文件存放路径
4. gitlabBackDir=opt/backup/gitlab
5.
6. # 查找远程备份路径下,超过30天且文件后缀为.tar 的 gitlab备份文件 然后删除
7. find $gitlabBackDir -type f -mtime +30 -name '*tar*' -exec rm -rf {} \;
1. chmod 777 delete_expired_files.sh
定时备份的思路建立在手动的基础上,通过crontab添加定时计划就可以解决这个问题。
使用命令crontab -e,将定时任务添加后保存
1. crontab -e
设计凌晨3点执行删除过期备份文件的脚本,故添加下面的内容,wq保存。
1. 0 3 * * * /opt/backup/gitlab_backup/delete_expired_files.sh
重启crontab
1. systemctl restart crond