===============================================
2017/11/1_第2次修改 ccb_warlock
更新說明
2017/11/1:修正了“4.2添加定時計划”中auto_remove_old_backup.sh路徑錯誤而導致不能刪除過期備份文件的問題。
===============================================
部署:http://www.cnblogs.com/straycats/p/7637373.html
升級:http://www.cnblogs.com/straycats/p/7707359.html
本地備份:http://www.cnblogs.com/straycats/p/7671204.html
遷移/恢復:http://www.cnblogs.com/straycats/p/7702271.html
上一篇隨筆(http://www.cnblogs.com/straycats/p/7671204.html)已經記錄了給gitlab本地做自動備份的解決方案,但是源碼安全關乎研發部門的生命,還是需要進一步提高容災能力。首先研發部門暫時沒有老法師能夠在服務器掛了之后通過硬盤將服務器完全恢復,雖然服務器做了raid5,謹慎起見還是得實現遠程自動備份的解決方案,當源碼服務器出現災難性故障時可以保證恢復源碼的功能。
查找資料后發現,http://blog.csdn.net/ouyang_peng/article/details/77334215的教程可行,為了能夠符合我的部署步驟,我將其中部分內容重新整理並修改,也增補了一點細節說明。
一、環境准備
1.gitlab所在的服務器A(centos7,192.168.1.1)
2.備份服務器B(centos7,192.168.1.2)
3.gitlab本地備份目錄設置為/var/opt/gitlab/backups/log,本篇也是以此展開
gitlab已經配置了本地備份。如果沒有配置,可以參考http://www.cnblogs.com/straycats/p/7671204.html。
二、通過密鑰配對取消scp傳輸密碼的限制
手動備份數據費時費力。最好的方法就是通過腳本實現遠程自動備份。但遠程無論是通過SSH登陸,還是通過scp拷貝文件都需要輸入密碼。
為了克服這個問題,首先需要實現不需要密碼的SSH登陸,這樣就可以使用 rsync,scp,rexec等命令來做的遠程備份了。
2.1 生成密鑰對
假設A,B兩服務器,現在需要在A機上用root登陸B機,而不需要輸入密碼。那我們可按照下面的步驟來做:
1)在gitlab服務器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)在gitlab服務器A上cp生成rsa公鑰證書
在/root/.ssh下復制備份一份id_rsa.pub 命名為 id_rsa.pub.A,以便拷貝到遠程服務器B。
cd /root/.ssh
cp id_rsa.pub id_rsa.pub.A
2.2 生成rsa公鑰證書上傳到備份服務器B
先在服務器B上創建目錄/root/.ssh。
mkdir -p /root/.ssh
使用scp命令進行遠程復制,將服務器A生成的id_rsa.pub.A拷貝到服務器B的/root/.ssh目錄下。
scp /root/.ssh/id_rsa.pub.A root@192.168.1.2:/root/.ssh/
此時使用scp命令需要輸入密碼,當把下面的“2.3 密鑰配對”執行后,以后gitlab服務器A使用scp命令復制文件到備份服務器B的話,就不需要輸入密碼了。
2.3 密鑰配對
1)創建authorized_keys文件
在備份服務器B的/root/.ssh下創建authorized_keys文件。
touch /root/.ssh/authorized keys
2)將id_rsa.pub.A文件內容追加到authorized_keys 文件中
通過 cat 命令 把id_rsa.pub.A 追寫到 authorized_keys 文件中。
cd /root/.ssh/
cat id_rsa.pub.A >> authorized_keys
3)修改authorized_keys文件的權限
authorized_keys文件的權限很重要,如果設置為777,那么登錄的時候,還是需要提供密碼的。
chmod 400 authorized_keys
4)測試上傳文件是否還要輸入密碼
不放心的話,立刻測試下gitlab服務器A使用scp命令復制文件到備份服務器B是否還要輸入密碼。
scp /root/.ssh/id_rsa.pub.A root@192.168.1.2:/root/.ssh/
發現在2.3之前,由於沒有設置ssh證書授權認證時,上傳需要輸入密碼;2.3操作完后,由於授權認證,已經不需要輸入密碼了。
三、定時將備份文件傳到備份服務器
3.1 創建遠程備份腳本
在gitlab服務器A上,在/root目錄下創建定期備份腳本auto_backup_to_remote.sh。
vim /root/auto_backup_to_remote.sh
添加下面的內容,並wq保存。
#!/bin/bash
# gitlab 服務器備份路徑
LocalBackDir=/var/opt/gitlab/backups
# 遠程備份服務器 gitlab備份文件存放路徑
RemoteBackDir=/root/gitlab_backup
# 遠程備份服務器 登錄賬戶
RemoteUser=root
# 遠程備份服務器 IP地址
RemoteIP=(備份服務器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.2 修改遠程備份腳本auto_backup_to_remote.sh的權限
要能讓系統執行auto_backup_to_remote.sh,必須修改該腳本的權限。
chmod 777 auto_backup_to_remote.sh
3.3 創建日志存放目錄
mkdir -p /var/opt/gitlab/backups/log
3.4 測試遠程備份腳本的功能是否可用
現在為了驗證腳本是否可以正常運行,我們需要手動執行腳本。
在gitlab服務器A上執行find命令,看是否能夠正常查找出我們要scp到遠程服務器的Gitlab備份文件。
find /var/opt/gitlab/backups/log -type f -mmin -60 -name '*.tar*'
手動執行腳本auto_backup_to_remote.sh,看是否能夠正常上傳
cd
./auto_backup_to_remote.sh
等待1-2分鍾左右,查看備份服務器B的目錄/root/gitlab_backup下是否有服務器A傳過來的備份文件。
在備份服務器B上能找到服務器A傳過來的備份文件,說明遠程備份腳本的功能OK。
如果每次上傳都通過人工運行腳本的方式,人工的消耗太大,接着配置定時執行該腳本。
3.5 添加定時計划
定時備份的思路建立在手動的基礎上,通過crontab添加定時計划就可以解決這個問題。
一般添加定時計划可以有2種方式:
1.使用命令crontab -e,將定時任務添加后保存。
2.將定時任務添加到/etc/crontab文件中。
我這里采取第一種,使用crontab -e。
crontab -e
結合我之前對公司gitlab本地備份的設計,故設計在備份完10分鍾后上傳,故分別在每天12:10、19:10進行備份,故添加下面的內容,wq保存。
10 12 * * * /root/auto_backup_to_remote.sh -D 1
10 19 * * * /root/auto_backup_to_remote.sh -D 1
重啟crontab
systemctl restart crond
四、定時刪除備份服務器上的備份文件
每個Gitlab備份文件都很大。因此每天備份兩次,過不了多久的話,備份服務器B上的磁盤空間可能就會被Gitlab備份文件占用完。
故需要定期清理備份文件,參考備份服務器的空間,暫定保留14天的備份文件。
4.1 創建刪除過期備份文件的腳本
設計備份服務器B的/root/gitlab_backup作為接收遠程上傳備份文件的目錄,故在備份服務器B上,先創建該目錄。
mkdir -p /root/gitlab_backup
創建刪除過期備份文件的腳本auto_remove_old_backup.sh。
vim /root/auto_remove_old_backup.sh
添加下面的內容,並wq保存。
#!/bin/bash
# 遠程備份服務器 gitlab備份文件存放路徑
GitlabBackDir=/root/gitlab_backup
# 查找遠程備份路徑下,超過14天且文件后綴為.tar 的 Gitlab備份文件 然后刪除
find $GitlabBackDir -type f -mtime +14 -name '*.tar*' -exec rm {} \;
4.2 修改auto_remove_old_backup.sh腳本的權限
chmod 777 auto_remove_old_backup.sh
4.3 添加定時計划
定時備份的思路建立在手動的基礎上,通過crontab添加定時計划就可以解決這個問題。
一般添加定時計划可以有2種方式:
1.使用命令crontab -e,將定時任務添加后保存。
2.將定時任務添加到/etc/crontab文件中。
我這里采取第一種,使用crontab -e。
crontab -e
設計凌晨0點執行刪除過期備份文件的腳本,故添加下面的內容,wq保存。
0 0 * * * /root/auto_remove_old_backup.sh
重啟crontab
systemctl restart crond
參考資料:
1. http://blog.csdn.net/ouyang_peng/article/details/77334215