Cloud Run を利用して大規模に Cloud Spanner で PostgreSQL ドライバを使用する方法
Google Cloud Japan Team
※この投稿は米国時間 2023 年 10 月 14 日に、Google Cloud blog に投稿されたものの抄訳です。
金融サービス、ゲーム、小売など多くの業界の先進的なお客様が Cloud Spanner を使用して、ダウンタイムがなくスケーリングが必要な、要件の厳しいリレーショナル データベースのワークロードに対応しています。Google の分散インフラストラクチャ上に構築された Cloud Spanner は、あらゆるスケールにおいて最高レベルの整合性と可用性を備えたフルマネージド エクスペリエンスを提供します。Cloud Spanner の PostgreSQL Interface を使用すると、Spanner の機能をオープンソースの PostgreSQL エコシステムから利用できます。
Cloud Run はフルマネージドのランタイムで、コンテナ内のコードをゼロから適切な数のインスタンスに自動スケールして、すべての受信リクエストに対応できるようにします。Cloud Spanner と Cloud Run を併用することで、オペレーショナル アプリケーションにおいてエンドツーエンドのスケーリングと可用性を実現できます。サイドカー コンテナはメインコンテナと並行的に実行されるコンテナで、既存コンテナの変更を伴わずに機能を追加します。Cloud Run もサイドカーをサポートするようになり、ウェブ リクエストを処理するメインコンテナの他に、独立したサイドカー コンテナを起動して実行できるようになりました。
Cloud Spanner PGAdapter は軽量のプロキシで、PostgreSQL ネットワーク プロトコルを Cloud Spanner gRPC プロトコルに変換します。これにより、アプリケーションは PostgreSQL の標準ドライバとフレームワークを使用して Cloud Spanner PostgreSQL データベースに接続できます。
このブログ記事では、PGAdapter を Cloud Run のサイドカーとして構成する方法について説明します。この設定では、アプリケーションと PGAdapter 間のレイテンシが可能な限り低く抑えられ、PGAdapter のインスタンス数がアプリケーションのインスタンス数に応じて自動スケールされます。
概要
Cloud Run インスタンス内のコンテナはすべて同じネットワーク名前空間を共有し、localhost:port 経由で相互に通信できます。また、共有ボリュームを使用して、コンテナ間でファイルを共有できます。アプリケーション コンテナはインターネットからのトラフィックを受信するコンテナです。PGAdapter はサイドカー コンテナとして設定されます。サイドカーはメインコンテナと並行して実行される追加のコンテナで、Cloud Run インスタンス内からのアクセスのみが認められます。
アプリケーションが PGAdapter に接続するには、次のいずれかの方法を利用します。
- localhost:5432(または PGAdapter 用に指定した任意のポート)での TCP 接続
- インメモリ共有ボリュームを使用する Unix ドメイン ソケット
この例では、Unix ドメイン ソケットを使用する方法について説明します。この方法の場合、アプリケーション コンテナと PGAdapter の間のレイテンシを可能な限り低く抑えることができます。
構成
現在、Cloud Run のサイドカーを構成するには、service.yaml ファイルを使用する必要があります。このセクションでは、次の内容について説明します。
- PGAdapter をサイドカーとして構成する方法
- 共有インメモリ ボリュームを Unix ドメイン ソケット用に設定する方法
- PGAdapter の起動プローブを設定する方法
PGAdapter をサイドカーとして構成する
Cloud Run にサイドカー コンテナを作成するには、コンテナリストに複数のコンテナを追加します。コンテナポートを指定するコンテナがメインコンテナになります。コンテナポートを指定できるコンテナは 1 つのみです。他のコンテナはすべてサイドカー コンテナになります。
この 2 つのコンテナはループバック ネットワーク インターフェースを共有します。これにより、アプリケーション コンテナは標準の PostgreSQL ドライバを使用して、localhost:5432 にあるデフォルトの PGAdapter ポートに接続できます。
共有ボリュームを Unix ドメイン ソケット用に構成する
PostgreSQL ドライバはほとんどが Unix ドメイン ソケットを使用する接続をサポートしています。Unix ドメイン ソケットは、同じホストマシン上で実行されるプロセス同士が通信するためのエンドポイントです。通信チャネルとして通常はファイルを使用します。Unix ドメイン ソケットのレイテンシは TCP 接続よりも低くなります。
PGAdapter も Unix ドメイン ソケットをサポートしています。Unix ドメイン ソケットを利用するために、両方のコンテナからアクセスできるボリュームが必要になります。Cloud Run はこれを共有インメモリ ボリュームという形で実現します。次の例では、ここまでの設定に共有ボリュームを追加します。
この構成により、次のものが追加されます。
- sockets-dir という名前を持つ共有インメモリ ボリューム。
- 共有ボリュームをアプリケーション コンテナにマウントするためのマウントパス /sockets。
- 共有ボリュームを PGAdapter コンテナにマウントするためのマウントパス /sockets。
- PGAdapter のコマンドライン引数 -dir /sockets。これは Unix ドメイン ソケットの受信をこのパスでリッスンするように PGAdapter に指示します。
PGAdapter の起動プローブを構成する
コンテナは一定の順番で起動するように構成できますが、起動プローブを追加して、特定のコンテナが別の特定のコンテナの起動前に起動するように構成することもできます。この方法を利用して、メインのアプリケーション コンテナが起動する前に確実に PGAdapter が起動しているように構成します。
この構成では、PGAdapter コンテナをメインのアプリケーション コンテナの依存関係として登録します。これにより、PGAdapter が確実にアプリケーション コンテナより先に起動します。また、Cloud Run は起動プローブを使用して、PGAdapter がアプリケーション コンテナの起動前に正常に起動していることを確認します。起動プローブはポート 5432 で正常に TCP 接続できているかどうかをチェックします。このポートは PGAdapter が接続の受信をリッスンするデフォルトのポートです。
アプリケーション コード
メインのアプリケーションは PGAdapter への接続に PostgreSQL の標準ドライバを使用します。この例では、Go と pgx ドライバを使用します。他のプログラミング言語やドライバを使用するサンプルの完全なリストはこちらのディレクトリをご覧ください。
アプリケーションは PGAdapter への接続に、/sockets にマウントされている共有インメモリ ボリュームの Unix ドメイン ソケットを使用します。ホストがスラッシュで始まるため、pgx ドライバは TCP ソケットではなく Unix ドメイン ソケットを使用することを自動的に認識します。
接続文字列で使用される Cloud Spanner データベース名は、projects/my-project/instances/my-instance/databases/my-database
という形式の完全修飾データベース名にする必要があります。
このサンプル アプリケーションはシンプルな HTTP サーバーを起動し、ポート 8080 でリッスンします。リクエストを受信するたびに PGAdapter に接続し、Hello World! を返すクエリを実行します。このメッセージは HTTP サーバーのレスポンス ストリームに出力されます。
他のプログラミング言語の同様のサンプルはこちらからご覧いただけます。
まとめ
Cloud Run のサイドカーを導入すると、Cloud Spanner を使用するスケーラブルなアプリケーションのデプロイが大幅に簡素化します。
Cloud Spanner の PostgreSQL Interface を使用すると、デベロッパーはすでに知っている SQL を使用し、Spanner の整合性と可用性をスケールに応じて利用できます。PGAdapter を使用すると、Cloud Spanner で PostgreSQL の既製のドライバやフレームワークを使用できるようになります。現在 PostgreSQL アプリケーションで使用されているものと同じものです。Cloud Run はアプリケーションの柔軟なスケーリングで Spanner を補完します。サイドカー コンテナを追加することにより、アプリケーションの関連プロセスを自動スケールする柔軟性が得られます。サイドカーからインメモリ ボリュームの Unix ドメイン ソケットを使用すると、アプリケーションと PGAdapter の間の通信はレイテンシが可能な限り低く抑えられます。
Spanner の独自性や使用例の詳細はこちらをご覧ください。または、90 日間無料で、あるいは月額わずか $65 で、中断を伴う再構築やダウンタイムなしでビジネスの成長に合わせて拡張できる本番環境対応のインスタンスを実際にお試しください。
ー ソフトウェア エンジニア Knut Olav Løite