バックアップと復元訓練
別の対象でバックアップのデータとpointerを照合します
作業内容
ComposeのDBとcheckpoint objectをバックアップし、別project・新しい空bucketでpointerのversionを照合します。APIと実際のセッション再開は別の証拠として確認します。
準備
正常な設置、releaseと秘密鍵の別保管、十分な容量、writerを止める保守時間が必要です。バックアップはDB全体とAPI key hashを含むため権限0700、転送・保管時の暗号化を適用します。運用bucketへ復元しません。release bundleは backup・reseed・restore-drill を拒否するため、設置commitのcheckoutで実行します。
手順
1. バックアップする
scripts/test-ops.sh backupapi・scheduler・reconciler・workerを止め、DBとobjectを状態ディレクトリの backups/backup-<timestamp> にまとめてサービスを再開します。進行turnは中断され後で回収対象になり得るため先に確認します。失敗した .failed や未完成の .partial を成功本として使いません。保存が完了してもサービス再開に失敗するとコマンドは失敗します。
毎日利用の少ない時間と各更新直前に実行します。保管例はホスト14日、暗号化外部保管90日です。新しい成功本が26時間ない、non-zero終了、サービス再開失敗のいずれかで通知します。
2. 別の対象へ復元する
S3は毎回新しい空の訓練bucketを準備します。元bucket、object versionやdelete markerがある対象は拒否されます。
# Restore a backup into a throwaway project and a new, empty bucket, then verify it
scripts/test-ops.sh restore-drill /var/lib/werft/test-ops/backups/backup-<timestamp> --bucket <drill-bucket> --port-base 25432--port-base は訓練サービスの別開始ポートです。他の設置と重ならない値を選びます。LocalStack試験では --bucket を省きます。postgresとobject storeを復元し、すべてのcheckpoint pointerをversion単位で照合します。APIは起動しません。月1回と更新後の最初のバックアップで実施します。
3. checkpoint GC
バックアップと重ならない週次予定で先にdry-runします。
API_CONTAINER='<api-container-id-from-this-installation>'
docker exec -e CHECKPOINT_GC_DRY_RUN=1 "$API_CONTAINER" \
bun run apps/control-host/src/api/checkpoint-gc.tsAPI_CONTAINERを今回のstatusとproject labelで特定します。出力の保持・削除対象を確認してから、dry-run用の環境変数を外して実行します。既定Compose projectの他の設置を選ばないでください。Kubernetesはchartの checkpointGc.schedule を使います。
確認
終了コードとstatus、実際に比較したcheckpoint数・version数・checksum結果を記録します。nothing was compared は空の照合で、データ復元の証拠ではありません。従来のLocalStack実行はobject 0・checkpoint 0行でした。AWS S3復元とAPIを起動した実セッション再開は未確認です。別の隔離環境で復元API・workerによる継続を確認する必要があります。
よくある問題
対象が元bucketまたは空でなければ停止します。legal holdとretentionでversionを削除できない場合、勝手に保護を外さず対象と保持契約を調べます。出力は restore-drills/ とhistoryに残ります。
元に戻す
訓練ツールは終了時に今回のprojectを片付けます。調査用 --keep なら確認後そのprojectだけdownし、volumeは別の保持方針で処理します。訓練bucketを運用と区別し、再利用データがないことを確認して各versionのlegal hold解除 → version/delete marker削除 → 空bucket削除の順で処理します。retentionは迂回せず期限を待ちます。試験のために運用バックアップを消しません。
次に読む
Compose更新、ストレージと上限。KubernetesのDB・S3復元は運用バックアップ契約に従います。