リードレプリカの作成

このページでは、Cloud SQL インスタンスのリードレプリカを作成する方法について説明します。

リードレプリカとは、プライマリ インスタンスのコピーのことで、プライマリへの変更が通常の状況下で、ほぼリアルタイムで反映されます。リードレプリカは、プライマリ インスタンスからの読み取りリクエストやアナリティクス トラフィックをオフロードするために使用します。

また、障害復旧では、リージョンを移行することもできます。レプリカがクロスリージョン レプリカの場合は、別のリージョンにフェイルオーバーできます。たとえば、レプリカをスタンドアロン インスタンスに昇格できます(この場合、このインスタンスは既存のレプリカのプライマリとは見なされません)。

レプリケーションの仕組みについて詳しくは、Cloud SQL のレプリケーションをご覧ください。

始める前に

このインスタンスのレプリカを初めて作成する場合は、インスタンスがプライマリ インスタンスの要件を満たしていることを確認してください。詳しくはこちらをご覧ください。

リードレプリカの作成

リードレプリカを作成する手順は次のとおりです。

Console

  1. Google Cloud Console で、Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. レプリカを作成するインスタンスを見つけ、一覧の一番右にある [その他の操作] メニューを開きます。

    その他メニューの画像

  3. [リードレプリカを作成] を選択します。

    この選択肢が表示されていない場合、そのインスタンスはレプリカであることを示します。レプリカのレプリカを作成することはできません。

  4. [作成] をクリックします。

    マスターのインスタンスのページに戻ります。

gcloud

レプリカを作成します。

gcloud sql instances create REPLICA_NAME \
--master-instance-name=MASTER_INSTANCE_NAME

REST v1

インスタンス リソースの insert メソッドを使用してリードレプリカを作成します。リージョンと databaseVersion プロパティはマスターと同じにする必要があります。

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • database-version: バージョンの列挙型文字列(POSTGRES_12 など)
  • primary-instance-name: プライマリ インスタンスの名前
  • primary-instance-region: プライマリ インスタンスのリージョン
  • replica-region: レプリカ インスタンスのリージョン
  • replica-name: レプリカ インスタンスの名前
  • machine-type: マシンタイプの列挙型文字列。例: 「db-custom-1-3840」

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances

JSON 本文のリクエスト:

{
  "masterInstanceName": "primary-instance-name",
  "project": "project-id",
  "databaseVersion": "database-version",
  "name": "replica-name",
  "region": "replica-region",
  "settings":
  {
    "tier": "machine-type",
    "settingsVersion": 0,
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

REST v1beta4

インスタンス リソースの insert メソッドを使用してリードレプリカを作成します。リージョンと databaseVersion プロパティはマスターと同じにする必要があります。

リクエストのデータを使用する前に、次のように置き換えます。

  • project-id: プロジェクト ID
  • database-version: バージョンの列挙型文字列(POSTGRES_12 など)
  • primary-instance-name: プライマリ インスタンスの名前
  • primary-instance-region: プライマリ インスタンスのリージョン
  • replica-region: レプリカ インスタンスのリージョン
  • replica-name: レプリカ インスタンスの名前
  • machine-type: マシンタイプの列挙型文字列。例: 「db-custom-1-3840」

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances

JSON 本文のリクエスト:

{
  "masterInstanceName": "primary-instance-name",
  "project": "project-id",
  "databaseVersion": "database-version",
  "name": "replica-name",
  "region": "replica-region",
  "settings":
  {
    "tier": "machine-type",
    "settingsVersion": 0,
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

IAM データベース認証のリードレプリカの構成

プライマリ インスタンスでレプリカを有効にしても、リードレプリカは cloudsql.iam_authentication フラグを自動的に有効にしません。

IAM データベース認証のリードレプリカを構成するには:

  1. Google Cloud Console で、Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. インスタンス名をクリックして [概要] ページを開きます。
  3. [構成] タイルで、cloudsql.iam_authentication フラグを探します。フラグがリストにない場合は、リードレプリカでフラグを有効にする必要はありません。フラグがリストにある場合は、リードレプリカでフラグを有効にする必要があります。リードレプリカでフラグを有効にする必要がある場合は、次の手順に進みます。
  4. SQL ナビゲーション メニューから [レプリカ] を選択します。
  5. 編集するレプリカの名前をクリックします。
  6. [編集] をクリックします。
  7. [構成オプション] セクションで、[フラグ] を開きます。
  8. [+ 追加] を選択します。
  9. フラグ名として「cloudsql.iam_authentication」と入力します。このフラグに対して [オン] が選択されていることを確認します。
  10. [保存] をクリックします。

トラブルシューティング

問題 トラブルシューティング
リードレプリカの作成時にレプリケーションが開始されなかった。 ログファイルに、より具体的なエラーが記録されている可能性があります。Cloud Logging のログを調べて、実際のエラーを確認します。
リードレプリカを作成できない - invalidFlagValue エラー。 リクエスト内のフラグのいずれかが無効です。これは、明示的に指定されたフラグか、デフォルト値に設定されたフラグである可能性があります。

まず、max_connections フラグの値がプライマリの値以上であることを確認します。

max_connections フラグが適切に設定されている場合、Cloud Logging のログを調べて、実際のエラーを確認します。

リードレプリカを作成できない - 不明なエラー。 ログファイルに、より具体的なエラーが記録されている可能性があります。Cloud Logging のログを調べて、実際のエラーを確認します。

エラーが set Service Networking service account as servicenetworking.serviceAgent role on consumer project の場合は、Service Networking API を無効にしてから再度有効にします。この措置で、プロセスを続行するために必要なサービス アカウントが作成されます。

ディスクに空きがない。 レプリカの作成中にプライマリ インスタンスのディスクの空きがなくなる可能性があります。プライマリ インスタンスを編集して、より大きなディスクサイズにアップグレードします。
レプリカ インスタンスのメモリ使用量が多すぎる。 レプリカは一時メモリを使用して頻繁にリクエストされる読み取りオペレーションをキャッシュに保存するため、プライマリ インスタンスより多くのメモリを使用する可能性があります。

レプリカ インスタンスを再起動して、一時メモリ領域を再利用します。

レプリケーションが停止した。 ストレージの上限に達しており、ストレージの自動増量が有効になっていません。

インスタンスを編集して automatic storage increase を有効にします。

レプリケーション ラグが常に大きい。 書き込みの負荷が大きすぎてレプリカで処理できません。レプリケーション ラグは、レプリカの SQL スレッドで IO スレッドに対応できない場合に発生します。クエリやワークロードによっては、特定のスキーマで一時的または永続的に高いレプリケーション ラグが発生することがあります。レプリケーション ラグの一般的な原因は次のとおりです。
  • レプリカのクエリが遅い。遅いクエリを見つけて修正します。
  • すべてのテーブルに一意キーまたは主キーが必要です。一意のキーまたは主キーのないテーブルを更新するたびに、レプリカでテーブル全体がスキャンされます。
  • DELETE ... WHERE field < 50000000 などのクエリでは、レプリカに膨大な数の更新が蓄積されるため、行ベースのレプリケーションでレプリケーション ラグが発生します。

考えられる解決策は次のとおりです。

  • インスタンスを編集してレプリカのサイズを増やします。
  • データベースの負荷を軽減します。
  • テーブルをインデックスに登録します。
  • 遅いクエリを特定して修正します。
  • レプリカを再作成します。
PostgreSQL 9.6 でインデックスを再構築する際のエラー。 特定のインデックスを再構築する必要があることを示す PostgreSQL のエラーが発生します。これは、プライマリ インスタンスでのみ行うことができます。新しいレプリカ インスタンスを作成すると、すぐに同じエラーが発生します。バージョン 10 より前の PostgreSQL ではハッシュ インデックスはレプリカに伝播されません

ハッシュ インデックスを使用する必要がある場合は、PostgreSQL 10 以降にアップグレードしてください。レプリカも使用する場合は、PostgreSQL 9.6 でハッシュ インデックスを使用しないでください。

レプリカの作成がタイムアウトで失敗する。 プライマリ インスタンスで長時間 commit されていないトランザクションが実行されると、リードレプリカの作成に失敗することがあります。

実行中のクエリをすべて停止してからレプリカを再作成します。

次のステップ