Spanner 地域別パーティション分割 入門

メディア統括本部 サービスリライアビリティグループ(SRG)の松田正也(@mm_matsuda816)です。
#SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
本記事は、CyberAgent Group SRE Advent Calander 2024 2日目の記事です。
Spannerの地域別パーティション分割の使い方や費用について整理します。
地域別パーティション分割の導入を検討している方のサポートになれば幸いです。
 

地域別パーティション分割とは


2024/07/16にリリースされた機能で2024/12/02時点でプレビュー機能です。
Spannerではこれまで、マルチリージョン構成インスタンスを利用することで、地理的に離れた拠点間でデータを透過的に扱うことができましたが、地域別パーティションを活用することで、データベースのテーブル内の行単位で異なる地域のインスタンスに保存することができます。
 
リリース内容はこちらのページをご参照ください。

主な利点

  • クエリを実行する地域と地理的に近い場所のパーティションにデータを保存することで、従来のマルチリージョン構成と比較して、書き込みレイテンシと強力な読み取りレイテンシの短縮効果が期待できます。
  • 地域ごとのワークロードの傾向が異なる場合に、従来のマルチリージョン構成と比較して、最適化しやすくなります。
    • asia-northeast1とus-east1の負荷割合が10:2であれば、asia-northeast1には10ノードのパーティション、us-east1には2ノードのパーティション というように作成できます。

主な制限事項

2024/12/02 プレビューリリース時点の制限事項です。今後変わる可能性があります。
  • Spanner Enterprise Plus エディションで使用できる。
  • インスタンスごとに作成できるパーティションは最大10。
  • PostgreSQL言語データベースをサポートしていない。
  • デュアルリージョン構成のインスタンスパーティションは作成できない。
  • 1インスタンス内で、同じベースインスタンス構成の異なるパーティションは作成できない。
  • パーティション内のノードごとに最大2,000万個のplacemant行を配置できる。
    • Englishドキュメントでは1億になっており、実際の挙動は確認していません。
  • placement行を追加する場合は、パーティション内のノードごとに1秒あたり約10個ずつ移動できる。
  • 1ノード(1,000 Processing Unit)未満のインスタンスではパーティションを作成できない。
  • パーティションがあるインスタンスのバックアップは作成できない。
  • パーティションがあるインスタンスには、顧客管理の暗号鍵を使用できない。
  • マネージドオートスケーラーが有効になっているインスタンスにはパーティションを作成できない。
  • パーティションがあるインスタンスは移動できない。行ごとに別のパーティションに移動できる。
  • パーティションを使用しても、コンプライアンスと規制要件が保証されるわけではない。
  • Change Streamはパーティション分割されたデータをサポートしない。
  • 地域別パーティション分割を使用するには、新しい空のデータベースを作成し、`opt_in_dataplacement_preview`オプションを有効化する必要がある。
  • placement keyが設定されているテーブルにINSERTまたはDELETE DMLステートメントを使用する場合は、そのステートメントがトランザクション内の唯一のステートメントである必要がある。
 
本番環境での利用を検討する上では、バックアップが作成できないことが最もネックとなりうるかもしれません。GAまでに作成できるようになって欲しいですね。

使い方


実際に地域別パーティション分割を利用するplacement key付きテーブルを作成し、操作していきます。

インスタンスを作成

データベースを作成

パーティションを作成

us-east1のみのパーティションとasia-northeast1のみのパーティションを作成します。
後述しますが、パーティションごとに最低1,000PUを割り当てる必要があるため、パーティションを作成すると追加費用が発生します。

placementを作成

作成したplacementは単体で削除できず、databaseを削除するときに同時に削除されます。
instance_partitionには前項で作成したパーティション名を設定します。
 

placement key付きテーブルを作成

公式ドキュメントのサンプルと同じテーブルを作成します。
placement keyのカラムはdropできません。また、作成済みのテーブルに対して追加設定することもできません。

INSERT

Locationを指定すること以外は通常と変わりません。

SELECT

UPDATE

Locationが1つのみ対象となるクエリにする必要があります。
複数Locationのデータに対して操作したい場合はそれぞれでクエリを分割する必要があります。

DELETE

UPDATEと同様に、Locationが1つのみ対象となるクエリにする必要があり、複数Locationのデータに対して操作したい場合はそれぞれでクエリを分割する必要があります。

費用

Enterprise Plus Editionが必須となります。
2024/12/02時点では1時間あたり$5.13です。
https://cloud.google.com/spanner/pricing?hl=ja から抜粋
https://cloud.google.com/spanner/pricing?hl=ja から抜粋

パーティションについて

データベースを作成するとdefaultパーティションが作成され、インスタンスと同じマルチリージョン構成となります。
Google Cloud Consoleより
Google Cloud Consoleより
パーティションを追加すると専用のNodeを作成するため、追加費用が発生します。
Google Cloud Console より
Google Cloud Console より
 

リードオンリーレプリカの配置について

リードオンリーレプリカを作成するのかどうかは、パーティションがあるリージョン以外からアクセスする場合に、ステイル読み取りリクエストによりn秒前のタイムスタンプデータ参照が許容できるデータがどれくらいあるのかが判断基準になると思います。
詳細は以下のページを参照してください。
 
GDPR対応で地域別パーティション分割を利用する場合は、該当地域にのみレプリカを配置することになります。
実際に方針を決める際は、以下のページを参照してください。
 

終わりに


Spannerの地域別パーティション分割の利用方法や費用について解説しました。
 
明日CyberAgent Group SRE Advent Calander 2024 3日目は初日に引き続き柘植さんです。
 
SRG では一緒に働く仲間を募集しています。 ご興味ありましたらぜひこちらからご連絡ください。
 
このエントリーをはてなブックマークに追加