创建读取副本

本页面介绍了如何为 Cloud SQL 实例创建读取副本。

读取副本是主实例的副本,可几乎实时地反映主实例的更改。您可以使用读取副本执行以下操作:

  • 从主实例中分流读取请求或分析流量
  • 执行区域迁移或故障转移到另一个区域以进行灾难恢复(如果副本是跨区域副本,即在不同于主实例所在的区域中创建的副本)

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

准备工作

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

创建读取副本

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

控制台

  1. 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。

    转到“Cloud SQL 实例”页面

  2. 找到要创建副本的实例,并打开列表最右侧的 more actions 菜单。
  3. 选择创建读取副本

    如果您未看到此选项,则表示此实例是副本;您无法为副本创建副本。

  4. 如果实例已启用备份和二进制日志记录功能,请转到第 6 步。否则,请选择自动备份启用二进制日志记录功能,点击继续,然后点击保存并重启以重启实例。

    启用二进制日志记录功能会导致实例重启。

  5. 创建只读副本页面中,根据需要更新实例 ID 和任何其他所需的配置选项,包括名称、地区和区域。
  6. 点击创建

    Cloud SQL 会根据需要创建备份,并创建副本。随后,您将返回到主实例的实例页面。

gcloud

  1. 检查主实例的状态:
    gcloud sql instances describe PRIMARY_INSTANCE_NAME

    如果 databaseReplicationEnabled 属性为 true,则表示此实例是副本;您无法为副本创建副本。

  2. 如果 backupConfiguration 下的 enabled 属性为 false,请立即为主实例启用备份:
    gcloud sql instances patch PRIMARY_INSTANCE_NAME --backup-start-time >HH:MM
    backup-start-time 参数采用 UTC±00 时区的 24 小时制,用于指定一个 4 小时备份时段的开始时间,备份可在该时段内随时启动。
  3. 如果 binaryLogEnabled 属性为 false,请对主实例启用二进制日志:
    gcloud sql instances patch --enable-bin-log PRIMARY_INSTANCE_NAME
    启用二进制日志会导致实例重启。
  4. 创建副本:
    gcloud sql instances create REPLICA_NAME --master-instance-name=PRIMARY_INSTANCE_NAME
    

    如果需要,您可以使用 --tier 参数指定不同的层级大小。

    您可以使用 --region 参数指定不同区域。

    如果主实例只有专用 IP 地址,请在命令中添加 --no-assign-ip 参数。

  • 读取副本实例支持二进制日志记录功能(仅限 MySQL 5.7 和 8.0)。使用相同的 gcloud 命令对副本实例启用二进制日志记录功能,并使用副本实例名称而非主实例名称。
    gcloud sql instances patch --enable-bin-log REPLICA_INSTANCE_NAME
        

    您可以使用 sync_binlog 标志对副本实例(而非主实例)设置二进制日志记录持久性,该标志可控制 MySQL 服务器将二进制日志同步到磁盘的频率。

    无法对副本实例启用备份,但与主实例不同,即使备份被停用,仍可以对副本实例启用二进制日志记录功能。

REST v1beta4

  1. 获取当前备份配置

    使用实例资源的 get 方法返回主实例的数据库版本和当前备份配置。

    在使用下面的任何请求数据之前,请先进行以下替换:

    • project-id:项目 ID
    • primary-instance-name:主实例的名称

    HTTP 方法和网址:

    GET https://www.googleapis.com/sql/v1beta4/projects/project-id/instances/primary-instance-name

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

    您应该收到类似以下内容的 JSON 响应:

  2. 验证是否已设置复制字段

    如果在主实例上 enabledbinaryLogEnabledfalse,请使用实例资源的 patch 方法同时启用这两项。在请求中,指定您想要更改的备份配置的所有属性。

    如需启用备份,请将 enabled 设置为 true,并将 startTime 设置为 HH:MM 格式的时间。startTime 参数采用 UTC±00 时区的 24 小时制,用于指定一个 4 小时备份时段的开始时间。备份可在该时段内随时启动。

    如需启用时间点恢复,请在主实例上将 binaryLogEnabled 设置为 true

    读取副本实例支持二进制日志记录功能(仅限 MySQL 5.7 和 8.0)。使用相同的 API 对副本实例启用二进制日志记录功能,并使用副本实例 ID 而非主实例 ID。

    您可以使用 sync_binlog 标志对副本实例(而非主实例)设置二进制日志记录持久性,该标志可控制 MySQL 服务器将二进制日志同步到磁盘的频率。

    无法对副本实例启用备份,但与主实例不同,即使备份被停用,仍可以对副本实例启用二进制日志记录功能。

    在使用下面的任何请求数据之前,请先进行以下替换:

    • project-id:项目 ID
    • instance-id:实例 ID(主实例或副本实例)
    • start-time:采用“HH:MM”格式表示的时间
    • enabled:对于主实例,设置为 true。对于副本实例,设置为 false

    HTTP 方法和网址:

    PATCH https://www.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id

    请求 JSON 正文:

    {
      "settings":
      {
        "backupConfiguration":
        {
          "startTime": "start-time",
          "enabled": enabled,
          "binaryLogEnabled": true
        }
      }
    }
    

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

    您应该会收到类似以下内容的 JSON 响应:

  3. 创建只读副本

    使用实例资源的 insert 方法创建只读副本。databaseVersion 属性必须与主实例相同。对于跨地区读取副本,请指定主实例所在地区以外的一个地区。

    在使用下面的任何请求数据之前,请先进行以下替换:

    • project-id:项目 ID
    • primary-instance-name:主实例的名称
    • primary-instance-region:主实例的地区
    • replica-region:副本实例的地区
    • replica-name:副本实例的名称
    • machine-type:机器(层级)类型的枚举字符串。例如“db-n1-standard-4”

    HTTP 方法和网址:

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

    请求 JSON 正文:

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

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

    您应该会收到类似以下内容的 JSON 响应:

问题排查

点击表中的链接可查看详细信息:

针对此问题… 可能的原因… 请尝试以下操作…
创建时读取副本未开始复制。 启用二进制日志记录后,必须至少已创建一个备份。 启用二进制日志后,等到至少创建了一个备份
无法创建读取副本 - 未知错误。 可能存在多个根本原因。 查看日志以了解详情
磁盘已满。 主实例磁盘大小可能在副本创建期间变满。 将主实例升级为更大的磁盘。
副本实例占用的内存过多。 副本可以缓存经常请求的读取操作。 重启副本实例以收回临时内存空间。
已停止复制。 已达到存储空间上限,且未启用存储空间自动扩容功能。 启用存储空间自动扩容功能
复制延迟一直很高。 可能存在多个不同的根本原因 此处罗列了一些可以尝试的操作。

创建时读取副本未开始复制

创建时读取副本未开始复制。

可能的原因

主实例必须至少具有一周的二进制日志,否则副本无法开始复制。

可以尝试的操作

等到有足够的二进制日志。


无法创建读取副本 - 未知错误

无法创建读取副本 - unknown error

可能的原因

日志文件中可能有更具体的错误信息。

可以尝试的操作

在 Cloud Logging 中查看日志以找到实际错误。如果错误为 set Service Networking service account as servicenetworking.serviceAgent role on consumer project,则停用 Service Networking API,然后重新启用。此操作会创建继续执行该过程所需的服务帐号。


磁盘已满

UPDATE_DISK_SIZEmysqld: disk is full 错误。

可能的原因

主实例磁盘大小可能在副本创建期间变满。

可以尝试的操作

对主实例进行修改以将其升级为更大的磁盘。


副本实例占用的内存过多

副本实例占用的内存过多。

可能的原因

副本使用临时内存来缓存经常请求的读取操作,这可能会导致其占用的内存多于主实例。

可以尝试的操作

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


已停止复制

已停止复制。

可能的原因

已达到存储空间上限并且 >automatic storage increase is disabled

可以尝试的操作

对实例进行修改以启用 automatic storage increase


复制延迟一直很高

复制延迟一直很高。

可能的原因

写入负载过高,副本无法处理。当副本上的 SQL 线程无法与 IO 线程保持同步时,会发生复制延迟。某些类型的查询和工作负载会导致指定架构出现暂时性或永久性的高复制延迟。下面列出了复制延迟的部分常见原因:

  • 对副本的查询速度较慢。您可以启用 log_slow_slave_statements 来检测此问题并进行修复。
  • 所有表都必须具有唯一键/主键。每次更新此类没有唯一键/主键的表都会导致对副本进行全表扫描。
  • 由于大量更新堆积在副本上,因此 DELETE ... WHERE field < 50000000 等查询会导致基于行的复制出现复制延迟。

可以尝试的操作

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

  • 修改实例以增加副本的大小。
  • 减少数据库的负载。
  • 将表编入索引。
  • 识别并修复速度缓慢的查询。
  • 重新创建副本。

后续步骤