但是之前的備份功能隻是備份到Gitlab服務運作的那台伺服器上,如果哪一天那台伺服器的磁盤損壞了的話,資料無法取出,那麼對于公司來說是一匹無法想象的損失,因為
代碼是公司的重要資産,需要以防萬一。
是以我們得做好代碼的備份工作,是以除了每天在Gitlab那台伺服器上自動備份之外,還需要将每天的備份檔案copy到另外一台檔案備份伺服器上,已達到雙保險的要求。
遠端手動備份資料費時費力且不及時。最好的方法就是通過腳本實作遠端自動互備。但遠端無論是通過SSH登陸,還是通過scp拷貝檔案都需要輸入密碼。為了克服這個問題,首先需要實作不需要密碼的SSH登陸,這樣就可以使用 rsync,scp,rexec等指令來做的遠端備份了。
前提:本地伺服器:A, 遠端伺服器:B
假設A,B兩伺服器,現在需要在A機上用root登陸B機,而不需要輸入密碼。那我們可按照下面的步驟來做:
在本地伺服器A上生成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。
執行cp指令複制
使用scp指令進行遠端複制,将A機生成的id_rsa.pub.A拷貝到遠端伺服器B的/root/.ssh目錄下
這裡使用scp指令需要輸入密碼,當我們把下面的第三步執行完畢之後,以後本地伺服器A使用scp指令複制檔案到遠端伺服器B的話,就不需要再次輸入密碼。
當第二步将伺服器A上的id_rsa.pub.A 檔案copy到了伺服器B的目錄/root/.ssh下之後截圖如下:
現在我們在 B 的/root/.ssh下建立authorized_keys檔案,使用如下指令
通過 cat 指令 把id_rsa.pub.A 追寫到 authorized_keys 檔案中,指令依次如下:
執行如下指令,修改authorized_keys檔案的權限
authorized_keys檔案的權限很重要,如果設定為777,那麼登入的時候,還是需要提供密碼的。
測試伺服器A使用scp指令複制檔案到伺服器B是否還需要密碼
在服務A上,再次使用剛才的指令,發現已經可以不需要輸入密碼,如下所示:
本地伺服器A上建立定期備份腳本auto_backup_to_remote.sh,腳本内容如下
因為到時候,我們會将該定時遠端備份腳本auto_backup_to_remote.sh執行的時間,放到Gitlab自動備份腳本auto_backup.sh之後的一小時之内,是以我們隻需要每次執行遠端備份腳本auto_backup_to_remote.sh的時候,隻需要cp一個小時之内的生成的新的Gitlab備份檔案。
要執行腳本檔案,需要修改定時遠端備份腳本auto_backup_to_remote.sh的權限
現在為了驗證腳本是否可以正常運作,我們需要手動執行腳本。
如上圖所示,因為最後一次Gitlab備份時間為淩晨2點,而現在已經是下午3點半左右,是以我們需要修改腳本的查詢條件。
将查詢條件從 本地備份目錄下 時間為60分鐘之内的,并且字尾為.tar的gitlab備份檔案
修改為 本地備份目錄下 時間為1000分鐘之内的,并且字尾為.tar的gitlab備份檔案
先在終端執行find指令,看是否能夠正常查找出我們要scp到遠端伺服器的Gitlab備份檔案
将定時遠端備份腳本auto_backup_to_remote.sh修改完畢之後,我們試着手動執行該腳本,看是否能夠正常運作。
執行指令
執行該腳本檔案,在2分鐘之内就将最後一次的Gitlab備份檔案scp到了遠端伺服器B
我們切換到遠端伺服器B,檢視剛才從伺服器A 通過scp指令複制過來的Gitlab備份檔案,如下所示:
至此,從伺服器A複制備份檔案到伺服器B的腳本正常運作,但是如果每次都這樣來手動觸發腳本的話,太麻煩,是以我們需要定時執行腳本。
即vi /etc/crontab,然後添加相應的任務。
可以看到,這裡有我們之前寫好的定期淩晨2點執行Gitlab本機備份的定時任務
現在我們在上面的定時任務後面,再添加一個執行複制剛備份好的Gitlab備份檔案到伺服器B的腳本任務。如下所示:
編寫完 /etc/crontab 檔案之後,需要重新啟動cron服務
實際運作如下:
為了能夠測試,該腳本是否能夠在指定時間的時候,真的能夠自動執行,我們将時間修改為15:55分。修改如下:
然後重新開機cron服務
現在時間是15:58分,我們去檢視生成的log檔案,可以看到在15:55分的時候,腳本正常定時執行了
切換到遠端伺服器B,檢視從伺服器Acopy過來的Gitlab備份檔案
通過測試,可以發現定時任務也正常執行了,是以我們可以将時間改為淩晨3點來複制Gitlab備份檔案到遠端伺服器B。
通過如上圖所示,每個Gitlab備份檔案都很大,都有1G左右的大小。是以每天備份一次,過不了多久的話,備份伺服器B上的磁盤空間可能就會被Gitlab備份檔案占用完。
是以我們需要定期清理備份檔案,清理的時候我們可以自己定義,這裡我們規定:
備份檔案超過30天的都自動删除掉。
為了實作這個功能,我們需要在遠端伺服器B上編寫腳本來清理過期的備份檔案。
建立定期删除過期的備份檔案的腳本auto_remove_old_backup.sh
腳本内容如下 :
修改auto_remove_old_backup.sh腳本權限為777
如上圖所示,目前備份伺服器上,隻有一個8月17日15:56分copy過來的Gitlab備份檔案,為了能夠測試我們的腳本是否正常運作,我們建立幾個7月份的檔案,如下所示:
使用touch指令,建立指定時間的 test.tar 檔案
這樣我們就建立了4個7月1日到7月4日的的test1.tar、test2.tar、test3.tar、test4.tar
現在我們手動來執行我們的auto_remove_old_backup.sh腳本
對比執行auto_remove_old_backup.sh腳本前後,我們發現超過30天的,并且以.tar字尾結尾的檔案都被删除了,腳本正常。
然後編寫定時任務
寫完 /etc/crontab 檔案之後,需要重新啟動cron服務,因為遠端備份伺服器是Center OS 和之前的Gitlab伺服器 Ubuntu 有點不一樣,是以重新開機cron指令有所不同。
為了測試定期删除任務,現在時間是16:35,我們将腳本執行時間設定為16:40分,如下所示
然後重新開機cron服務,超過16點40分之後我們再檢視過期的.tar檔案是否被删除
如上所示,我們修改定時執行任務的時間後,删除任務正常執行,是以我們時間修改回淩晨4點删除過期備份檔案。
<a href="http://blog.csdn.net/ouyang_peng/article/details/77371161">Git學習–>如何通過Shell腳本實作 監控Gitlab備份整個過程并且通過郵件通知得到備份結果?</a>
<a href="http://blog.csdn.net/ouyang_peng/article/details/77371161">http://blog.csdn.net/ouyang_peng/article/details/77371161</a>
作者:歐陽鵬 歡迎轉載,與人分享是進步的源泉!
如果本文對您有所幫助,歡迎您掃碼下圖所示的支付寶和微信支付二維碼對本文進行打賞。