レプリケーション

このページでは、Spanner でのデータの複製方法、Spanner レプリカの種類、読み取り / 書き込みでのレプリカの役割、レプリケーションの利点について説明します。

概要

Spanner はバイトレベルで自動的にレプリケートします。Spanner の読み取りと書き込みのライフサイクルで説明されているように、基盤となるファイル システムでこの機能を活用します。 Spanner は、このファイル システムのファイルにデータベースの変異を書き込みます。マシンやディスクに障害が発生したときに、このファイル システムがファイルの複製と復旧を行います。

Spanner が構築されている分散ファイル システムでバイトレベルでのレプリケーションが行われている場合でも、Spanner はデータを複製してデータの可用性と地理的な局所性を維持します。簡単に言うと、Spanner のデータはすべて行に編成されています。Spanner は、これらの行の複数のコピー(レプリカ)を作成し、地理的に異なる場所に保存します。Spanner は、Paxos ベースの同期レプリケーション方式を使用しています。この方式では、書き込みを commit する前に、投票レプリカがすべての書き込みリクエストの採決を行います。これにより、グローバルに同期されたレプリケーションが実行され、Spanner 読み書きレプリカまたは読み取り専用レプリカから最新のデータを読み取ることが可能になります。

Spanner は、各データベースのスプリットのレプリカを作成します。スプリットは連続した行を保持します。ここで、行は主キーにより順序付けられます。1 つのスプリットのデータはすべて同じレプリカに物理的に保存さSpanner は独立した障害ゾーンに各レプリカを提供します。詳細については、タグの概要をご覧ください。

一連のスプリットは Paxos で保存と複製が行われます。Paxos レプリカセット内で、1 つのレプリカがリーダーとして選択されます。リーダー レプリカは書き込みを処理します。一方、読み取り / 書き込みレプリカまたは読み取り専用レプリカは、リーダーと通信を行わずに読み取りリクエストを処理できます。強力な読み取りがリクエストされた場合、通常はリーダーにコンサルトして、読み取り専用レプリカが最近のミューテーションをすべて受け取ったことを確認んする必要があります。リーダー レプリカからインスタンス構成のクロスリージョン レプリカに複製されるデータの変更率と量をモニタリングするには、データ レプリケーションをモニタリングするをご覧ください。

Spanner レプリケーションのメリット

Spanner レプリケーションのメリットには、次のものがあります。

  • データの可用性: データのコピーが増えるため、読み取り時にクライアントで利用可能なデータ量が増加します。投票レプリカの過半数を占めれば書き込みを commit できるため、レプリカの一部が使用できない場合でも、Spanner は書き込みを行うことができます。

  • 地理的な局所性: Spanner と異なるリージョンや大陸にデータが配置されている場合、ユーザーやサービスから地理的に近い場所にデータが保存されます。

  • 単一のデータベース エクスペリエンス: Spanner は、同期レプリケーションとグローバルの強整合性により、単一のデータベース エクスペリエンスを提供できます。

  • アプリケーション開発の省力化: Spanner は ACID に準拠し、グローバルな強整合性を提供するため、Spanner を利用するデベロッパーは、結果整合性に対処するロジックをアプリケーションに追加する必要がありません。アプリケーションの開発とその後のメンテナンスを迅速かつ簡単に行うことができます。

レプリカの種類

Spanner には、読み書きレプリカ読み取り専用レプリカウィットネス レプリカの 3 種類のレプリカがあります。ベース インスタンス構成を形成するリージョンとレプリケーション トポロジは固定されています。

カスタム インスタンス構成を作成し、リージョン インスタンス構成とマルチリージョン インスタンス構成に読み取り専用レプリカを追加できます。

次の表に、Spanner レプリカの種類とそれらのプロパティの概要を示します。

レプリカの種類 投票可能か リーダーにできるか 読み込みを処理できるか レプリカを手動で構成できる
読み書き はい はい はい いいえ
読み取り専用 いいえ いいえ はい *
ウィットネス はい いいえ いいえ いいえ

* 詳細については、カスタム インスタンス構成を使用してインスタンスを作成する方法をご覧ください。

読み取り / 書き込みレプリカ

読み書きレプリカは、読み取りと書き込みの両方をサポートします。このレプリカの特性は次のとおりです。

  • データの完全なコピーを維持します。
  • 読み取りを処理します。
  • 書き込みを commit するかどうかを投票できます。
  • リーダーの選出に参加できます。
  • リーダーになる資格があります。
  • リージョン インスタンスで使用できる唯一のレプリカタイプです。

読み取り専用レプリカ

読み取り専用レプリカは読み取りをサポートします(書き込みはサポートしません)。これらのレプリカは、リーダーや書き込みの commit を決める投票に参加しません。書き込みに必要なクォーラム サイズを増やさずに読み取り容量をスケーリングできます。読み取り専用レプリカの特性は次のとおりです。

  • データの完全なコピーを維持します。このデータはリーダーの読み書きレプリカから複製されます。
  • 書き込みの commit を決める投票に参加しません。したがって、読み取り専用レプリカのロケーションは、書き込みのレイテンシに影響しません。
  • リーダーになることはできません。
  • 読み取りを処理します。
  • アプリケーションに最も近いレプリカである場合、読み取り専用レプリカは通常、ステイルネスが 15 秒以上であると想定して、リーダー リージョンへのラウンド トリップなしでステイル読み取りを処理できます。有向読み取りを使用して、読み取り専用トランザクションと単一読み取りを、マルチリージョン インスタンス構成の特定のレプリカタイプまたはリージョンにルーティングすることもできます。詳細については、有向読み取りをご覧ください。

    強力な読み取りを行う場合には、リーダー レプリカへのラウンド トリップが必要になる可能性があります。ラウンド トリップはタイムスタンプのネゴシエーションのみを行い、リーダーからの実際のデータの提供は行いません。 タイムスタンプのネゴシエーションはリーダーでの CPU 効率の高いオペレーションであり、通常、データはすでに転送中です。この通信はシステムによって自動的に処理されます。

    古い読み取りと強力な読み取りの詳細については、読み取りのセクションをご覧ください。

オプションの読み取り専用レプリカ

カスタムのリージョンまたはマルチリージョン インスタンス構成を作成し、オプションの読み取り専用レプリカを追加して、読み取りをスケーリングし、低レイテンシのステイル読み取りをサポートできます。[オプションのリージョン] にリストされているロケーションをオプションの読み取り専用レプリカとして追加できます。選択した読み取り専用レプリカのロケーションが表示されない場合は、新しいオプションの読み取り専用レプリカ リージョンをリクエストできます。

オプションの読み取り専用レプリカはすべて、コンピューティング容量、ストレージ、レプリケーションの費用の対象となります。さらに、読み取り専用レプリカをカスタム インスタンス構成に追加しても、インスタンス構成の Spanner SLA は変更されません。リーダー リージョンとは異なる大陸に読み取り専用レプリカを追加する場合は、少なくとも 2 つの読み取り専用レプリカを追加することをおすすめします。これにより、読み取り専用レプリカのいずれかが使用できなくなった場合に、読み取りレイテンシを低く維持できます。

ベスト プラクティスとして、まずカスタム インスタンス構成の非本番環境インスタンスでパフォーマンス ワークロードをテストします。リージョン間のレイテンシの中央値データについては、リージョン間のレイテンシとスループットのベンチマーク ダッシュボードをご覧ください。たとえば、カスタム インスタンス構成を eur6 マルチリージョン基本構成で作成し、us-east1 でオプションの読み取り専用レプリカを作成した場合、europe-west4 のリーダー リージョンへのラウンド トリップ時間のため、us-east1 のクライアントの予想される高い読み取りレイテンシは約 100 ミリ秒になります。十分な古さの古い読み取りではラウンドトリップが発生しないため、はるかに高速です。ロック分析情報とトランザクション分析情報を使用して、レイテンシの増加につながるトランザクションを特定することもできます。

オプションの読み取り専用レプリカを追加する手順については、カスタム インスタンス構成を作成するをご覧ください。

ウィットネス レプリカ

ウィットネス レプリカは、読み取りをサポートしませんが、書き込みの commit を決める投票に参加します。これらのレプリカにより、読み書きレプリカがデータの完全なコピーを保存し、読み取りを処理するために必要なストレージやコンピューティング リソースを使用せずに、書き込みクォーラムを簡単に実現できます。ウィットネス レプリカの特性は次のとおりです。

  • デュアルリージョン インスタンスとマルチリージョン インスタンスで使用されます。
  • データの完全なコピーは維持しません。
  • 読み取りを処理しません。
  • 書き込みの commit を決める投票に参加します。
  • リーダーの選出に参加しますが、リーダー レプリカになる資格はありません。

書き込みと読み取りでのレプリカの役割

このセクションでは、Spanner の書き込みと読み取りでのレプリカの役割について説明します。この役割を理解することで、デュアルリージョン構成とマルチリージョン構成で Spanner がウィットネス レプリカを使用する理由も理解できます。

書き込み

クライアントの書き込みリクエストは、リーダー以外のレプリカがクライアントの近くに存在している場合や、リーダー レプリカがクライアントから地理的に遠い場所に存在する場合でも、常にリーダー レプリカで最初に処理されます。デュアルリージョンまたはマルチリージョン インスタンス構成を使用し、クライアント アプリケーションがリーダー以外のリージョンにある場合、Spanner はリーダー認識ルーティングを使用して読み取り / 書き込みトランザクションを動的にルーティングし、データベースのレイテンシを短縮します。詳しくは、リーダー認識ルーティングをご覧ください。

リーダー レプリカは、受信した書き込みを記録し、この書き込みへの投票資格がある他のレプリカに同時に転送します。投票資格のあるレプリカは、書き込みを完了した後、書き込みを commit するかどうかの投票結果をリーダーに返します。投票レプリカ(書き込みクォーラム)の過半数が書き込みの commit に同意すると、書き込みが commit されます。バックグラウンドでは、ウィットネスを除く残りのすべてのレプリカが書き込みを記録します。読み書きレプリカまたは読み取り専用レプリカは、完全なデータを含む別のレプリカに不足データをリクエストします。

読み取り

読み取りリクエストの同時実行モードによっては、クライアントの読み取りリクエストでリーダー レプリカとの通信が必要になる場合があります。

  • リーダー レプリカがシリアル化に必要なロックを保持しているため、読み書きトランザクションに含まれる読み取りはリーダー レプリカから処理されます。

  • 読み取りの同時実行モードによっては、単一の読み取りメソッド(トランザクションのコンテキスト外の読み取り)と読み取り専用トランザクションの読み取りでリーダーとの通信が必要になる場合があります同時実行モードの詳細については、読み取りタイプをご覧ください。

    • 強力な読み取りリクエストは、任意の読み書きレプリカまたは読み取り専用レプリカに送信されます。リクエストがリーダー以外のレプリカに送信された場合、このレプリカはリーダーと通信を行い、読み取りを実行する必要があります。

    • ステイル読み取りリクエストは、リクエストのタイムスタンプに従って、最も近い利用可能な読み取り専用レプリカもしくは読み書きレプリカに送信されます。読み取りリクエストを送信したクライアントに最も近いレプリカがリーダー レプリカの場合、リーダー レプリカに送信されます。

データ レプリケーションをモニタリングする

インスタンス構成のリーダー レプリカからクロスリージョン レプリカに複製されるデータの変化率と量をモニタリングできます。変化率は 1 秒あたりのバイト数で、データ量はバイト単位です。これを行うには、クロスリージョン レプリケートされたバイト数instance/cross_region_replicated_bytes_count)モニタリング指標を使用します。

Google Cloud コンソールでこの指標を表示する手順は次のとおりです。

  1. Google Cloud コンソールで [Monitoring] に移動します。

    [モニタリング] に移動

  2. ナビゲーション メニューで [Metrics Explorer] を選択します。

  3. [指標] フィールドで、[指標を選択] プルダウンをクリックします。

  4. [リソース名または指標名でフィルタ] フィールドで、[Cloud Spanner Instance] > [Instance] > [Cross region replicated bytes] を選択し、[適用] をクリックします。

    この指標は、インスタンスでクロスリージョン レプリケーション アクティビティがある場合にのみ、[有効な指標] で確認できます。有効な指標にない場合は、[無効な指標] に表示されます。デフォルトでは、UI はアクティブな指標のみをフィルタして表示します。[アクティブ] チェックボックスをオフにすると、アクティブな指標と非アクティブな指標の両方が表示されます。

    グラフには、指定した期間内のすべての Spanner インスタンスにわたる複製されたデータの変化率(1 秒あたりのバイト数)が表示されます。

  5. 省略可: 変更率ではなく、複製されたデータの量(バイト単位)を表示するには:

    1. [集計] フィールドで [合計] プルダウンをクリックし、[整列指定子を構成] を選択します。
    2. [アライメント関数] フィールドで [レート] プルダウンをクリックし、[デルタ] を選択します。
    3. テーブルの種類として [グラフ] ではなく [] または [両方] を選択します。

      この表には、指定した期間内にレプリケートされたデータの量(バイト単位)が表示されます。

  6. 省略可: 特定のインスタンスの使用状況または属性の使用状況を表示するには:

    1. [フィルタ] フィールドを使用して、インスタンス ID、データベース ID、ソース リージョン、宛先リージョン、タグなどのフィルタを追加します。
    2. [フィルタを追加] をクリックして複数のフィルタを追加します。

Google Cloud の指標の一覧については、Google Cloud の指標をご覧ください。

次のステップ