GitLab 如何確保產生的備份檔案反映應用程式的乾淨狀態?

GitLab 如何確保產生的備份檔案反映應用程式的乾淨狀態?

當您要求正在執行的 GitLab 實例使用下列命令產生完整備份存檔gitlab-rake gitlab:backup:create

  • GitLab 是否執行任何操作來凍結應用程式狀態?
  • 產生體現不一致狀態的技術上可行的備份是否有任何風險?

詳細地:

  • 當生成備份時推送新提交時會發生什麼?
  • 一般來說,如果在備份期間啟動任何修改,會發生什麼情況?
  • 是否有任何快取可以對更改進行排隊以應用於資料庫或寫入檔案/儲存庫?

目前我不知道當您歸檔正在修改的儲存庫或在運行交易的資料庫上完成備份時會發生什麼?


今天把GitLab的備份程式碼看完了gitlab.com/gitlab-org/gitlab-ce/tree/master/lib/backup但找不到我的問題的任何提示。我不使用 Ruby 編寫程式碼,所以這對我沒有幫助...

GitLab 只需tar對要備份的檔案執行命令即可。

在 GitLab 文件中docs.gitlab.com/ee/raketasks/backup_restore.html#backup-strategy-option據稱:

當 tar 讀取資料時發生資料變更時,可能會出現檔案在讀取時發生變更的錯誤,並會導致備份過程失敗。為了解決這個問題,8.17 引入了一種新的備份策略,稱為複製。該策略在呼叫 tar 和 gzip 之前將資料檔案複製到臨時位置,從而避免了錯誤。

STRATEGY=copy參數使gitlab-rake gitlab:backup:create運行rsync -a命令來在建立存檔之前複製所有檔案tar

根據我對文件的理解,透過使用該copy策略,GitLab 將永遠不會產生技術上損壞的存檔,並且永遠不會在建立存檔時失敗。我假設此策略確保產生的存檔是可恢復的,但是資料的一致性狀態又如何呢?

我們能否確保備份存檔體現了 GitLab 實例的一致/乾淨的快照狀態?

我在文檔中找不到這方面的任何資訊。


我確實想不間斷地備份 GitLab。

我知道我可以停止 GitLab 幾秒鐘並對 LVM 磁碟區或檔案系統進行快照,而不是使用整合備份機制,但我不想中斷 GitLab。

你可以執行GitLab的備份,中斷除該服務之外的所有服務postgresql,這樣使用GitLab的整合機制進行備份時就不會發生任何修改,但你仍然需要對用戶停止服務一段時間。


額外獎勵:我的問題也適用於 LVM 磁碟區或檔案系統的快照!

答案1

關於對 Gitlab 進行一致備份有很多問題,但我還沒有找到好的答案。

一些問題:

我可以引用你@SørenLøvborg的答案似乎是正確的:

儲存庫本身使用 進行備份git bundle,因此它們也應該是安全的。上傳是簡單的檔案並且一次寫入,因此應該不會有任何問題。資料庫可能無法與儲存庫和檔案完全同步,但不會導致資料遺失。總而言之,在 GitLab 運行時進行備份看起來是完全安全的,即使它不是原子的。


編輯:您已經收到來自亞特實驗室團隊

相關內容