テラバイトのPostgresデータベースを10秒でクローンする方法
すべてのバックエンド開発者は、失敗したマイグレーションでステージング環境をクラッシュさせた経験があるか、本番環境のテーブルで30分間のデッドロックを引き起こす5行のテストデータで重いSQLクエリをテストした経験があるか、あるいはその両方を持っているでしょう。本番と同じデータ量でのテストは常に困難で高価です:1テラバイトのデータベースをローカル環境に構築するのは難しく、クラウドに各開発者向けの完全なコピーを10個保持するには多額の費用がかかります。
Postgres.aiのエンジニアたちは、Database Lab Engine(DBLab)ユーティリティでこの問題を解決します。このプロジェクトにより、テラバイト単位のディスク消費なしに、任意のサイズのPostgresデータベースの薄いクローンを文字通り数秒で作成できます。
内部動作
薄いクローンの技術は、Copy-on-Write(CoW)メカニズムに依存しています。デフォルトではDBLabはZFSファイルシステムを使用しますが、LVM経由でも動作できます。
仕組みはシンプルです:
- エンジンは、データの最新のベーススナップショット(PGDATA)を保持し、レプリケーション、ダンプ、物理バックアップ(WAL-G、pgBackRest)を通じてプライマリデータベースと同期します。
- 開発者やCIパイプラインがデータベースインスタンスを必要とするとき、DBLabはスナップショットを作成し、Dockerコンテナ内で分離されたPostgresを起動します。
- すべての書き込み操作は別のCoWレイヤーに書き込まれます。ベースファイルは変更されないため、1TBのデータをクローンしても約10秒で完了し、最初は数メガバイトのディスク容量만 필요합니다。
1台のサーバーで数十の独立したデータベースを実行でき、開発者は同僚に影響を与えることなく、安全にDROP TABLEを実行したり、破壊的なマイグレーションを実行したりできます。
DBLabでできること
リポジトリには、データスナップショット作業の自動化のための基盤が含まれています:
- データベースブランチング。異なるブランチやタイムスタンプ間を切り替え、
resetコマンドで変更をロールバックし、任意の状態に戻ることができます。 - PostgreSQLバージョン10から18までのサポート。pgvectorやHypoPGなどの一般的な拡張機能も含みます。
- 組み込みの保護メカニズム:タイムアウトによる古い未使用のクローンの自動削除と、スナップショットの保持ポリシー。
- 管理クラウドデータベースとの統合。AWS RDS、GCP Cloud SQL、Supabaseなど、直接的なファイルシステムアクセスがない場合、DBLabは別の仮想マシンにデプロイして、定期的な自動データ更新で構成できます。
- готовые管理インターフェース:REST API、dblab CLIコンソールユーティリティ、Webインターフェース。
実践的なシナリオ
CI/CDでのマイグレーションテスト
リリースを展開する前に、パイプラインは本番データベースの新しいクローンを起動し、マイグレーションを適用して、実行時間とロックを測定します。マイグレーションが重いテーブルで排他的ロックを獲得したり、エラーで失敗したりした場合、パイプラインは即座に通知します。テスト後、クローンはすぐに削除されます。
複雑なSQLクエリと仮説のテスト
空のデータベースで遅いクエリを最適化しても意味がありません:Postgresのプランナーは、10行と1000万行では完全に異なる実行プランを選びます。DBLabのクローンなら、本番規模のデータで正直なEXPLAIN (ANALYZE, BUFFERS)を取得でき、ライブデータベースを過負荷にするリスクがありません。
LLMからのコードテスト
AIに複雑な分析クエリやデータスキーマを生成させると、ハルシネーションを返す可能性が高いです。クローンは隔離されたサンドボックスを提供し、生成されたコードを быстро実行してその正確性を検証できます。
このプロジェクトの対象者
プロジェクトのデータベースが数ギガバイト程度であれば、ZFSとDBLabを使用したインフラストラクチャの構築はやり過ぎかもしれません—just обычный дампを使用してください。
しかし、Postgresが数百ギガバイトまたはテラバイトに達し、チームの誰もが手動テスト環境の準備に時間を費やして各マイグレーションを恐れている場合、Database Lab Engineは神経とクラウドインフラコストを大幅に節約できます。
エンジンのソースコードはApache 2.0ライセンスの下でオープンソース化されています。公式ドキュメントのガイドに従って、独自のサーバーでCommunityバージョンを試すことも、demo.dblab.devでパブリックデモをテストすることもできます。
関連プロジェクト