大規模リファレンスアーキテクチャのバックアップとリストア
このドキュメントでは、以下の方法について説明します:
- 日次バックアップの設定
- 今すぐバックアップを取る(予定)
- バックアップのリストア
このドキュメントは、以下の環境を対象としています:
- Linuxパッケージ(Omnibus)およびクラウドネイティブのハイブリッド・リファレンス・アーキテクチャ 3,000ユーザー以上
- PostgreSQLデータ用のAmazon RDS
- オブジェクトストレージ用のAmazon S3
- Blobや コンテナレジストリなど、ありとあらゆるものを保存するオブジェクトストレージ
日次バックアップの設定
PostgreSQLとオブジェクトストレージデータのバックアップ設定
backupコマンドは pg_dump
、100GBを超えるデータベースには適していません。ネイティブで堅牢なバックアップ機能を持つPostgreSQLソリューションを選択する必要があります。
ブロブや コンテナ・レジストリなどのGitLabデータの保存には、オブジェクトストレージ(NFSではない)を推奨します。
- RDSとS3の両方のデータをバックアップするためにAWS Backupを設定します。最大限の保護のために、スナップショットバックアップだけでなく、継続的なバックアップも設定します。
- バックアップを別のリージョンにコピーするように AWS Backup を設定します。AWSがバックアップを取ると、バックアップはバックアップが保存されているリージョンでのみリストアできます。
- AWS Backupが少なくとも1回のスケジュールバックアップを実行した後、必要に応じてオンデマンドバックアップを作成できます。
Git リポジトリのバックアップ設定
-
Linuxパッケージ(Omnibus):
Gitリポジトリのバックアップには引き続きbackupコマンドを使用します。
利用率が十分に低ければ、既存の GitLab Rails ノードから実行することができます。そうでなければ、別のノードを立ち上げてください。
-
クラウドネイティブハイブリッド:
toolbox
ポッドでbackup-utility
コマンドを実行すると、大量のデータ がある場合に失敗します。この場合、Gitリポジトリをバックアップするためにbackupコマンドを実行する必要があり、GitLab Linuxパッケージを実行しているVMで実行する必要があります:- 8vCPU、7.2GBメモリのVMをスピンアップします。このノードは、Gitリポジトリのバックアップに使用されます。PraefectノードはGitデータのバックアップには使用できません。
- ノードを、リファレンスアーキテクチャで定義されている別のGitLab Railsノードとして設定します。他のGitLab Railsノードと同様に、このノードはメインのPostgresデータベースとGitalyクラスタにアクセスできる必要があります。
Gitリポジトリをバックアップします:
- GitLab Railsノードに、GitリポジトリとGitリポジトリのアーカイブを保存するのに十分なストレージが接続されていることを確認してください。さらに、フォークされたリポジトリの内容は、バックアップ中にそのフォークに複製されます。例えば、5GB分のGitリポジトリと1GBのリポジトリのフォークが2つある場合、最低でも14GBのアタッチストレージが必要です:
- 7 GB の Git データ。
- Gitの全データの7GBのアーカイブファイル。
- GitLab RailsノードにSSH接続します。
- バックアップをリモートのクラウドストレージにアップロードする設定。
- このバケットに対してAWS Backupを設定するか、本番用データオブジェクトストレージのバケットと同じアカウントとリージョンのバケットを使用し、このバケットが既存のAWS Backupに含まれていることを確認します。
-
PostgreSQL データをスキップしてバックアップコマンドを実行します:
sudo gitlab-backup create SKIP=db
結果のtarファイルには、Gitリポジトリと一部のメタデータだけが含まれます。アップロード、アーティファクト、LFSなどのブロブは明示的にスキップする必要はありません。このコマンドはデフォルトではオブジェクトストレージをバックアップしないからです。tarファイルは、
/var/opt/gitlab/backups
ディレクトリ とに作成され、ファイル名は_gitlab_backup.tar
で終わります。リモートのクラウドストレージにバックアップをアップロードする設定にしているため、tarファイルはリモートリージョンにアップロードされ、ディスクから削除されます。
- 次のステップのために、バックアップファイルのタイムスタンプに注意してください。たとえば、バックアップ名が
1493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar
の場合、タイムスタンプは1493107454_2018_04_25_10.6.4-ce
です。 -
backup コマンドをもう一度実行し、今度はGit リポジトリの増分バックアップとバックアップ元のファイルのタイムスタンプを指定します。前のステップのタイムスタンプの例を使うと、コマンドは次のようになります:
sudo gitlab-backup create SKIP=db INCREMENTAL=yes PREVIOUS_BACKUP=1493107454_2018_04_25_10.6.4-ce
- 増分バックアップが成功し、オブジェクトストレージにアップロードされたことを確認します。
-
毎日バックアップを行うようにcronを設定します。
root
ユーザーのcrontabを編集します:sudo su - crontab -e
-
そこに以下の行を追加して、毎日午前2時にバックアップをスケジュールします:
0 2 * * * /opt/gitlab/bin/gitlab-backup create SKIP=db INCREMENTAL=yes PREVIOUS_BACKUP=1493107454_2018_04_25_10.6.4-ce CRON=1
設定ファイルのバックアップの設定
設定とシークレットがデプロイの外部で定義され、デプロイされる場合、バックアップ戦略の実装は特定の設定と要件に依存します。一例として、複数のリージョンにレプリケーションしてシークレットをAWS Secret Managerに保存し、シークレットを自動的にバックアップするスクリプトを設定することができます。
設定とシークレットがデプロイ内部でのみ定義されている場合:
- 設定ファイルの格納]では、設定ファイルとシークレットファイルを抽出する方法について説明します。
- これらのファイルは、より制限の厳しい別のオブジェクトストレージアカウントにアップロードする必要があります。
バックアップのリストア
GitLabインスタンスのバックアップをリストアします。
前提条件
バックアップを復元する前に
- 作業先のGitLabインスタンスを選択します。
- デスティネーションのGitLabインスタンスが、AWSのバックアップが保存されているリージョンにあることを確認します。
- 保存先のGitLabインスタンスが、バックアップデータが作成されたGitLabと全く同じバージョンとタイプ(CEまたはEE)を使用していることを確認します。例えば、CE 15.1.4。
- バックアップしたシークレットを移行先のGitLabインスタンスにリストアします。
- 移行先のGitLabインスタンスに同じリポジトリストレージが設定されていることを確認してください。追加のストレージも問題ありません。
- バックアップしたGitLabインスタンスにオブジェクトストレージに保存されたBlobがあった場合、オブジェクトストレージがそれらの種類のBlob用に設定されていることを確認してください。
- バックアップされたGitLabインスタンスにファイルシステムに保存されたblobがあった場合、NFSが設定されていることを確認してください。
-
新しいシークレットや設定を使用し、リストア中の予期せぬ設定変更を避けるため:
- すべてのノードへのLinuxパッケージのインストール:
-
Helmチャート(Kubernetes)のインストール:
-
すべてのGitLab Linuxパッケージノードで、実行します:
sudo gitlab-ctl reconfigure sudo gitlab-ctl start
-
Chartをデプロイして、GitLabインスタンスが稼働していることを確認します。以下のコマンドを実行して、Toolboxポッドが有効で実行されていることを確認します:
kubectl get pods -lrelease=RELEASE_NAME,app=toolbox
-
Webservice、Sidekiq、Toolboxポッドを再起動する必要があります。これらのポッドを再起動する最も安全な方法は、実行することです:
kubectl delete pods -lapp=sidekiq,release=<helm release name> kubectl delete pods -lapp=webservice,release=<helm release name> kubectl delete pods -lapp=toolbox,release=<helm release name>
-
-
デスティネーションのGitLabインスタンスがまだ動作することを確認します。例えば
- ヘルスチェックエンドポイントにリクエストを行います。
- GitLab check Rake タスクを実行します。
-
PostgreSQL データベースに接続する GitLab サービスを停止します。
-
PumaまたはSidekiqが稼働しているすべてのノードでLinuxパッケージのインストールを実行します:
sudo gitlab-ctl stop
-
Helmチャート(Kubernetes)のインストール:
-
その後の再起動のために、データベースクライアントの現在のレプリカ数をメモしておきます:
kubectl get deploy -n <namespace> -lapp=sidekiq,release=<helm release name> -o jsonpath='{.items[].spec.replicas}{"\n"}' kubectl get deploy -n <namespace> -lapp=webservice,release=<helm release name> -o jsonpath='{.items[].spec.replicas}{"\n"}' kubectl get deploy -n <namespace> -lapp=prometheus,release=<helm release name> -o jsonpath='{.items[].spec.replicas}{"\n"}'
-
ロ ッ ク に よ る 復元処理の妨げを防ぐ ために、 デー タ ベース の ク ラ イ ア ン ト を停止 し ます:
kubectl scale deploy -lapp=sidekiq,release=<helm release name> -n <namespace> --replicas=0 kubectl scale deploy -lapp=webservice,release=<helm release name> -n <namespace> --replicas=0 kubectl scale deploy -lapp=prometheus,release=<helm release name> -n <namespace> --replicas=0
-
-
オブジェクト・ストレージ・データのリストア
各バケットはAWS内に個別のバックアップとして存在し、各バックアップは既存または新規のバケットにリストアすることができます。
-
バケットをリストアするには、適切な権限を持つIAMロールが必要です:
AWSBackupServiceRolePolicyForBackup
AWSBackupServiceRolePolicyForRestores
AWSBackupServiceRolePolicyForS3Restore
AWSBackupServiceRolePolicyForS3Backup
- 既存のバケットを使用する場合は、アクセス制御リストが有効になっている必要があります。
- ビルトインツールを使用してS3バケットをリストアします。
- リストアジョブの実行中に、PostgreSQLデータのリストアに進むことができます。
PostgreSQLデータのリストア
- 新しいRDSインスタンスを作成する組み込みツールを使用して、AWS RDSデータベースをリストアします。
-
新しいRDSインスタンスは異なるエンドポイントを持っているので、新しいデータベースを指すようにデスティネーションのGitLabインスタンスを再設定する必要があります:
-
Linux パッケージのインストールについては、Using a non-packaged PostgreSQL database management server に従ってください。
-
Helmチャート(Kubernetes)のインストールについては、GitLabチャートを外部データベースで設定するを参照してください。
-
- 次に進む前に、新しいRDSインスタンスが作成され、使用できるようになるまで待ちます。
Git リポジトリの復元
復元するノードを選択または作成します:
- Linuxパッケージインストールの場合は、Railsノードを選択します。これは、通常PumaまたはSidekiqを実行しているノードです。
-
Helmチャート(Kubernetes)のインストールでは、Gitリポジトリのバックアップノードがまだない場合は、今すぐ作成してください:
- 8vCPU、7.2GBメモリのVMをスピンアップします。GitデータのバックアップにはPraefectノードを使用できないため、このノードはGitリポジトリのバックアップと復元に使用します。
- このノードを、リファレンスアーキテクチャで定義されている別のGitLab Railsノードとして設定します。他のGitLab Railsノードと同様に、このノードはメインのPostgreSQLデータベースとGitaly Clusterにアクセスできる必要があります。
- バックアップしたシークレットをターゲットのGitLabにリストアします。
Git リポジトリをリストアするには:
- ノードに、Gitリポジトリの
.tar
ファイルとその抽出データの両方を保存するのに十分なストレージが接続されていることを確認します。 - GitLab RailsノードにSSH接続します。
-
オブジェクトストレージデータのリストアの一環として、GitリポジトリのGitLabバックアップ
.tar
ファイルを含むバケットをリストアしておく必要があります。 -
バックアップ
.tar
ファイルをバケットからgitlab.rb
設定gitlab_rails['backup_path']
に記述したバックアップ・ディレクトリにダウンロードします。デフォルトは/var/opt/gitlab/backups
です。バックアップファイルの所有者はgit
ユーザーでなければなりません。sudo cp 11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar /var/opt/gitlab/backups/ sudo chown git:git /var/opt/gitlab/backups/11493107454_2018_04_25_10.6.4-ce_gitlab_backup.tar
-
復元したいバックアップのタイムスタンプを指定して、バックアップを復元します:
リストアコマンドは、インストールがPgBouncerを使用している場合、パフォーマンス上の理由、またはPatroniクラスターで使用する場合、追加のパラメータが必要です。# This command will overwrite the contents of your GitLab database! # NOTE: "_gitlab_backup.tar" is omitted from the name sudo gitlab-backup restore BACKUP=11493107454_2018_04_25_10.6.4-ce
バックアップしたtarファイルとインストールしたGitLabのバージョンに不一致がある場合、restoreコマンドはエラーメッセージを出して中断します。正しいGitLabのバージョンをインストールしてから、もう一度試してください。
-
GitLabを再起動して確認してください:
-
Linux パッケージのインストール:
-
すべてのPumaまたはSidekiqノードで実行します:
sudo gitlab-ctl restart
-
1つのPumaまたはSidekiqノードで実行します:
sudo gitlab-rake gitlab:check SANITIZE=true
-
-
Helmチャート(Kubernetes)のインストール:
-
前提条件」に記載したレプリカ数を使用して、停止したデプロイを開始します:
kubectl scale deploy -lapp=sidekiq,release=<helm release name> -n <namespace> --replicas=<original value> kubectl scale deploy -lapp=webservice,release=<helm release name> -n <namespace> --replicas=<original value> kubectl scale deploy -lapp=prometheus,release=<helm release name> -n <namespace> --replicas=<original value>
-
Toolboxポッドで実行します:
sudo gitlab-rake gitlab:check SANITIZE=true
-
-
-
特に、
/etc/gitlab/gitlab-secrets.json
がリストアされた場合、または別のサーバーがリストアの対象となった場合に、データベースの値が復号化できることを確認します:-
Linuxパッケージ・インストールの場合、PumaまたはSidekiqノードで実行します:
sudo gitlab-rake gitlab:doctor:secrets
-
Helmチャート(Kubernetes)のインストールの場合、Toolboxポッドで、以下を実行します:
sudo gitlab-rake gitlab:doctor:secrets
-
-
保証を強化するために、アップロードされたファイルの整合性チェックを実行できます:
-
Linuxパッケージ・インストールの場合、PumaまたはSidekiqノードで実行します:
sudo gitlab-rake gitlab:artifacts:check sudo gitlab-rake gitlab:lfs:check sudo gitlab-rake gitlab:uploads:check
-
Helmチャート(Kubernetes)のインストールの場合、これらのコマンドはすべての行を繰り返し実行するため時間がかかることがあるので、ToolboxポッドではなくGitLab Railsノードで以下のコマンドを実行してください:
sudo gitlab-rake gitlab:artifacts:check sudo gitlab-rake gitlab:lfs:check sudo gitlab-rake gitlab:uploads:check
見つからないファイルや破損したファイルが見つかっても、必ずしもバックアップとリストアプロセスが失敗したとは限りません。例えば、ソースGitLabインスタンス上でファイルが見つからないか、壊れている可能性があります。以前のバックアップを相互参照する必要があるかもしれません。GitLabを新しい環境にマイグレーションする場合、ソースGitLabインスタンスで同じチェックを実行して、整合性チェックの結果が既存のものなのか、バックアップとリストアプロセスに関連しているのかを判断することができます。
-
リストアは完了するはずです。