创建读取副本

本页介绍如何创建 Cloud SQL 实例的只读副本。

如需设置 Cloud SQL 实例以充当外部订阅者的发布者,请参阅配置外部副本

只读副本是主实例的副本,可几乎实时地反映主实例的更改。您可以使用只读副本从主实例中分流读取请求或分析流量。

此外,对于灾难恢复,您可以执行区域迁移。如果副本是跨区域副本,您可以执行故障切换到另一个区域;具体而言,您可以将副本提升为独立实例(在这种情况下,现有副本不会将该实例视为主实例)。

如需详细了解复制的工作原理,请参阅 Cloud SQL 中的复制

准备工作

如果要为此实例创建第一个副本,请确保该实例满足主实例的要求。了解详情

创建读取副本

创建读取副本时,请注意以下事项:

  • 每个主实例最多可以创建 8 个读取副本。
  • 如果未指定版本,则默认版本为 Cloud SQL 企业版。
  • 如果在创建读取副本或级联副本时,主实例是 Cloud SQL 企业 Plus 版实例,则您必须指明要使用的版本和层级。

以下是创建只读副本的步骤。

控制台

  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 instances create

您必须在与主实例相同的 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 方法创建只读副本。region 和 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”

您可以使用 sqlNetworkArchitecture 字段在创建实例时强制使用新的网络架构,即使项目尚未完全升级也是如此。如需详细了解新网络架构及其影响,请参阅将实例升级到新的网络架构分配 IP 地址范围

HTTP 方法和网址:

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,
    
  },
  "sqlNetworkArchitecture": "NEW_NETWORK_ARCHITECTURE"
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 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 代理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 代理Cloud SQL 语言连接器,则必须为副本创建 DNS 区域DNS 记录

HTTP 方法和网址:

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 代理Cloud SQL 语言连接器,则必须为副本创建 DNS 区域DNS 记录

HTTP 方法和网址:

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"

创建可级联副本后,您可以创建级联副本。

Terraform

如需创建可级联副本,请使用 Terraform 资源

以下示例会创建一个主实例和一个可级联副本,在执行切换操作(作为高级灾难恢复 (DR) 的一部分)时,您可以将该可级联副本指定为灾难恢复副本。

resource "google_sql_database_instance" "original-primary" {
  name   = "sqlserver-primary-instance-name"
  region = "us-east1"
  # Specify a database version that supports Cloud SQL Enterprise Plus edition.
  database_version = "SQLSERVER_2022_ENTERPRISE"
  instance_type    = "CLOUD_SQL_INSTANCE"
  root_password    = "INSERT-PASSWORD-HERE"
  replica_names    = ["sqlserver-replica-instance-name"]
  settings {
    tier    = "db-perf-optimized-N-2"
    edition = "ENTERPRISE_PLUS"
    backup_configuration {
      enabled = "true"
    }
  }
}

resource "google_sql_database_instance" "dr_replica" {
  name = "sqlserver-replica-instance-name"
  # Specify the original primary instance as the master instance.
  master_instance_name = google_sql_database_instance.original-primary.name
  # DR replica must be in a different region than the region of the primary instance.
  region = "us-west2"
  # DR replica must be the same database version as the primary instance.
  database_version = "SQLSERVER_2022_ENTERPRISE"
  instance_type    = "READ_REPLICA_INSTANCE"
  root_password    = "INSERT-PASSWORD-HERE"
  replica_configuration {
    # Make the replica a cascadable replica.
    cascadable_replica = true
  }

  settings {
    # DR replica must be in the same tier as your primary instance and support Enterprise Plus edition.
    tier    = "db-perf-optimized-N-2"
    edition = "ENTERPRISE_PLUS"
  }
}

创建级联副本的步骤

创建级联副本时,您必须在与可级联副本相同的区域中创建副本。您可以通过在 –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,然后重新启用。此操作会创建继续执行该过程所需的服务账号。

磁盘已满。 主实例磁盘大小可能在副本创建期间变满。 修改主实例以将其升级为更大的磁盘。
副本实例占用的内存过多。 副本使用临时内存来缓存经常请求的读取操作,这可能会导致其占用的内存多于主实例。

重启副本实例以收回临时内存空间。

已停止复制。 已达到存储空间上限,且未启用存储空间自动扩容功能。

修改实例以启用