このページでは、Cloud SQL インスタンスのリードレプリカを作成する方法について説明します。
リードレプリカとは、プライマリ インスタンスのコピーのことで、プライマリへの変更が通常の状況下で、ほぼリアルタイムで反映されます。リードレプリカは、プライマリ インスタンスからの読み取りリクエストやアナリティクス トラフィックをオフロードするために使用します。
また、障害復旧では、リージョンを移行することもできます。レプリカがクロスリージョン レプリカの場合は、別のリージョンにフェイルオーバーできます。たとえば、レプリカをスタンドアロン インスタンスに昇格できます(この場合、このインスタンスは既存のレプリカのプライマリとは見なされません)。
レプリケーションの仕組みについて詳しくは、Cloud SQL のレプリケーションをご覧ください。
始める前に
このインスタンスのレプリカを初めて作成する場合は、インスタンスがプライマリ インスタンスの要件を満たしていることを確認してください。詳細
リードレプリカを作成する
リードレプリカを作成する手順は次のとおりです。
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- レプリカを作成するインスタンスを探して、リストの横にある [
more actions
] メニューを開きます。 - [リードレプリカを作成] を選択します。
この選択肢が表示されない場合、そのインスタンスはレプリカです。レプリカのレプリカを作成することはできません。
このページの [インスタンスのカスタマイズ] セクションで、レプリカの設定を更新します。最初に [構成オプションを表示] をクリックして、設定のグループを表示します。次に、目的のグループを開いて設定を確認し、カスタマイズします。選択したすべてのオプションの [サマリー] が右側に表示されます。これらの設定のカスタマイズはオプションです。カスタマイズを行わない場合、デフォルト値が割り当てられます。
各設定の詳細については、インスタンスの設定についてのページをご覧ください。
たとえば、BigQuery などの他の Google Cloud サービスが Cloud SQL のデータにアクセスし、内部接続を介してこのデータに対するクエリを実行できるようにするには、[接続] グループを開き、[パブリック IP] チェックボックスをオフにします。
- [レプリカを作成する] をクリックします。
Cloud SQL により、必要に応じてバックアップが作成され、レプリカが作成されます。プライマリのインスタンス ページに戻ります。
gcloud
レプリカを作成します。
gcloud sql instances create REPLICA_NAME \ --master-instance-name=MASTER_INSTANCE_NAME
必要な場合は、--tier
パラメータを使用して異なる階層サイズを指定できます。また、プライマリ インスタンスからレプリカを作成し、インスタンスの Cloud SQL エディションが Enterprise または Enterprise Plus で、バージョンが 16 以降の場合は、このパラメータの値を指定する必要はありません。レプリカは、プライマリ インスタンスからマシンタイプを継承します。
--region
パラメータを使用して別のリージョンを指定できます。
プライマリ インスタンスに内部 IP アドレスしかなく、BigQuery などの他の Google Cloud サービスが Cloud SQL のデータにアクセスし、内部接続でこのデータに対するクエリを実行できるようにする場合は、--enable-google-private-path
パラメータをコマンドに追加します。
レプリカは、プライマリ インスタンスと同じ VPC ネットワーク内に作成する必要があります。同じ VPC ネットワークで allocated-ip-range-name
を指定することもできます。範囲が指定されていない場合、レプリカはランダムな範囲で作成されます。
Terraform
リードレプリカを作成するには、Terraform リソースを使用します。
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」
- private-network: プライベート接続の作成のために追加または選択している承認済みネットワーク。
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, "ipConfiguration": { object (IpConfiguration) }, { "ipv4Enabled": false, "privateNetwork": private-network, "requireSsl": boolean, "authorizedNetworks": [ { object (AclEntry) } ], "allocatedIpRange": string } } }
リクエストを送信するには、次のいずれかのオプションを開きます。
次のような 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」
- private-network: プライベート接続の作成のために追加または選択している承認済みネットワーク。
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, "ipConfiguration": { object (IpConfiguration) }, { "ipv4Enabled": false, "privateNetwork": private-network, "requireSsl": boolean, "authorizedNetworks": [ { object (AclEntry) } ], "allocatedIpRange": string } } }
リクエストを送信するには、次のいずれかのオプションを開きます。
次のような 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": "POSTGRES_13", "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": "POSTGRES_13", "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" }
IAM データベース認証のリードレプリカを構成する
プライマリ インスタンスでcloudsql.iam_authentication
フラグを有効にすると、Cloud SQL for PostgreSQL はリードレプリカでフラグを自動的に有効にします。ただし、プライマリ インスタンスでこのフラグを有効にしない場合、Cloud SQL for PostgreSQL はリードレプリカで有効にしません。IAM データベース認証にレプリカを使用することはできません。
IAM データベース認証のリードレプリカを構成するには:
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- [構成] タイルで、
cloudsql.iam_authentication
フラグを探します。フラグがリストにない場合は、リードレプリカでフラグを有効にする必要はありません。フラグがリストにある場合は、リードレプリカでフラグを有効にする必要があります。リードレプリカでフラグを有効にする必要がある場合は、次の手順に進みます。 - SQL ナビゲーション メニューから [レプリカ] を選択します。
- 編集するレプリカの名前をクリックします。
- [編集] をクリックします。
- [構成オプション] セクションで、[フラグ] を開きます。
- [+ 追加] を選択します。
- フラグ名として「
cloudsql.iam_authentication
」と入力します。このフラグに対して [オン] が選択されていることを確認します。 - [保存] をクリックします。
カスケード レプリカを作成する
このセクションでは、カスケード レプリカの作成と管理の方法について説明します。
カスケード レプリカの仕組みについては、レプリカのカスケードをご覧ください。
カスケード レプリカの作成手順
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- 作成するレプリカの親として機能するレプリカ用の [レプリカ] タブをクリックします。
- [レプリカを作成する] をクリックします。
- [リードレプリカを作成する] ページで、インスタンス ID とその他の構成オプション(名前、リージョン、ゾーンなど)を更新します。
- [作成] をクリックします。
Cloud SQL がレプリカを作成します。親レプリカのインスタンス ページに戻ります。
- 作成する新しいカスケード レプリカごとに手順 4~6 を行います。
gcloud
--master-instance-name
フラグを使用してプライマリ レプリカをプライマリ インスタンスとして指定し、新しいレプリカを作成します。- REPLICA_NAME: 作成するレプリカの一意の ID
- PARENT_REPLICA_NAME: 親レプリカの名前
- カスケード レプリカを作成した後は、プライマリ インスタンスに対して変更を行うと、その変更内容がカスケード レプリカ チェーン内のすべてのレプリカに複製されます。
gcloud sql instances create REPLICA_NAME \ --master-instance-name=PARENT_REPLICA_NAME \
curl
- 親レプリカの下にレプリカを作成するには、次の JSON コードサンプルを編集し、
request.json
というファイルに保存します。{ "masterInstanceName": "PARENT_REPLICA_NAME", "project": "PROJECT_ID", "name": "REPLICA_NAME", "region": "REPLICA_REGION", "settings": { "tier": "MACHINE_TYPE", } }
- 次のコマンドを実行します。
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 エラー。 | リクエスト内のフラグのいずれかが無効です。これは、明示的に指定されたフラグか、デフォルト値に設定されたフラグである可能性があります。 まず、
|
リードレプリカを作成できない - 不明なエラー。 | ログファイルに、より具体的なエラーが記録されている可能性があります。Cloud Logging のログを調べて、実際のエラーを確認します。 エラーが |
ディスクに空きがない。 | レプリカの作成中にプライマリ インスタンスのディスクの空きがなくなる可能性があります。プライマリ インスタンスを編集して、より大きなディスクサイズにアップグレードします。 |
ディスク容量が大幅に増加します。 | データの追跡に使用されていないスロットでは、PostgreSQL が WAL セグメントに無期限に維持するため、ディスク容量は無期限に増加します。Cloud SQL で論理レプリケーションと論理デコーディング機能を使用すると、レプリケーション スロットが自動的に作成、削除されます。pg_replication_slots システムビューにクエリを実行し、active 列でフィルタリングすると、未使用のレプリケーション スロットを検出できます。未使用のスロットを削除することで、pg_drop_replication_slot コマンドで WAL セグメントを削除できます。 |
レプリカ インスタンスのメモリ使用量が多すぎる。 | レプリカは一時メモリを使用して頻繁にリクエストされる読み取りオペレーションをキャッシュに保存するため、プライマリ インスタンスより多くのメモリを使用する可能性があります。 レプリカ インスタンスを再起動して、一時メモリ領域を再利用します。 |
レプリケーションが停止した。 | ストレージの上限に達しており、ストレージの自動増量が有効になっていません。 インスタンスを編集して |
レプリケーション ラグが常に大きい。 | 書き込みの負荷が大きすぎてレプリカで処理できません。レプリケーション ラグは、レプリカの SQL スレッドで IO スレッドに対応できない場合に発生します。クエリやワークロードによっては、特定のスキーマで一時的または永続的に高いレプリケーション ラグが発生することがあります。レプリケーション ラグの一般的な原因は次のとおりです。
考えられる解決策は次のとおりです。
|
PostgreSQL 9.6 でインデックスを再構築する際のエラー。 | 特定のインデックスを再構築する必要があることを示す PostgreSQL のエラーが発生します。これは、プライマリ インスタンスでのみ行うことができます。新しいレプリカ インスタンスを作成すると、すぐに同じエラーが発生します。バージョン 10 より前の PostgreSQL ではハッシュ インデックスはレプリカに伝播されません。 ハッシュ インデックスを使用する必要がある場合は、PostgreSQL 10 以降にアップグレードしてください。レプリカも使用する場合は、PostgreSQL 9.6 でハッシュ インデックスを使用しないでください。 |
プライマリ インスタンスでのクエリは常に実行中です。 | レプリカの作成後、クエリ SELECT * from pg_stat_activity where state = 'active' and pid = XXXX and username = 'cloudsqlreplica' はプライマリ インスタンスで継続的に実行されます。 |
レプリカの作成がタイムアウトで失敗する。 | プライマリ インスタンスで長時間 commit されていないトランザクションが実行されると、リードレプリカの作成に失敗することがあります。 実行中のクエリをすべて停止してからレプリカを再作成します。 |
プライマリ インスタンスとレプリカの vCPU サイズが異なる場合、クエリ オプティマイザーは vCPU サイズを考慮するため、クエリのパフォーマンスに問題が生じる可能性があります。 |
この問題を解決するには、次の操作を行います。
特定のクエリの場合は、クエリを変更します。たとえば、結合の順序を変更して、パフォーマンスが向上するかどうかを確認できます。 |
次のステップ
- レプリカの管理について学習します。
- クロスリージョン レプリカについて学習する。