创建读取副本

本页介绍如何创建 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 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”

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,
    
  }
}

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

您应该收到类似以下内容的 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"

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

创建级联副本的步骤

创建级联副本时,您必须在与可级联副本相同的区域中创建副本。您可以通过在 –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 等查询会导致基于行的复制出现复制延迟。

以下是一些可行的解决方案:

  • 修改实例以增加副本的大小。
  • 减少数据库的负载。
  • 将读取流量发送到读取副本。
  • 将表编入索引。
  • 识别并修复速度缓慢的写入查询。
  • 重新创建副本。
副本创建失败并超时。 主实例上长时间运行的未提交事务可能会导致只读副本创建失败。

停止所有正在运行的查询后重新创建副本。

后续步骤