リードレプリカを作成する

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

外部サブスクライバーのパブリッシャーとして機能する Cloud SQL インスタンスを設定するには、外部レプリカを構成するをご覧ください。

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

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

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

始める前に

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

リードレプリカを作成する

プライマリ インスタンスごとに最大 8 つのリードレプリカを作成できます。

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

コンソール

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

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

  2. レプリカを作成するインスタンスを探して、リストの右端にある [more actions] メニューを開きます。
  3. [リードレプリカを作成] を選択します。

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

  4. [インスタンスのカスタマイズ] セクションで、レプリカの設定を更新します。最初に [構成オプションを表示] をクリックして、設定のグループを表示します。次に、目的のグループを開いて設定を確認し、カスタマイズします。選択したすべてのオプションの [サマリー] が右側に表示されます。これらの設定のカスタマイズはオプションです。カスタマイズを行わない場合、デフォルト値が割り当てられます。

    各設定の詳細については、インスタンスの設定ページをご覧ください。

  5. [レプリカを作成する] をクリックします。

    Cloud SQL により、必要に応じてバックアップが作成され、レプリカが作成されます。プライマリのインスタンス ページに戻ります。

gcloud

レプリカを作成します。

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

必要な場合は、--tier パラメータを使用して異なる階層サイズを指定できます。

--region パラメータを使用して別のリージョンを指定できます。

プライマリ インスタンスが内部 IP アドレスだけを持つ場合は、--no-assign-ip パラメータをコマンドに追加します。

他のインスタンス設定のパラメータを追加することもできます。詳細については、gcloud sql インスタンスの作成をご覧ください。

レプリカは、プライマリ インスタンスと同じ VPC ネットワーク内に作成する必要があります。同じ VPC ネットワークで allocated-ip-range-name を指定することもできます。範囲が指定されていない場合、レプリカはランダムな範囲で作成されます。

Terraform

リードレプリカを作成するには、Terraform リソースを使用します。

resource "google_sql_database_instance" "read_replica" {
  name                 = "sqlserver-replica-instance-name"
  master_instance_name = google_sql_database_instance.primary.name
  region               = "europe-west4"
  database_version     = "SQLSERVER_2019_ENTERPRISE"
  root_password        = "INSERT-PASSWORD-HERE"
  replica_configuration {
    failover_target = false
  }

  settings {
    tier              = "db-custom-2-7680"
    availability_type = "ZONAL"
    disk_size         = "100"
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally delete this instance by
  # use of Terraform whereas `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

REST v1beta4

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

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

  • project-id: プロジェクト ID
  • database-version: 列挙型のバージョン文字列(例: SQLSERVER_2017_ENTERPRISE)
  • 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 レスポンスが返されます。

Private Service Connect が有効になっているインスタンスのリードレプリカを作成する

Private Service Connect が有効になっているインスタンスのリードレプリカを作成するには、gcloud CLI または API を使用します。このレプリカは、プライマリ インスタンスと同じリージョンまたは別のリージョン(クロスリージョン リードレプリカ)に作成できます。

接続タイプが異なるインスタンスから、リードレプリカを使用して複製することはできません。たとえば、Private Service Connect が有効になっているインスタンスは、別の Private Service Connect インスタンスからのみ複製できます。また、外部 IP 接続をサポートするインスタンスや、プライベート サービス アクセスを使用するように構成されたインスタンスからは複製できません。

gcloud

インスタンスのリードレプリカを作成するには、gcloud sql instances create コマンドを使用します。

gcloud sql instances create REPLICA_INSTANCE_NAME \
--master-instance-name=PRIMARY_INSTANCE_NAME \
--project=PROJECT_ID \
--region=REGION_NAME \
--enable-private-service-connect \
--allowed-psc-projects=ALLOWED_PROJECTS \
--availability-type=AVAILABILITY_TYPE \
--no-assign-ip

次のように置き換えます。

  • REPLICA_INSTANCE_NAME: レプリカ インスタンスの名前。
  • PRIMARY_INSTANCE_NAME: プライマリ インスタンスの名前。
  • PROJECT_ID: インスタンスが含まれている Google Cloud プロジェクトの ID またはプロジェクト番号
  • REGION_NAME: レプリカ インスタンスのリージョン名。
  • ALLOWED_PROJECTS: 許可されているプロジェクト ID または番号のリスト(カンマ区切り)。このリストに含まれていないプロジェクトについては、そのプロジェクトを使用してインスタンスを作成して Private Service Connect を有効にすることはできません。

    Cloud SQL では、プライマリ インスタンスで許可されているプロジェクトはレプリカにコピーされません。レプリカごとに Private Service Connect エンドポイントを作成する必要があります。Cloud SQL Auth Proxy または Cloud SQL 言語コネクタを使用している場合は、レプリカの DNS ゾーンDNS レコードを作成する必要があります。

  • AVAILABILITY_TYPE: インスタンスの高可用性を有効にします。このパラメータには、次のいずれかの値を指定します。
    • REGIONAL: 高可用性を有効にします。本番環境インスタンスに推奨されます。インスタンスは、選択したリージョン内の別のゾーンにフェイルオーバーします。
    • ZONAL: フェイルオーバー機能を提供しません。これがデフォルト値です。

    インスタンスの高可用性の設定と削除の詳細については、既存のインスタンスを高可用性向けに構成するインスタンスの高可用性を無効にするをご覧ください。

REST v1

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

  • PRIMARY_INSTANCE_NAME: プライマリ インスタンスの名前。
  • PROJECT_ID: インスタンスが含まれている Google Cloud プロジェクトの ID またはプロジェクト番号
  • REPLICA_INSTANCE_NAME: レプリカ インスタンスの名前。
  • REGION_NAME: レプリカ インスタンスのリージョン名。
  • MACHINE_TYPE: インスタンスのマシンタイプ。
  • AVAILABILITY_TYPE: インスタンスの高可用性を有効にします。このパラメータには、次のいずれかの値を指定します。
    • REGIONAL: 高可用性を有効にします。本番環境インスタンスに推奨されます。インスタンスは、選択したリージョン内の別のゾーンにフェイルオーバーします。
    • ZONAL: フェイルオーバー機能を提供しません。これがデフォルト値です。

    インスタンスの高可用性の設定と削除の詳細については、既存のインスタンスを高可用性向けに構成するインスタンスの高可用性を無効にするをご覧ください。

  • ALLOWED_PROJECTS: 許可されているプロジェクト ID または番号のリスト(カンマ区切り)。このリストに含まれていないプロジェクトについては、そのプロジェクトを使用してインスタンスを作成して Private Service Connect を有効にすることはできません。

    Cloud SQL では、プライマリ インスタンスで許可されているプロジェクトはレプリカにコピーされません。レプリカごとに Private Service Connect エンドポイントを作成する必要があります。Cloud SQL Auth Proxy または Cloud SQL 言語コネクタを使用している場合は、レプリカの DNS ゾーンDNS レコードを作成する必要があります。

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances

リクエストの本文(JSON):

{
  "masterInstanceName": "PRIMARY_INSTANCE_NAME",
  "project": "PROJECT_ID",
  "databaseVersion": "SQLSERVER_2019_STANDARD",
  "name": "REPLICA_INSTANCE_NAME",
  "region": "REGION_NAME",
  "kind": "sql#instance",
  "settings":
  {
    "tier": "MACHINE_TYPE",
    "availabilityType": "AVAILABILITY_TYPE",
    "settingsVersion": 0,
    "ipConfiguration": {
      "ipv4Enabled": false,
      "pscConfig": {
        "allowedConsumerProjects": [ALLOWED_PROJECTS],
        "pscEnabled": true
      }
    },
    "kind": "sql#settings",
    "pricingPlan": "PER_USE",
    "replicationType": "ASYNCHRONOUS",
    "tier": "MACHINE_TYPE"
  }
}

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

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

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/REPLICA_INSTANCE_NAME",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "operationType": "CREATE_REPLICA",
  "name": "OPERATION_ID",
  "targetId": "REPLICA_INSTANCE_NAME",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

REST v1beta4

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

  • PRIMARY_INSTANCE_NAME: プライマリ インスタンスの名前。
  • PROJECT_ID: インスタンスが含まれている Google Cloud プロジェクトの ID またはプロジェクト番号
  • REPLICA_INSTANCE_NAME: レプリカ インスタンスの名前。
  • REGION_NAME: レプリカ インスタンスのリージョン名。
  • MACHINE_TYPE: インスタンスのマシンタイプ。
  • AVAILABILITY_TYPE: インスタンスの高可用性を有効にします。このパラメータには、次のいずれかの値を指定します。
    • REGIONAL: 高可用性を有効にします。本番環境インスタンスに推奨されます。インスタンスは、選択したリージョン内の別のゾーンにフェイルオーバーします。
    • ZONAL: フェイルオーバー機能を提供しません。これがデフォルト値です。

    インスタンスの高可用性の設定と削除の詳細については、既存のインスタンスを高可用性向けに構成するインスタンスの高可用性を無効にするをご覧ください。

  • ALLOWED_PROJECTS: 許可されているプロジェクト ID または番号のリスト(カンマ区切り)。このリストに含まれていないプロジェクトについては、そのプロジェクトを使用してインスタンスを作成して Private Service Connect を有効にすることはできません。

    Cloud SQL では、プライマリ インスタンスで許可されているプロジェクトはレプリカにコピーされません。レプリカごとに Private Service Connect エンドポイントを作成する必要があります。Cloud SQL Auth Proxy または Cloud SQL 言語コネクタを使用している場合は、レプリカの DNS ゾーンDNS レコードを作成する必要があります。

HTTP メソッドと URL:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances

リクエストの本文(JSON):

{
  "masterInstanceName": "PRIMARY_INSTANCE_NAME",
  "project": "PROJECT_ID",
  "databaseVersion": "SQLSERVER_2019_STANDARD",
  "name": "REPLICA_INSTANCE_NAME",
  "region": "REGION_NAME",
  "kind": "sql#instance",
  "settings":
  {
    "tier": "MACHINE_TYPE",
    "availabilityType": "AVAILABILITY_TYPE",
    "settingsVersion": 0,
    "ipConfiguration": {
      "ipv4Enabled": false,
      "pscConfig": {
        "allowedConsumerProjects": [ALLOWED_PROJECTS],  
        "pscEnabled": true
      }
    },
    "kind": "sql#settings",
    "pricingPlan": "PER_USE",
    "replicationType": "ASYNCHRONOUS",
    "tier": "MACHINE_TYPE"
  }
}

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

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

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/REPLICA_INSTANCE_NAME",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "operationType": "CREATE_REPLICA",
  "name": "OPERATION_ID",
  "targetId": "REPLICA_INSTANCE_NAME",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

カスケード レプリカを作成する

このセクションでは、カスケード レプリカの作成と管理の方法について説明します。

カスケード レプリカの仕組みについては、レプリカのカスケードをご覧ください。

始める前に

プライマリ インスタンスにはカスケード可能なレプリカが必要です。次のセクションでは、カスケード可能なレプリカを作成する手順について説明します。

カスケード可能なレプリカの作成手順

カスケード可能なレプリカを作成する場合は、プライマリ インスタンスとは異なるリージョンにレプリカを作成する必要があります。カスケード可能なレプリカを構成するには、cascadable-replica フラグを設定します。

gcloud

--master-instance-name フラグと --cascadable-replica フラグを使用してプライマリ インスタンスを指定し、新しいレプリカを作成します。

gcloud sql instances create REPLICA_NAME \
   --master-instance-name=PRIMARY_INSTANCE_NAME \
   --cascadable-replica \
   --region=REGION

次のように置き換えます。

  • REPLICA_NAME: 作成するレプリカの一意の ID。
  • PRIMARY_INSTANCE_NAME: プライマリ インスタンスの名前。
  • REGION: 新しいレプリカを作成するリージョン。このリージョンは、プライマリ インスタンスのリージョンと別にする必要があります。

レプリカは、プライマリ インスタンスと同じ VPC ネットワーク内に作成する必要があります。その VPC ネットワークで割り振られた IP 範囲の名前を指定することもできます。範囲が指定されていない場合、レプリカはランダムな範囲で作成されます。

他のインスタンス設定のパラメータを追加することもできます。次に例を示します。

  • --tier パラメータを使用して、別のマシン階層サイズを指定できます。
  • プライマリ インスタンスにプライベート IP アドレスしかない場合は、--no-assign-ip パラメータをコマンドに追加します。

インスタンス設定のパラメータの追加の詳細については、gcloud sql instances create をご覧ください。

カスケード可能なレプリカを作成した後、カスケード レプリカを作成できます。

curl

  1. プライマリ インスタンスの下にカスケード可能なレプリカを作成するには、次の JSON コードサンプルを編集して request.json というファイルに保存します。

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

    • PROJECT_ID: プロジェクト ID。
    • DATABASE_VERSION: データベース バージョンの列挙型文字列。たとえば、SQLSERVER_2017_ENTERPRISE. のようにします。
    • PRIMARY_INSTANCE_NAME: プライマリ インスタンスの名前。
    • PRIMARY_INSTANCE_REGION: プライマリ インスタンスのリージョン。
    • REPLICA_REGION: レプリカ インスタンスのリージョン。
    • REPLICA_NAME: レプリカ インスタンスの名前。
    • MACHINE_TYPE: マシンタイプの列挙型文字列。例: db-custom-2-3840
    {
      "masterInstanceName": "PRIMARY_INSTANCE_NAME",
      "project": "PROJECT_ID",
      "databaseVersion": "DATABASE_VERSION"
      "name": "REPLICA_NAME",
      "region": "REPLICA_REGION",
      "settings":
        {
          "tier": "MACHINE_TYPE",
          "settingsVersion": 0,
        }
        "replicaConfiguration":
        {
         "cascadableReplica": true
        }
    }
    
  2. replicaConfiguration セクションで、cascadadableReplica フィールドが true に設定されていることを確認します。
  3. 次のコマンドを実行します。
    curl -X POST
    -H "Authorization: Bearer "$(gcloud auth print-access-token)
    -H "Content-Type: application/json; charset=utf-8"
    -d @request.json
    "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances"
    

カスケード可能なレプリカを作成した後、カスケード レプリカを作成できます。

カスケード レプリカの作成手順

カスケード レプリカを作成する場合は、カスケード可能なレプリカと同じリージョンにレプリカを作成する必要があります。カスケード レプリカを構成するには、–master-instance-name パラメータにカスケード可能なレプリカの名前を指定します。

コンソール

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

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

  2. 作成するレプリカの親として機能するレプリカ用の [レプリカ] タブをクリックします。
  3. [レプリカを作成する] をクリックします。
  4. [リードレプリカを作成する] ページで、インスタンス ID とその他の構成オプション(名前、リージョン、ゾーンなど)を更新します。
  5. [作成] をクリックします。

    Cloud SQL がレプリカを作成します。親レプリカのインスタンス ページに戻ります。

  6. 作成する新しいカスケード レプリカごとに手順 4~6 を行います。

gcloud

  1. --master-instance-name フラグでカスケード可能なレプリカ インスタンスを指定して、新しいレプリカを作成します。
  2. gcloud sql instances create REPLICA_NAME \
          --master-instance-name=CASCADABLE_REPLICA_NAME \
    
    次のように置き換えます。
    • REPLICA_NAME: 作成するレプリカの一意の ID
    • CASCADABLE_REPLICA_NAME: カスケード可能なレプリカの名前
  3. カスケード レプリカの作成後に、プライマリ インスタンスに対して変更を行うと、その変更内容がカスケード レプリカ チェーン内のすべてのレプリカに複製されます。

curl

  1. カスケード可能なレプリカの下にカスケード レプリカを作成するには、次の JSON コードサンプルを編集して request.json というファイルに保存します。
    {
      "masterInstanceName": "CASCADABLE_REPLICA_NAME",
      "project": "PROJECT_ID",
      "name": "REPLICA_NAME",
      "region": "REPLICA_REGION",
      "settings":
        {
          "tier": "MACHINE_TYPE",
        }
    }
    
  2. 次のコマンドを実行します。
    curl -X POST
    -H "Authorization: Bearer "$(gcloud auth print-access-token)
    -H "Content-Type: application/json; charset=utf-8"
    -d @request.json
    "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances"
    

トラブルシューティング

問題 トラブルシューティング
作成時にリードレプリカがレプリケーションを開始しなかった。 ログファイルに、より具体的なエラーが記録されている可能性があります。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 などのクエリでは、レプリカに膨大な数の更新が蓄積されるため、行ベースのレプリケーションでレプリケーション ラグが発生します。

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

  • インスタンスを編集してレプリカのサイズを増やします。
  • データベースの負荷を軽減します。
  • リードレプリカにリード トラフィックを送信します。
  • テーブルをインデックスに登録します。
  • 遅い書き込みクエリを特定して修正します。
  • レプリカを再作成します。
レプリカの作成がタイムアウトで失敗する。 プライマリ インスタンスで長時間 commit されていないトランザクションが実行されると、リードレプリカの作成に失敗することがあります。

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

次のステップ