Cloud SQL 中的复制功能简介

复制功能是指创建 Cloud SQL 实例或本地数据库的副本,并将工作分流到副本。

简介

使用复制功能的主要原因是在不降低性能的情况下扩大数据库中的数据使用量。

其他原因包括:

  • 在区域之间迁移数据
  • 在平台之间迁移数据
  • 将数据从本地数据库迁移到 Cloud SQL

此外,如果原始实例已损坏,则系统可能会提升副本。

在引用 Cloud SQL 实例时,用于复制的实例称为主实例,而副本则称为读取副本。主实例和读取副本都驻留在 Cloud SQL 中。

在引用本地数据库时,复制场景称为从外部服务器复制。在此场景中,用于复制的数据库是源数据库服务器。驻留在 Cloud SQL 中的副本称为 Cloud SQL 副本。在 Cloud SQL 中,还有一个表示源数据库服务器的实例,该实例称为源表示形式实例。

在灾难恢复场景中,您可以提升副本,以将其转换为主实例。这样,您就可以使用此主实例来替代服务中断的区域中的实例。您还可以提升副本来替换损坏的实例。

Cloud SQL 支持以下类型的副本:

通过使用连接器强制执行,您可以强制仅使用 Cloud SQL Auth 代理或 Cloud SQL 语言连接器连接到 Cloud SQL 实例。强制使用连接器后,Cloud SQL 会拒绝与数据库的直接连接。您无法为启用了连接器强制执行的实例创建读取副本。同样,如果实例具有读取副本,则您无法为该实例启用连接器强制执行。

您还可以使用 Database Migration Service 从源数据库服务器持续复制到 Cloud SQL。

Cloud SQL 不支持两个外部服务器之间的复制。 不过,Cloud SQL 支持基于全局事务标识符 (GTID) 的复制。GTID 唯一标识服务器上和复制设置中的每个事务。由于每个事务都有一个唯一标识符,因此 MySQL 服务器可以跟踪其已运行的事务。GTID 使用绝对坐标,因此 Cloud SQL 实例的副本可以指向其主实例,您无需为二进制日志指定文件名或在 CHANGE MASTER 语句中指定位置。副本和时间点恢复的错误较少。由于具备这些优势,您不能在 Cloud SQL 中停用基于 GTID 的复制。

只读副本

您可以使用读取副本从 Cloud SQL 实例中分流工作。读取副本是主实例的精确副本。主实例上的数据和其他更改几乎在读取副本上实时更新。

读取副本是只读副本;您无法将数据写入其中。读取副本会处理查询、读取请求和分析流量,从而减少主实例的负载。

您可以使用副本的连接名称和 IP 地址直接连接到副本。如果您要使用专用 IP 地址连接到副本,则无需为副本创建其他 VPC 专用连接,因为连接是从主实例继承的。

如需了解如何创建只读副本,请参阅创建只读副本。如需了解如何管理只读副本,请参阅管理只读副本

在主实例上使用 HA 时,最好将只读副本放在与主实例不同的可用区中。这种做法可确保只读副本在包含主实例的可用区中断服务时继续运行。如需了解详情,请参阅高可用性概览

选择适当的机器类型

读取副本的机器类型可以与主实例不同。您应该监控实例上的指标(例如 CPU 和内存用量),以确保副本实例的大小适合其工作负载,特别是在副本实例小于主实例时。容量不足的副本实例更有可能出现性能不佳的情况,例如频繁的内存不足 (OOM) 事件。

跨区域读取副本

您可以利用跨区域复制功能,在与主实例不同的区域中创建只读副本。创建跨区域只读副本的方式与创建区域内副本的方式相同。

使用跨区域副本具有以下优势:

  • 在更接近应用所在区域的位置提供副本,从而提高读取性能。
  • 提供更高的灾难恢复能力,可防范区域性故障。
  • 可让您将数据从一个区域迁移到另一个区域。

如需详细了解跨区域副本,请参阅提升副本以实现区域性迁移或灾难恢复

级联读取副本

通过级联复制功能,您可以在相同或不同区域中的一个读取副本下创建另一个读取副本。以下场景是使用级联副本的应用场景:

  • 灾难恢复:您可以使用读取副本的级联层次结构来模拟主实例及其读取副本的拓扑。在服务中断期间,您选择的读取副本将提升为主实例,并且新主实例下的读取副本会继续复制并可供使用。
  • 性能提升:通过将复制工作分流到多个读取副本来减轻主实例的负担。
  • 扩缩读取:您可以有更多副本来分担读取负载。
  • 费用降低:通过在其他区域中将单个级联副本与跨区域复制结合使用,您可以减少网络费用。

术语

  • 级联副本:自身可以具有副本的读取副本。
  • 级层:您可以在级联副本层次结构中创建多个级层的副本。例如,如果您向一个实例添加 4 个副本,则这 4 个副本处于同一级层。
  • 同级实例:从同一主实例复制的多个副本。同级对象在副本层次结构中处于同一级层。一个副本最多支持 8 个同级对象。
  • 叶副本:自身没有任何副本的读取副本。 在多级复制层次结构中,叶副本处于最后一个级层。
  • 提升:用于将处于层次结构中任意级层的副本转换为主实例的操作。提升后,副本的级联副本层次结构会保留。

配置级联副本

级联副本让您可以将读取副本添加到任何现有副本。您最多可以添加 4 个级层的副本,包括主实例。将副本提升到级联副本层次结构的顶层后,它将成为主实例,并且其级联副本会继续复制。

如需规划配置,您需要设定有关读取副本要执行的操作的目标。接下来的两个部分介绍了适用于灾难恢复和多区域复制场景的配置。

灾难恢复

如需了解级联副本如何帮助您在服务中断期间快速恢复,请考虑以下复制场景:

配置

描述单独区域中具有级联副本的级联副本配置

服务中断

在服务中断期间显示提升或副本

提升

描述具有副本的新实例

如果您要在灾难恢复配置中使用区域 B 中的实例,并且

  • 将同一区域中的副本附加到主实例(副本 A)
  • 将其他区域中的副本(级联副本)附加到主实例。

您可以在区域 B 中的级联副本下创建读取副本。

服务中断标签页上,如果区域 A 发生服务中断,则级联副本会提升为主实例。级联副本下面已有读取副本,从而减少了恢复时间目标 (RTO)。

提升标签页上,您可以看到级联副本提升后,其副本也会提升并继续在其下复制。

多区域复制

级联副本的另一个使用场景是以经济实惠的方式将读取容量分布到第二个区域。您可以创建从副本 B 复制的级联副本 C 和 D。客户端可以在副本 B、C 和 D 之间分布读取查询,以减少每个副本的负载。跨区域网络流量的费用仅会在主实例到副本 B 时产生一次。从 B 到 C 和 D 的复制使用免费的区域内网络传输。

您可以将级联副本用于多区域复制来创建最多包含 4 个实例的层次结构:

主实例 A → 副本 B → 副本 C 和副本 D

限制

  • 您无法删除其下包含副本的副本。如需删除副本,您必须从叶副本开始,然后向上通过层次结构。
  • 系统不支持循环区域依赖。如需将级联副本的副本存放在与主实例相同的区域,该级联副本自身也必须位于同一区域。

外部读取副本

外部只读副本是从 Cloud SQL 主实例复制的外部 MySQL 实例。例如,在 Compute Engine 上运行的 MySQL 实例被视为外部实例。

外部只读副本具有以下限制:

  • 可能无法将数据复制到由其他云平台托管的 MySQL 实例;详情请查看其他提供商的相关文档。例如,必须设置配置字段 replicate-ignore-db,并且不允许此字段的云服务提供商不受支持。如需了解其他必填配置字段,请参阅配置外部副本
  • 如果复制中断几个小时(例如由网络或服务器中断而引起),则副本的状态会滞后于主实例。一旦副本重新连接到主实例并再次开始复制,副本会立即与主实例同步。但是,如果复制中断的时间超过了 Cloud SQL 复制日志的保留时间(七个备份),则必须删除该副本并创建新的副本。
  • 从主实例流向外部副本的数据作为出站数据传输进行计费。如需了解 Cloud SQL 实例类型的数据传输价格,请参阅价格页面。
  • 如果您为实例创建外部读取副本,并强制要求仅使用 Cloud SQL Auth 代理或 Cloud SQL 语言连接器连接到已为其配置专用服务访问通道的实例,则必须将副本的子网范围添加到主实例的受信任网络。您必须将所有范围都配置为 Cloud SQL 实例的已获授权的网络。

    gcloud

    如需为实例设置 IP 授权,以允许来自外部读取副本 IP 地址范围的流量,请使用 gcloud sql instances patch 命令:

    gcloud sql instances patch \
    --authorized-networks=IP_ADDRESS_RANGE_1/24,IP_ADDRESS_RANGE_2/24

    IP_ADDRESS_RANGE_1IP_ADDRESS_RANGE_2 替换为外部读取副本的 IP 地址范围。

    REST

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

    • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号
    • INSTANCE_NAME:Cloud SQL 实例的名称
    • IP_ADDRESS_RANGE_1:外部读取副本的第一个 IP 地址范围
    • IP_ADDRESS_RANGE_2:外部读取副本的第二个 IP 地址范围

    HTTP 方法和网址:

    PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME

    请求 JSON 正文:

    {
      "kind": "sql#instance",
      "name": INSTANCE_NAME,
      "project": PROJECT_ID,
      "settings": {
        "ipConfiguration": {
          "authorizedNetworks": [{"kind": "sql#aclEntry", "value": "IP_ADDRESS_RANGE_1/24"}, {"kind": "sql#aclEntry", "value": "IP_ADDRESS_RANGE_2/24"}]},
      "kind": "sql#settings"
      }
    }

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

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

    {
      "kind": "sql#operation",
      "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME",
      "status": "PENDING",
      "user": "user@example.com",
      "insertTime": "2020-01-16T02:32:12.281Z",
      "operationType": "UPDATE",
      "name": "OPERATION_ID",
      "targetId": "INSTANCE_NAME",
      "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
      "targetProject": "PROJECT_ID"
    }
    

复制功能的使用场景

以下使用场景适用于每种复制类型。

名称 主实例 副本 优势和用例 更多信息
读取副本 Cloud SQL 实例 Cloud SQL 实例
  • 额外的读取容量
  • 分析目标
跨区域读取副本 Cloud SQL 实例 Cloud SQL 实例
  • 额外的读取容量
  • 分析目标
  • 其他灾难恢复功能
  • 提升读取性能
  • 在区域之间迁移数据
外部只读副本 Cloud SQL 实例 位于 Cloud SQL 外部的 MySQL 实例
  • 缩短了外部连接的延迟时间
  • 分析目标
  • 迁移到其他平台的路径
从外部服务器复制 位于 Cloud SQL 外部的 MySQL 实例 Cloud SQL for MySQL 实例
  • 迁移至 Cloud SQL 的路径
  • 将数据复制到 Google Cloud
  • 分析目标

创建只读副本的前提条件

实例必须满足以下要求,您才能创建 Cloud SQL 主实例的只读副本:

  • 必须启用自动备份。
  • 必须启用二进制日志记录,这需要启用时间点恢复。详细了解这些日志的影响。
  • 启用二进制日志记录功能后,必须至少已创建一个备份。

外部副本的额外要求:

  • 副本的 MySQL 版本必须与主实例的 MySQL 版本相同或更高。了解详情
  • 为安全起见,您必须在主实例上配置 SSL/TLS。了解详情

启用二进制日志记录的影响

您必须启用时间点恢复,才能在主实例上启用二进制日志记录来支持只读副本。此操作具有以下影响:

  • 性能开销

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

  • 存储开销

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

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

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

读取副本的二进制日志记录功能

  • 读取副本实例支持二进制日志记录功能(仅限 MySQL 5.7 和 8.0)。您可以使用与主实例相同的 API 命令并使用副本实例名称而非主实例名称,对副本实例启用二进制日志记录功能。请注意,enable binary loggingenable point-in-time recovery 这两个术语可以互换。

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

    即使对主实例停用了备份,仍可以对副本实例启用二进制日志记录功能。

    如果设置此值的副本提升为独立服务器,则该设置在独立服务器上会重置为安全值 1

结算

  • 读取副本按与标准 Cloud SQL 实例相同的费率计费。系统不会对数据复制操作收费。
  • 对于外部副本,从主实例流向外部副本的数据作为数据传输进行计费。如需了解 Cloud SQL 实例类型的数据传输价格,请参阅价格页面。
  • 跨区域读取副本的价格与在同一区域中创建新 Cloud SQL 实例时的价格相同。请参阅 Cloud SQL 实例价格并选择相应的区域。除了与实例关联的常规费用之外,跨区域副本还会因从主实例发送到副本实例的复制日志而产生跨区域数据传输费用,如网络出站流量价格中所述。

Cloud SQL 读取副本的快速参考信息

主题 讨论
备份 您不能为副本配置备份。
核心和内存 读取副本使用的核心数和内存量可能与主实例不同。
删除主实例 您必须先将主实例的所有读取副本提升为独立实例或删除它们,然后才能删除主实例。
删除副本 删除副本对主实例的状态没有影响。
停用二进制日志 您必须先提升或删除主实例的所有读取副本,然后才能停用主实例上的二进制日志。
故障切换 仅当副本是灾难恢复副本时,主实例才能故障切换到副本。在服务中断期间,读取副本无法以任何方式进行故障切换。
高可用性 读取副本使您可以在副本上启用高可用性
负载均衡 Cloud SQL 不会在各副本之间提供负载均衡。您可以选择为 Cloud SQL 实例实现负载均衡。您还可以使用连接池在具有负载均衡设置的各副本之间分配查询,以提高性能。
维护期 读取副本与主实例共享维护窗口。副本遵循主实例的维护设置,包括维护窗口、重新安排和拒绝维护期。在维护期间,Cloud SQL 会先更新所有读取副本,然后再更新主实例。
多个读取副本 Cloud SQL 支持级联副本。因此,您最多可以为一个主实例创建 10 个副本,并为这些副本创建副本,最多可以创建四层,包括主实例。
并行复制 注意:如需了解如何使用并行复制来提高性能,请参阅配置并行复制
专用 IP 如果您要使用专用 IP 地址连接到副本,则无需为副本创建其他 VPC 专用连接,因为它是从主实例继承的。
恢复主实例 当副本存在时,您无法恢复副本的主实例。在通过备份来恢复实例或对实例执行时间点恢复之前,您必须先提升或删除实例的所有副本。
设置 主实例的 MySQL 设置会传播到副本,包括 root 密码及对用户表的更改。CPU 和内存更改不会传播到副本。
停止副本 您不能对副本执行 stop 操作。您可以对它执行 restartdeletedisable replication 操作,但不能像停止主实例那样对其执行停止操作。
升级副本 读取副本随时可能出现升级中断。
用户表 您不能对副本进行更改。所有用户更改都必须在主实例上完成。

后续步骤