与复制功能的配置相关的要求和提示

本页面介绍了有关使用读取副本外部副本的要求和最佳做法。

如需了解如何配置读取副本,请参阅创建读取副本

读取副本

读取副本是从 Cloud SQL 主实例复制的 Cloud SQL 实例。读取副本为只读状态。您无法对此类副本执行写入操作。您可以使用副本从主实例中分流读取请求和分析流量。

如需了解如何配置读取副本,请参阅创建读取副本

读取副本主实例要求

Cloud SQL 实例必须先满足以下要求,然后您才能创建该实例的读取副本:

  • 必须启用二进制日志功能。了解详情
  • 启用二进制日志功能后,必须至少已创建一个备份。

Cloud SQL 读取副本主题的快速参考

主题 讨论
高可用性 读取副本既不具有高可用性,也不提供此性能。
故障转移 主实例无法故障转移到读取副本,并且读取副本在中断期间无法以任何方式进行故障转移。
维护期 读取副本不支持维护期设置,它们不与主实例共享维护期。可能随时对读取副本进行维护。读取副本与主实例的维护时间不同。
中断性升级 读取副本随时可能出现升级中断。
性能 当您创建读取副本时,该副本不会影响主实例的性能或可用性。
多个读取副本 您可以为一个主实例创建多个读取副本。
负载平衡 Cloud SQL 不会在各副本之间提供负载平衡。
设置 主实例的 MySQL 设置会传播到副本,包括 root 密码及对用户表的更改。层级更改不会传播到副本。
机器类型 读取副本的机器类型(或层级)可以与主实例的不同。读取副本的 CPU 和内存可以多于但不能少于主实例的 CPU 和内存。
用户表 您不能更改副本中的用户表。所有用户更改都必须在主实例上完成。
备份 您不能为副本配置备份。
恢复主实例 当副本存在时,您无法恢复副本的主实例。在通过备份来恢复实例或对实例执行时间点恢复之前,您必须先提升或删除实例的所有副本。
删除主实例 您必须先将主实例的所有读取副本提升为独立实例或删除它们,然后才能删除主实例。
停用二进制日志记录功能 您必须先提升或删除主实例的所有读取副本,然后才能停用主实例上的二进制日志。
为副本创建副本 您不能为副本创建副本。
停止副本 您不能对副本执行 stop 操作。您可以对它执行 restartdeletedisable replication 操作,但不能像停止主实例那样对它执行停止操作。

结算

  • 读取副本按与标准 Cloud SQL 实例相同的费率计费。系统不会对数据复制操作收费。
  • 由于副本始终与其主实例保持连接,因此主实例永不会停用。这种情况可能导致主实例的计费增加。了解详情

外部读取副本

外部读取副本是从 Cloud SQL 主实例复制的外部 MySQL 实例。

如需了解如何配置外部读取副本,请参阅配置外部副本

外部读取副本配置要求

主实例的要求:

主实例必须启用二进制日志记录功能。了解详情

对外部副本的要求:

副本的 MySQL 版本必须与主实例的 MySQL 版本相同或更高。了解详情

外部副本配置的相关信息

以下信息适用于外部副本配置:

  • 在 Compute Engine 上运行的 MySQL 实例被视作外部实例。
  • 从主实例流向外部副本的数据作为网络出站流量进行计费。如需了解 Cloud SQL 实例类型的网络出站流量价格,请参阅价格页面。
  • 可能无法将数据复制到由其他云平台托管的 MySQL 实例;详情请查看其他提供商的相关文档。
  • 如果复制中断几个小时(例如由网络或服务器中断而引起),则副本的状态会滞后于主实例。一旦副本重新连接到主实例并再次开始复制,副本会立即与主实例同步。但是,如果复制中断的时间超过了 Cloud SQL 复制日志的保留时间(7 个备份),则必须删除该副本并创建新的副本。
  • 为安全起见,在主实例上配置 SSL/TLS。了解详情

二进制日志记录的影响

您必须启用主实例的二进制日志才能支持读取副本。此操作具有以下影响:

  • 性能开销

    Cloud SQL 配合 MySQL 标志 sync_binlog=1innodb_support_xa=true 使用基于行的复制方式。因此,每次写入操作都需要额外的磁盘 fsync,这会降低性能。

  • 存储开销

    二进制日志的存储按常规数据的费率进行计费。二进制日志会自动截断到最早的自动备份的存在时间。Cloud SQL 当前保留最近的 7 个自动备份和所有按需备份。二进制日志的大小及由此产生的费用取决于工作负载。例如,与频繁读取的工作负载相比,频繁写入的工作负载将占用更多的二进制日志空间。

    您可以使用 SHOW BINARY LOGS MySQL 命令查看二进制日志的大小。

    进行备份时,日志随数据一起存储在备份中。

  • 实例重启

    启用或停用二进制日志记录功能时,实例会重启。现有数据库连接将丢失,必须重新建立。

问题排查

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

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

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

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

可能的原因

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

可以尝试的操作

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


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

无法创建读取副本 - 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 等查询会导致基于行的复制出现复制延迟。

可以尝试的操作

对实例进行修改以增加副本的大小,或减少数据库的负载。

后续步骤