レプリケーション

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

概要

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

Spanner が構築されている分散ファイル システムでバイトレベルでのレプリケーションが行われている場合でも、Spanner はデータを複製してデータの可用性と地理的な局所性を維持します。簡単に言うと、Cloud 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 コンソールで [モニタリング] に移動します。

    [モニタリング] に移動

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

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

  4. [リソース名または指標名でフィルタ] フィールドで、[Cloud Spanner インスタンス] > [インスタンス] > [リージョン間でレプリケートされたバイト数] を選択し、[適用] をクリックします。

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

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

  5. 省略可: 変更率ではなく、複製されたデータの量(バイト単位)を確認するには、次の手順で操作します。

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

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

  6. 省略可: 特定のインスタンスの使用状況または属性の使用状況を確認するには、次の手順で操作します。

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

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

次のステップ