このページでは、Spanner の読み取りリースとその使用方法について説明します。読み取りリースを使用すると、強整合性を必要とするトランザクションの非リーダー リージョンで、データベースの読み取りレイテンシを短縮できます。
デフォルトでは、Spanner がリーダー以外のリージョンで強力な読み取りリクエストを受信すると、読み取りを提供するレプリカはインスタンスのリーダー読み取り / 書き込みリージョンに接続します。この連絡先は、リクエストを処理する前にデータが最新であることを確認します。このプロセスでは、リクエストを受信するリージョンとリーダー リージョン間のネットワークの往復が発生します。単一リージョン内の通信とは異なり、リージョン間の地理的な距離によってリクエストにレイテンシが追加されます。
Spanner の読み取りリースを使用すると、このラウンド トリップが不要になります。データベースに 1 つ以上の読み取りリース リージョンを設定すると、Spanner は 1 つ以上の非リーダー、読み取り / 書き込み、または読み取り専用リージョンに読み取りをローカルで提供する権限を付与します。これにより、リーダー リージョンと通信せずに、リーダー以外のリージョンで強い読み取りを直接提供できます。クライアントに近いリーダー以外のリージョンから強い読み取りを行うと、リージョン間のレイテンシが短縮されます。これにより、デュアルリージョン インスタンスまたはマルチリージョン インスタンスの強力な読み取りでリージョン内レイテンシが実現します。
リージョンで読み取りリース機能を有効または無効にするためにダウンタイムは必要ありません。ただし、この機能を使用すると、書き込みのレイテンシが高くなります。これは、読み取りリースを有効にするには、書き込みの処理時にリーダーが読み取りリース リージョンに連絡する必要があるためです。副作用として、書き込みでロックが保持される時間が長くなり、競合の多い書き込みワークロードに影響する可能性があります。詳細については、読み取りリースを使用するタイミングをご覧ください。読み取りリースは、書き込みレイテンシの増加と引き換えに、高速な強い読み取りを求めるアプリケーションに最適です。たとえば、ワークロードで読み取りは頻繁に行われるが、書き込みはまれに行われるアクセス制御システムなどです。
非リーダー リージョンで読み取りリースを有効にする方法については、読み取りリースを使用するをご覧ください。
読み取りリースを使用する場合
アプリケーションとワークロードが次の条件を満たしている場合は、読み取りリースを有効にします。
- 書き込みの低レイテンシよりも、強力な読み取りの低レイテンシの方が重要です。
- ワークロードで書き込みロックの期間を長く許容できるか、書き込み競合が少ない。
読み取りリースを有効にすると、書き込みレイテンシが増加し、書き込みロックがより長く保持されます。書き込みワークロードですでに書き込み競合が多い場合、この機能により書き込みレイテンシが悪化し、スループットが低下する可能性があります。
同時書き込みがある場合、クエリ API を使用するか 読み取り API を使用するかによって、読み取りリース リージョンを使用するデータベースのパフォーマンスが影響を受けます。
Spanner で SQL ステートメントを実行するには、複数の行または範囲からデータを読み取る必要があります。読み取りリースが有効になっているクエリ API を使用する場合、読み取りは正確性を確保するために同時書き込みを待つ必要があります。そのため、特に書き込み負荷が高い場合は、レイテンシが長くなることがあります。一般に、読み取り API はクエリ API よりも同時書き込みに対する許容度が高くなります。書き込み負荷の高いクエリ API を頻繁に使用する場合は、書き込みの頻度を減らすか、代わりに古い読み取りを使用することを検討してください。
読み取り API は、特定の行またはデータ範囲の読み取り用に最適化されています。読み取ろうとしているデータとまったく同じデータを変更する書き込みを待つだけで済みます。読み取り API を使用している場合、読み取りをブロックするのは、まったく同じデータ範囲に対する書き込みのみです。その結果、同時書き込みがあり、読み取りリース リージョンを使用している場合、Spanner の強力な読み取りのパフォーマンスが向上し、レイテンシが短縮されます。
レイテンシのモニタリングの詳細については、モニタリングをご覧ください。
使用例
米国で書き込みを行い、米国、ヨーロッパ、アジアにクライアントを持つグローバルにデプロイされたアプリケーションを考えてみましょう。us-central1
にリーダー リージョン、europe-west1
と asia-east1
に読み取り専用レプリカがあるマルチリージョン Spanner インスタンス(nam-eur-asia1
など)を構成できます。
europe-west1
と asia-east1
の読み取り専用リージョンで読み取りリースを有効にすると、Spanner はヨーロッパとアジアからの強力な読み取りをローカル レプリカから提供し、レイテンシを短縮します。トレードオフは、すべての書き込みの書き込みレイテンシが増加することです。レイテンシの増加は、リーダー us-central1
リージョンと最も遠い読み取りリース リージョン間のラウンドトリップ時間に相当します。
制限事項
Spanner の読み取りリースには次の制限があります。
- 監視リージョンで読み取りリースを有効にすることはできません。
- 読み取りリースは、地域別パーティショニングでは使用できません。
- 読み取りリースは、読み取り / 書き込みトランザクションの一部である読み取りのレイテンシを短縮しません。読み取り / 書き込みトランザクションに読み取りのみが含まれている場合でも、それらの読み取りはリーダー リージョンから処理されます。
- インスタンスを別のインスタンス構成に移動すると、読み取りリース設定は保持されません。移動が完了したら、データベースの読み取りリースを再度有効にする必要があります。
読み取りリースを使用する
使用する前に、読み取りリースを有効にする必要があります。
IAM を使用したアクセス制御
読み取りリース リージョンを設定するには、spanner.databases.create
または spanner.databases.updateDdl
の IAM 権限が必要です。これらの権限は、事前定義のデータベース管理者ロール(roles/spanner.databaseAdmin
)に含まれています。詳細については、Spanner の IAM の概要をご覧ください。
権限を付与する方法については、IAM 権限を適用するをご覧ください。
PostgreSQL データベース ユーザーの開始前の準備
PostgreSQL データベースで読み取りリースを使用する場合は、データベースに対して次のいずれかの構成変更を行います。それ以外の場合、読み取りリース リージョンを設定していても、読み取りはリーダー リージョンによって処理されます。
読み取り専用トランザクションのみを使用する場合は、データベース内の各新しいトランザクションのデフォルト ステータスが読み取り専用に設定されるように PostgreSQL 接続を構成します。これを行うには、
default_transaction_read_only
オプションをtrue
に設定します。postgres://USER_ID:PASSWORD@localhost:5432/DATABASE_ID?sslmode=disable&options=-c \ default_transaction_read_only=true host=/tmp port=5432 database=DATABASE_ID \ options='-c default_transaction_read_only=true'
次のように置き換えます。
USER_ID は、ユーザーの一意の識別子に置き換えます。
PASSWORD は、パスワードに置き換えます。
DATABASE_ID は、データベースの一意の識別子に置き換えます。
読み取りリースを有効にする
新しいデータベースを作成するときに読み取りリースを有効にするには、ALTER DATABASE
(GoogleSQL、PostgreSQL)DDL ステートメントで read_lease_regions
オプションを設定します。
コンソール
Google Cloud コンソールの [インスタンス] ページに移動します。
読み取りリースを有効にするインスタンスを選択します。
開いた [インスタンスの概要] ページで、[データベースを作成] をクリックします。
データベース名を入力します。
データベース言語を選択します。
[作成] をクリックします。
Google Cloud コンソールに、作成したデータベースの [概要] ページが表示されます。
ナビゲーション メニューで [Spanner Studio] をクリックします。
[Spanner Studio] ページで、[
新しいタブ] をクリックするか、空のエディタタブを使用します。次の
ALTER DATABASE
DDL ステートメントを入力します。GoogleSQL
ALTER DATABASE DATABASE_ID SET OPTIONS (read_lease_regions = 'READ_LEASE_REGION');
次のように置き換えます。
DATABASE_ID: データベースの固有識別子。
READ_LEASE_REGION は、読み取りリースを有効にするリージョンに置き換えます。例:
europe-west1
複数のリージョンで読み取りリースを有効にできます。各地域はカンマで区切ります。
PostgreSQL
ALTER DATABASE DATABASE_ID SET "spanner.read_lease_regions" = 'READ_LEASE_REGION';
次のように置き換えます。
DATABASE_ID: データベースの固有識別子。
READ_LEASE_REGION は、読み取りリースを有効にするリージョンに置き換えます。例:
europe-west1
複数のリージョンで読み取りリースを有効にできます。各地域はカンマで区切ります。
[実行] をクリックします。
gcloud
データベースの作成時に read_lease_regions
データベース オプションを設定するには、gcloud spanner databases create
を使用します。
GoogleSQL
gcloud spanner databases create DATABASE_ID \
--instance=INSTANCE_ID \
--ddl="ALTER DATABASE DATABASE_ID SET OPTIONS (read_lease_regions = 'READ_LEASE_REGION');"
次のように置き換えます。
DATABASE_ID
: Spanner データベースの永続的な ID。INSTANCE_ID
: Spanner インスタンスの永続的な ID。READ_LEASE_REGION
: 読み取りリースを有効にするリージョン。例:europe-west1
複数のリージョンで読み取りリースを有効にできます。各地域はカンマで区切ります。
PostgreSQL
gcloud spanner databases create DATABASE_ID \
--instance=INSTANCE_ID \
--ddl="ALTER DATABASE DATABASE_ID \
SET "spanner.read_lease_regions" = 'READ_LEASE_REGION';"
次のように置き換えます。
DATABASE_ID
: Spanner データベースの永続的な ID。INSTANCE_ID
: Spanner インスタンスの永続的な ID。READ_LEASE_REGION
: 読み取りリースを有効にするリージョン。例:europe-west1
複数のリージョンで読み取りリースを有効にできます。各地域はカンマで区切ります。
既存のデータベースを更新するときに読み取りリースを有効にするには、ALTER DATABASE
(GoogleSQL、PostgreSQL)DDL ステートメントで read_lease_regions
オプションを設定します。
コンソール
Google Cloud コンソールの [インスタンス] ページに移動します。
読み取りリースを有効にするインスタンスを選択します。
読み取りリースを有効にするデータベースを選択します。
ナビゲーション メニューで [Spanner Studio] をクリックします。
[Spanner Studio] ページで、[
新しいタブ] をクリックするか、空のエディタタブを使用します。次の
ALTER DATABASE
DDL ステートメントを入力します。GoogleSQL
ALTER DATABASE DATABASE_ID \ SET OPTIONS (read_lease_regions = 'READ_LEASE_REGION');
次のように置き換えます。
DATABASE_ID: データベースの固有識別子。
READ_LEASE_REGION は、読み取りリースを有効にするリージョンに置き換えます。例:
europe-west1
複数のリージョンで読み取りリースを有効にできます。各地域はカンマで区切ります。
PostgreSQL
ALTER DATABASE DATABASE_ID \ SET "spanner.read_lease_regions" = 'READ_LEASE_REGION';
次のように置き換えます。
DATABASE_ID: データベースの固有識別子。
READ_LEASE_REGION は、読み取りリースを有効にするリージョンに置き換えます。例:
europe-west1
複数のリージョンで読み取りリースを有効にできます。各地域はカンマで区切ります。
[実行] をクリックします。
gcloud
read_lease_regions
データベース オプションを設定するには、gcloud spanner databases ddl update
を使用します。
GoogleSQL
gcloud spanner databases ddl update DATABASE_ID \
--instance=INSTANCE_ID \
--ddl="ALTER DATABASE DATABASE_ID \
SET OPTIONS (read_lease_regions = 'READ_LEASE_REGION');"
次のように置き換えます。
DATABASE_ID
: Spanner データベースの永続的な ID。INSTANCE_ID
: Spanner インスタンスの永続的な ID。- READ_LEASE_REGION は、読み取りリースを有効にするリージョンに置き換えます。例:
europe-west1
複数のリージョンで読み取りリースを有効にできます。各地域はカンマで区切ります。
PostgreSQL
gcloud spanner databases ddl update DATABASE_ID \
--instance=INSTANCE_ID \
--ddl="ALTER DATABASE DATABASE_ID \
SET "spanner.read_lease_regions" = 'READ_LEASE_REGION';"
次のように置き換えます。
DATABASE_ID
: Spanner データベースの永続的な ID。INSTANCE_ID
: Spanner インスタンスの永続的な ID。- READ_LEASE_REGION は、読み取りリースを有効にするリージョンに置き換えます。例:
europe-west1
複数のリージョンで読み取りリースを有効にできます。各地域はカンマで区切ります。
読み取りリースを無効にする
読み取りリースはデフォルトで無効になっています。
既存のデータベースでこの機能を更新して無効にするには、ALTER DATABASE
(GoogleSQL、PostgreSQL)DDL ステートメントの read_lease_regions
オプションを NULL
に設定します。
コンソール
Google Cloud コンソールの [インスタンス] ページに移動します。
読み取りリースを無効にするインスタンスを選択します。
読み取りリースを無効にするデータベースを選択します。
ナビゲーション メニューで [Spanner Studio] をクリックします。
[Spanner Studio] ページで、[
新しいタブ] をクリックするか、空のエディタタブを使用します。次の
ALTER DATABASE
DDL ステートメントを入力します。GoogleSQL
ALTER DATABASE DATABASE_ID SET OPTIONS (read_lease_regions = NULL);
DATABASE_ID はデータベースの固有識別子に置き換えます。
PostgreSQL
ALTER DATABASE DATABASE_ID SET "spanner.read_lease_regions" = NULL;
DATABASE_ID はデータベースの固有識別子に置き換えます。
[実行] をクリックします。
gcloud
read_lease_regions
データベース オプションを設定するには、gcloud spanner databases ddl update
を使用します。
GoogleSQL
gcloud spanner databases ddl update DATABASE_ID \
--instance=INSTANCE_ID \
--ddl="ALTER DATABASE DATABASE_ID SET OPTIONS (read_lease_regions = NULL);"
次のように置き換えます。
DATABASE_ID
: Spanner データベースの永続的な ID。INSTANCE_ID
: Spanner インスタンスの永続的な ID。
PostgreSQL
gcloud spanner databases ddl update DATABASE_ID \
--instance=INSTANCE_ID \
--ddl="ALTER DATABASE DATABASE_ID SET "spanner.read_lease_regions" = NULL;"
次のように置き換えます。
DATABASE_ID
: Spanner データベースの永続的な ID。INSTANCE_ID
: Spanner インスタンスの永続的な ID。
ベスト プラクティス
この機能のメリットを最大限に活用するには、多重化されたセッションを使用します。これにより、1 つのセッションで多数の同時リクエストを作成できます。
モニタリング
読み取りリースを有効にした後は、レイテンシをモニタリングして、この機能が意図した効果を発揮していることを確認することが重要です。これを行うには、data_options
情報スキーマ テーブル(GoogleSQL、PostgreSQL)またはデータベースにクエリを実行して、リーダー リージョンと読み取りリースが有効になっているリージョンを特定します。読み取りリースが有効になっているリージョンでは、強力な読み取りにリージョン内のレイテンシが発生します。同時に、リーダー リージョンと読み取りリースが有効になっている最も遠いリージョン間の書き込みレイテンシが増加します。
次の Spanner レイテンシ指標を使用して、インスタンスの読み取りリクエストのレイテンシをモニタリングすることもできます。
spanner.googleapis.com/api/read_request_latencies_by_serving_location
この指標は、/serving_location
フィールドを使用してフィルタリングできます。/serving location
フィールドには、リクエストが提供される Spanner サーバーのロケーションを指定します。
使用可能な指標の全一覧については、Spanner の指標一覧をご覧ください。
費用に関する考慮事項
読み取りリース機能が有効になっているリージョンから提供される強い読み取りでは、使用されるコンピューティング リソースがわずかに少なくなります。一方、読み取りリース機能が有効になっているデータベースの書き込みでは、使用するコンピューティング リソースが若干多くなります。詳細については、Spanner コンピューティング容量の料金をご覧ください。
この機能は、ストレージやネットワークなどの他の料金コンポーネントには影響しません。
次のステップ
- Spanner レプリケーションの詳細を確認する。
- トランザクション外部の読み取りの詳細を確認する。