このページでは、Spanner でのリーダー認識ルーティングとその使用方法について説明します。Spanner は、リーダー認識ルーティングを使用して、デュアルリージョン インスタンス構成とマルチリージョン インスタンス構成で読み取り / 書き込みトランザクションを動的にルーティングし、レイテンシを短縮してデータベースのパフォーマンスを向上させます。リーダー認識ルーティングはデフォルトで有効になっています。
読み取り / 書き込みトランザクションの Spanner ルーティング
Spanner はデータを複製して、データの可用性と地理的な局所性を向上させます。Spanner のデュアルリージョン インスタンス構成とマルチリージョン インスタンス構成では、デュアルリージョン インスタンス構成とマルチリージョン インスタンス構成の 1 つのリージョンがリーダー リージョンとして指定され、そこにデータベースのリーダー レプリカが含まれます。デュアルリージョンまたはマルチリージョン インスタンス構成を使用し、クライアントがリーダー以外のリージョンからデータベースに対して読み取り / 書き込みトランザクションを発行する場合、書き込みは常にリーダー リージョンで処理されてから、非リーダー リージョンに返送されます。したがって、リーダー以外のリージョンから commit された読み取り / 書き込みトランザクションは、リーダー レプリカへの複数回の往復を正常に commit する必要があります。
リーダー認識ルーティングは、読み取り / 書き込みトランザクションのレイテンシを、それらのトランザクションをインテリジェントにルーティングすることで改善するメカニズムです。リーダー認識ルーティングが有効になっている場合、書き込みがリーダー リージョンから発信されていない場合でも、セッション作成リクエストはリーダー リージョンにルーティングされ、リーダー リージョンのある Spanner Front End(SpanFE)に配置されます。このルーティング メカニズムにより、リーダー以外のリージョン(クライアント アプリケーションが存在するところ)とリーダー リージョン間のネットワークの往復数が 2 に削減され、読み取り / 書き込みトランザクションのレイテンシが改善されます。
図 1. リーダー認識ルーティングを有効にした Spanner ルーティングの例。
リーダー認識ルーティングが無効になっている場合、クライアント アプリケーションはまず、クライアント アプリケーション リージョン(リーダー以外のリージョン)にある SpanFE サービスにリクエストをルーティングします。次に、クライアント アプリケーション リージョンの SpanFE から、リーダー リージョンの Spanner サーバー(SpanServer)との間で 3 回以上の往復が行われて、書き込みが commit され、レイテンシが増加します。こららの追加の往復は、セカンダリ インデックス、制約チェック、書き込みの読み取りをサポートするために必要です。
図 2. リーダー認識ルーティングが無効になっている Spanner ルーティングの例。
ユースケース
リーダー認識ルーティングを使用した結果、以下のユースケースではレイテンシの短縮の効果があります。
- 一括更新: リーダー以外のリージョンから Dataflow インポートを実行するか、バックグラウンド変更(たとえば、バッチ DML)を実行する。
- 対障害耐性と可用性の向上: リーダーとリーダー以外のリージョンの両方にクライアント アプリケーションをデプロイし、リーダー以外のリージョンから書き込みを開始しながら、リージョンの停止を許容します。
- グローバル アプリケーション: データを commit するリージョンのロケーションを広範囲に配置して、クライアント アプリケーションをグローバルにデプロイします。
制限事項
クライアント アプリケーションがリーダー リージョンの外部にデプロイされており、データを読み取ることなく値を書き込む場合(「盲目的書き込み」)、リーダー認識ルーティングが有効になっていると、レイテンシの回帰が発生する場合があります。これは、リーダー認識ルーティングが有効な場合、リーダー以外のクライアント アプリケーションとリーダー リージョンの SpanFE の間でリージョン間の往復(beginTransaction
リクエストと commit
リクエスト)が 2 回発生するためです。ただし、リーダー認識ルーティングが無効の場合、読み取りなしの書き込みでは、commit
リクエストに対して 1 回のリージョン間往復しか必要とされません(beginTransaction
はローカル SpanFE で処理されます)。たとえば、新しく作成したテーブルにファイルデータを一括読み込みする場合、トランザクションがテーブルからデータを読み取らないようになります。アプリケーションで読み取りなしに書き込みオペレーションを頻繁に commit する場合は、リーダー認識ルーティングを無効にすることを検討してください。詳細については、リーダー認識ルーティングを無効にするをご覧ください。
リーダー認識ルーティングを使用する
Spanner クライアント ライブラリでは、リーダー認識ルーティングはデフォルトで有効になっています。
リーダー認識ルーティングを有効にして、読み取り / 書き込みリクエストを処理することをおすすめします。それを無効にすると、パフォーマンスの違いを比較できます。
リーダー認識ルーティングを有効にする
Spanner クライアント ライブラリを使用して、リーダー認識ルーティングを手動で有効にできます。
C++
RouteToLeaderOption
構造を使用して、リーダー認識ルーティングを有効にしてクライアント アプリケーションを構成します。
void RouteToLeaderOption(std::string const& project_id, std::string const& instance_id,
std::string const& database_id) {
namespace spanner = ::google::cloud::spanner;
// Create a client with RouteToLeaderOption enabled.
auto client = spanner::Client(
spanner::MakeConnection(
spanner::Database(project_id, instance_id, database_id)),
google::cloud::Options{}.set<spanner::RouteToLeaderOption>(
spanner::true));
C#
EnableLeaderRouting
を使用して、リーダー認識ルーティングを有効にしてクライアント アプリケーションを構成します。
// Create a client with leader-aware routing enabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = true;
Go
ClientConfig
を使用して、リーダー認識ルーティングを有効にしてクライアント アプリケーションを構成します。
type ClientConfig struct {
// DisableRouteToLeader specifies if all the requests of type read-write
// and PDML need to be routed to the leader region.
// Default: false
DisableRouteToLeader false
}
Java
SpannerOptions.Builder
を使用して、リーダー認識ルーティングを有効にしてクライアント アプリケーションを構成します。
SpannerOptions options = SpannerOptions.newBuilder().enableLeaderAwareRouting.build();
Spanner spanner = options.getService();
String instance = "my-instance";
String database = "my-database";
Node.js
SpannerOptions
を使用して、リーダー認識ルーティングを有効にしてクライアント アプリケーションを構成します。
// Instantiates a client with routeToLeaderEnabled enabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: true;
});
PHP
routeToLeader
を使用して、リーダー認識ルーティングを有効にしてクライアント アプリケーションを構成します。
// Instantiates a client with leader-aware routing enabled
use Google\Cloud\Spanner\SpannerClient;
$routeToLeader = true;
$spanner = new SpannerClient($routeToLeader);
Python
route_to_leader_enabled
を使用して、リーダー認識ルーティングを有効にしてクライアント アプリケーションを構成します。
spanner_client = spanner.Client(
route_to_leader_enabled=true
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
Ruby
self.new
を使用して、リーダー認識ルーティングを有効にしてクライアント アプリケーションを構成します。
def self.new(project_id: nil, credentials: nil, scope: nil, timeout: nil,
endpoint: nil, project: nil, keyfile: nil, emulator_host: nil,
lib_name: nil, lib_version: nil, enable_leader_aware_routing: true) ->
Google::Cloud::Spanner::Project
リーダー認識ルーティングを無効にする
Spanner クライアント ライブラリを使用して、リーダー認識ルーティングを無効にできます。
C++
RouteToLeaderOption
構造を使用して、リーダー認識ルーティングを無効にしてクライアント アプリケーションを構成します。
void RouteToLeaderOption(std::string const& project_id, std::string const& instance_id,
std::string const& database_id) {
namespace spanner = ::google::cloud::spanner;
// Create a client with RouteToLeaderOption disabled.
auto client = spanner::Client(
spanner::MakeConnection(
spanner::Database(project_id, instance_id, database_id)),
google::cloud::Options{}.set<spanner::RouteToLeaderOption>(
spanner::false));
C#
EnableLeaderRouting
を使用して、リーダー認識ルーティングを無効にしてクライアント アプリケーションを構成します。
// Create a client with leader-aware routing disabled.
SpannerConnectionStringBuilder builder = new
SpannerConnectionStringBuilder();
Builder.EnableLeaderRouting = false;
Go
ClientConfig
を使用して、リーダー認識ルーティングを無効にしてクライアント アプリケーションを構成します。
type ClientConfig struct {
// DisableRouteToLeader specifies if all the requests of type read-write
// and PDML need to be routed to the leader region.
// Default: false
DisableRouteToLeader true
}
Java
SpannerOptions.Builder
を使用して、リーダー対応ルーティングを無効にして Spanner データベースへの接続を作成します。
SpannerOptions options = SpannerOptions.newBuilder().disableLeaderAwareRouting.build();
Spanner spanner = options.getService();
String instance = "my-instance";
String database = "my-database";
Node.js
SpannerOptions
を使用して、リーダー認識ルーティングを無効にしてクライアント アプリケーションを構成します。
// Instantiates a client with routeToLeaderEnabled disabled
const spanner = new Spanner({
projectId: projectId,
routeToLeaderEnabled: false;
});
PHP
routeToLeader
を使用して、リーダー認識ルーティングを無効にしてクライアント アプリケーションを構成します。
// Instantiates a client with leader-aware routing disabled
use Google\Cloud\Spanner\SpannerClient;
$routeToLeader = false;
$spanner = new SpannerClient($routeToLeader);
Python
route_to_leader_enabled
を使用して、リーダー認識ルーティングを無効にしてクライアント アプリケーションを構成します。
spanner_client = spanner.Client(
route_to_leader_enabled=false
)
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
Ruby
self.new
を使用して、リーダー認識ルーティングを無効にしてクライアント アプリケーションを構成します。
def self.new(project_id: nil, credentials: nil, scope: nil, timeout: nil,
endpoint: nil, project: nil, keyfile: nil, emulator_host: nil,
lib_name: nil, lib_version: nil, enable_leader_aware_routing: false) ->
Google::Cloud::Spanner::Project
次のステップ
- リージョン、デュアルリージョン、マルチリージョン構成について学習する。
- レプリケーションについて学習する。
- データベースのリーダー リージョンを変更する方法を確認する。