Spanner を PostgreSQL 言語データベースに移行する

このページでは、Spanner から別の PostgreSQL 言語データベースに移行する際の重要な考慮事項と手順について説明します。これは、Spanner または Google Cloudからアプリケーションを移行する場合に役立ちます。データベースの移行の実現可能性を理解または実証する必要がある場合(ストレス エグジットの障害対策など)は、このページの情報を使用することもできます。

Spanner の PostgreSQL Interface は、 Google Cloud内または他の場所にある、PostgreSQL 互換の別の環境にデプロイするオプションが必要なアプリケーションに最適です。PostgreSQL インターフェースでは、PostgreSQL エコシステムの使い慣れた構文と標準クライアントを使用して、デベロッパーとオペレーターは既存の PostgreSQL の知識とスキルを使用できます。

GoogleSQL 言語と同じクエリ処理、トランザクション調整、分散ストレージ、ネットワーク インフラストラクチャを使用します。移植性をサポートするデータベースが必要な場合、PostgreSQL Interface を選択しても、Spanner のコア スケーラビリティ、整合性、コスト パフォーマンスのメリットを損なうことはありません。

Spanner の PostgreSQL 言語と GoogleSQL 言語の違いについて学びます。

大まかな手順は次のとおりです。

  1. クエリと DDL ステートメントから Spanner 固有の拡張機能を削除
  2. スキーマを移行する
  3. データを移行する
  4. アプリケーションを移行する

Spanner 固有の考慮事項

Spanner の PostgreSQL Interface は PostgreSQL クエリを標準でサポートしているため、Spanner PostgreSQL 言語データベースで実行されるほとんどの SQL クエリは、他の PostgreSQL 互換データベースと同じように動作します。このアプローチを使用すると、アプリケーションをプラットフォーム間で移動するために必要な SQL とデータアクセスの変更数は少なくなります。これにより、同様の GoogleSQL 言語データベースよりも移植プロセスが迅速かつ容易になり、エラーが発生しにくくなります。

PostgreSQL Interface は、PostgreSQL との幅広い互換性に加えて、Spanner 固有の拡張機能を多数提供しています。アプリケーションでこれらの拡張機能を使用する場合は、拡張機能を削除するか、PostgreSQL 機能に手動でマッピングする必要があります。注目すべき例については、クエリ構文の拡張スキーマ管理(DDL)の拡張をご覧ください。

クエリ構文の拡張

Spanner の PostgreSQL Interface には、Spanner 固有の拡張機能が多数用意されています。ほとんどは、識別に接頭辞 spanner. を使用します。次の表に、これらの拡張機能と、同じアプリケーションを PostgreSQL データベースで実行する前に必要な操作を示します。

拡張機能の種類 特定の拡張機能 移行前に行うべきこと
Spanner 固有の関数 接頭辞 spanner. の関数を見つけて、これらの呼び出しを削除します。
タイプ拡張機能 VECTOR LENGTH 構文を削除するか、pgvector の使用を検討してください。
クエリ構文 ヒントはコメント内に表示されるため、対応は必要ありません。
パフォーマンスに関する考慮事項の詳細については、クエリの移行をご覧ください。
ストアド システム プロシージャ spanner.cancel_query() の呼び出しを削除します。
必要に応じて、呼び出しを PostgreSQL の同等に置き換えることができます。
SET/SHOW オペレーション PostgreSQL には spanner. で始まる組み込みパラメータがないため、この接頭辞で変数を設定しても、想定される動作に影響しません。

スキーマ管理(DDL)拡張機能

Spanner には、データ定義言語(DDL)ページで説明されているように、データ管理に関連するさまざまな拡張機能が用意されています。

拡張機能 移行前に行うべき操作
インターリーブされたテーブル
多対 1 の関連データを物理ストレージに配置することで、それらの間の結合を大幅に効率化します。
INTERLEAVE IN 句を削除します。
commit タイムスタンプ
トランザクションの commit タイムスタンプを列にアトミックに格納できます。
SPANNER.COMMIT_TIMESTAMP を PostgreSQL タイムスタンプ型に置き換えて、アプリケーションでタイムスタンプの設定を管理するか、その列を削除します。
ポイントインタイム リカバリ
誤った削除や書き込みから保護します。
spanner.version_retention_period を設定する DDL ステートメントを削除します。
有効期間(TTL)
レコードの自動削除を年齢に基づいてプロンプトします。
TTL INTERVAL 句を削除します。cron またはスケジュール設定されたタスクを使用して、古いデータを定期的に削除することを検討してください。行。
オプティマイザー オプション
クエリ オプティマイザーまたは統計情報が変更されたときのパフォーマンス低下の可能性を最小限に抑えるオプションを設定します。
オプティマイザー オプションを設定する DDL ステートメントを削除します。
変更ストリーム
Spanner データベースのデータ変更(挿入、更新、削除)をほぼリアルタイムで監視してストリーミングします。
変更ストリームに関連する DDL ステートメントを削除します。
デフォルトのリーダー
デュアルリージョン構成とマルチリージョン構成でデータベースのリーダーを指定できます。
spanner.default_leader を設定する DDL ステートメントを削除します。
地域別パーティション分割
データベース テーブル内の行をさらにセグメント化し、異なるインスタンス構成間で保存できます。
ジオパーティショニングに関連する DDL ステートメントを削除します。
シーケンス
Spanner は bit_reversed_positive シーケンスのみをサポートします。
bit_reversed_positive は、PostgreSQL で使用可能なシーケンスに置き換えます。

スキーマの移行

PostgreSQL 言語データベース スキーマは PostgreSQL 構文でエクスポートできます。PostgreSQL インターフェースを使用するように構成されたデータベースの場合、標準の PostgreSQL ドライバまたはクライアント ライブラリを使用して Spanner に接続できるサイドカー プロキシである PGAdapter を使用して psql でこれを実現できます。

psql -v ON_ERROR_STOP=1 \
  --host "$PGADAPTER_HOST" \
  --port "$PGADAPTER_PORT" \
  --dbname "$SPANNER_DATABASE" \
  -qAtX \
  -c "show database ddl"

次の gcloud コマンドを使用して、PostgreSQL 互換の SQL スクリプトとしてスキーマを出力することもできます。

gcloud spanner databases ddl describe databasename

データベースが スキーマ管理拡張機能で説明されているような Spanner 固有のスキーマ拡張機能を使用する場合、このコマンドを実行すると、それらの拡張機能が一覧表示されます。スキーマを PostgreSQL に移行する前に、これらのオブジェクトを削除する必要があります。

データの移行

Spanner の PostgreSQL Interface は、PGAdapter を使用して PostgreSQL の COPY TO STDIN 拡張機能と STDOUT 拡張機能をサポートしています。これは、Spanner との間でデータを読み込む方法の一つです。COPY コマンドの詳細については、Spanner の psql コマンドライン ツールのドキュメントをご覧ください。

このスクリプトは、Spanner の PostgreSQL Interface から新しい PostgreSQL データベースに少量のデータをエクスポートします(100 GB 未満のデータに推奨)。

psql -h pgadapter-host -c "COPY $TABLE TO STDOUT BINARY" | \
psql -h postgresql-host -c "COPY $TABLE FROM STDIN BINARY"

サイズの大きいテーブル(100 GB 以上のデータ)の場合は、Dataflow から CSV テンプレートにエクスポートを開始できます。

Debezium Kafka コネクタを使用してライブデータ移行を実行し、Spanner の更新を PostgreSQL にストリーミングできます。Spanner Change Streams API を使用して変更データ キャプチャ(CDC)ストリームに直接アクセスすると、さらにカスタマイズできます。

クエリの移行

Spanner の PostgreSQL Interface は、最も一般的な PostgreSQL クエリ構文、関数、演算子の多くを実装しています。

クエリでヒントを使用している場合、Spanner のクエリヒントは PostgreSQL 互換のコメントで定義されているため、クエリを書き換える必要はありません。

SELECT s.FirstName, s.LastName,
 s.SingerInfo, a.AlbumTitle, a.Charts
FROM Singers AS s
LEFT OUTER JOIN/*@JOIN_METHOD=APPLY_JOIN*/ Albums AS a
 ON s.SingerId = a.SingerId;

これらのコメントは Spanner のクエリ プランナーによって処理されますが、PostgreSQL データベースでは無視されるため、コメントを含めるか削除するかを選択できます。

新しい環境で最適なパフォーマンスを実現するには、クエリとデータベース スキーマ(インデックスなど)を新しい環境に合わせて最適化する必要があります。ベンチマーク チェックを実行して、これを実証的に確認することをおすすめします。

アプリケーションの移行

アプリケーションからの接続に関しては、PostgreSQL ドライバ、Spanner ドライバ、Spanner クライアント ライブラリを使用するかどうかなど、Spanner を使用するようにアプリケーションを構成する際に行った最初の選択に応じて移行戦略が決まります。このセクションでは、各オプションの考慮事項について説明します。

PostgreSQL ドライバ

Spanner は、PGAdaper を使用して一般的な PostgreSQL クライアントをサポートします。PGAdaper は、PostgreSQL ワイヤ プロトコルを Spanner の低レベルの gRPC クエリ API に変換する軽量のプロキシです。これらのいずれかを使用している場合、別の PostgreSQL ターゲットに変更するには、接続文字列を更新して、PGAdapter プロキシではなく新しい PostgreSQL データベースを直接参照するようにします。このアプローチは優れたパフォーマンスと強力な互換性を提供するため、ポータビリティが最優先事項である場合に適しています。Spanner の PostgreSQL Interface で実行されるほとんどのクエリは、他の PostgreSQL 環境でも同じように機能します。ただし、その逆は必ずしも真実ではありません。PostgreSQL は、Spanner がサポートしていない構文と機能をサポートしています。

Spanner ドライバ

これらのドライバは、一般的な言語とアプリケーション フレームワーク用の Spanner 固有の実装です。たとえば、Spanner JDBC(Java)ドライバは PostgreSQL JDBC ドライバと同じ API を実装しているため、Spanner JDBC ドライバを使用するアプリケーションは、PostgreSQL でアプリケーションを実行する場合に、同等の組み込み PostgreSQL ドライバをリンクするようにビルドプロセスを更新できます。このオプションは、すでに Spanner を使用している場合や、組み込みの PostgreSQL ドライバでは公開されない Mutations API などの Spanner 機能を活用する高パフォーマンスのソリューションを探している場合に最適です。組み込みドライバとの完全な互換性と値のポータビリティが必要な場合は、代わりに PGAdapter で PostgreSQL の組み込みドライバを使用して、ある程度のアプリケーション ポータビリティを確保することを検討してください。

詳細については、PostgreSQL ドライバと ORM をご覧ください。

Spanner クライアント ライブラリ

また、Spanner には、PostgreSQL 標準のインターフェースを実装したり、そのインターフェースを経由したりすることなく、Spanner に直接アクセスできるさまざまな独自のクライアント ライブラリも用意されています。これらのクライアントは、Spanner 固有の機能に最大限にアクセスできますが、PostgreSQL ドライバと API 互換性はありません。これらのオプションは、特徴のパフォーマンスが最も高くなりますが、前述のオプションよりもポータビリティが低くなります。

次のステップ