このページでは、Spanner の読み取りリースとその使用方法について説明します。読み取りリースは、書き込みレイテンシの増加と引き換えに、読み取り / 書き込みリージョンまたは読み取り専用リージョンでデータベースの強力な読み取りレイテンシを短縮するのに役立ちます。
デフォルトでは、Spanner がリーダー以外のリージョンで強力な読み取りリクエストを受信すると、読み取りを提供するレプリカはインスタンスのリーダーの読み取り / 書き込みリージョンに接続します。この連絡先は、リクエストを処理する前にデータが最新であることを確認します。このプロセスでは、リクエストを受信するリージョンとリーダー リージョン間のネットワークの往復が発生します。単一リージョン内の通信とは異なり、リージョン間の地理的な距離によってリクエストにレイテンシが追加されます。
Spanner の読み取りリースを使用すると、このラウンド トリップが不要になります。データベースに 1 つ以上の読み取りリース リージョンを設定すると、Spanner はこれらのリージョンに整合性のある読み取りをローカルで提供する権限を付与します。これにより、リーダー以外のリージョンは、リーダー リージョンと通信せずに強い読み取りを直接提供できます。クライアントに近いリーダー以外のリージョンから強力な読み取りを行うと、リージョン間のレイテンシが短縮されます。これにより、デュアルリージョン インスタンスまたはマルチリージョン インスタンスの強力な読み取りのリージョン内レイテンシが実現します。読み取りリースが有効になっている場合、読み取り専用トランザクション内の強い読み取りは、リーダーに連絡することなくローカルで処理されます。読み取り / 書き込みトランザクションの場合、リーダー認識ルーティングが無効になっている繰り返し読み取り分離を使用する場合を除き、読み取りはリーダー リージョンに転送されます。
リージョンで読み取りリース機能を有効または無効にするためにダウンタイムは必要ありません。ただし、この機能を使用すると、書き込みのレイテンシが高くなります。これは、読み取りリースを有効にするには、書き込みの処理時にリーダーが読み取りリース リージョンに連絡する必要があるためです。副作用として、書き込みがロックを保持する時間が長くなり、競合の多い書き込みワークロードに影響する可能性があります。詳細については、読み取りリースを使用するタイミングをご覧ください。読み取りリースは、書き込みレイテンシの増加と引き換えに、高速な強い読み取りを求めるアプリケーションに最適です。たとえば、ワークロードで読み取りは頻繁に行われるが、書き込みはまれに行われるアクセス制御システムなどです。
読み取りリースを有効にする方法については、読み取りリースを使用するをご覧ください。
読み取りリースを使用するタイミング
アプリケーションとワークロードが次の条件を満たしている場合は、読み取りリースを有効にします。
- 書き込みの低レイテンシよりも、強力な読み取りの低レイテンシの方が重要です。
- ワークロードで書き込みロックの期間が長くなっても許容できるか、書き込み競合が少ない。
同時書き込みがある場合、クエリ API を使用するか 読み取り API を使用するかによって、読み取りリース リージョンを使用するデータベースのパフォーマンスが影響を受けます。
レイテンシのモニタリングの詳細については、モニタリングをご覧ください。
使用例
米国で書き込みを行い、米国、ヨーロッパ、アジアにクライアントを持つグローバルにデプロイされたアプリケーションを考えてみましょう。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 は、データベースの一意の識別子に置き換えます。
読み取り / 書き込みトランザクション内でリージョン内レイテンシの読み取りを実現する場合や、接続オプションを常に切り替えることができない場合は、反復可能読み取り分離レベルを使用して、リーダー認識ルーティングを無効にします。読み取り / 書き込みトランザクションに読み取りのみが含まれている場合でも、これらの設定は必要です。それ以外の場合、読み取り / 書き込みトランザクション内の読み取りは常にリーダー リージョンに転送されます。このようなトランザクションでは、最初の書き込み DML ステートメントの後に読み取りリースが無効になります。これは、書き込みが常にリーダー リージョンに送信されるためです。そのため、書き込みを読み取るには、後続の読み取りもリーダー リージョンに送信する必要があります。
postgres://USER_ID:PASSWORD@localhost:5432/DATABASE_ID?sslmode=disable&options=-c \ default_isolation_level=REPEATABLE_READ -c routeToLeader=false host=/tmp port=5432 database=DATABASE_ID \ options='-c default_isolation_level=REPEATABLE_READ -c routeToLeader=false'
読み取りリースを有効にする
新しいデータベースを作成するときに読み取りリースを有効にするには、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 レプリケーションの詳細を確認する。
- トランザクション外部の読み取りの詳細を確認する。