管理读取副本

本页面介绍如何管理读取副本。相关操作包括停用和启用复制功能、提升副本、配置并行复制以及检查复制状态。

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

停用复制功能

默认情况下,复制功能会随副本的启动而启用。 但您可以停用复制功能,例如,要对实例状态进行调试或分析时。准备就绪后,您可以明确重新启用复制功能。停用或重新启用复制功能不会重启副本实例。

停用复制功能并不会使副本实例停止,而是使该实例变成一个不再从其主实例复制内容的只读实例。系统会继续向您收取该实例的费用。在已停用的副本上,您可以重新启用复制、删除副本或将副本提升为独立实例。

如需停用复制功能,请按如下所述操作:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击某副本实例的名称以选择该实例。
  3. 点击按钮栏中的停用复制功能按钮。
  4. 点击确定

gcloud

gcloud sql instances patch REPLICA_NAME \
--no-enable-database-replication

REST v1

如需在命令行提示符处执行此 cURL 命令,请使用 gcloud auth print-access-token 命令获取访问令牌,也可以使用 Instances:patch 页面上的 APIs Explorer 发送 REST API 请求。

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

  • project-id:项目 ID
  • replica-name:副本实例的名称

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name

请求 JSON 正文:

{
  "settings":
  {
    "databaseReplicationEnabled": "False"
  }
}

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

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

REST v1beta4

如需在命令行提示符处执行此 cURL 命令,请使用 gcloud auth print-access-token 命令获取访问令牌,也可以使用 Instances:patch 页面上的 APIs Explorer 发送 REST API 请求。

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

  • project-id:项目 ID
  • replica-name:副本实例的名称

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name

请求 JSON 正文:

{
  "settings":
  {
    "databaseReplicationEnabled": "False"
  }
}

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

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

启用复制功能

如果某副本已有很长时间未复制内容,它将需要较长时间才能与主实例同步。在这种情况下,请删除该副本并创建一个新副本。

如需启用复制功能,请按如下所述操作:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击某副本实例的名称以选择该实例。
  3. 点击启用复制功能
  4. 点击确定

gcloud

gcloud sql instances patch REPLICA_NAME \
--enable-database-replication

REST v1

如需在命令行提示符处执行此 cURL 命令,请使用 gcloud auth print-access-token 命令获取访问令牌,也可以使用 Instances:patch 页面上的 APIs Explorer 发送 REST API 请求。

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

  • project-id:项目 ID
  • replica-name:副本实例的名称

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name

请求 JSON 正文:

{
  "settings":
  {
    "databaseReplicationEnabled": "True"
  }
}

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

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

REST v1beta4

如需在命令行提示符处执行此 cURL 命令,请使用 gcloud auth print-access-token 命令获取访问令牌,也可以使用 Instances:patch 页面上的 APIs Explorer 发送 REST API 请求。

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

  • project-id:项目 ID
  • replica-name:副本实例的名称

HTTP 方法和网址:

PATCH https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name

请求 JSON 正文:

{
  "settings":
  {
    "databaseReplicationEnabled": "True"
  }
}

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

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

提升副本

提升读取副本会停止复制,并会将实例转换为具有读写功能的独立 Cloud SQL 主实例。

提升时,读取副本会自动配置备份,但不会自动配置为高可用性 (HA) 实例。您可以在升级副本后启用高可用性,就像处理任何非副本实例一样。为高可用性配置读取副本的方式与为主实例配置的方式相同。详细了解如何配置实例以实现高可用性

在提升只读副本之前,如果主实例仍然可用并为客户端提供服务,则您应执行以下操作:

  1. 停止对主实例的所有写入操作。
  2. 检查副本的复制状态(请按照 mysql 客户端标签页中的说明操作)。
  3. 验证副本是否正在复制,然后等到 Seconds_Behind_Master 指标报告的复制延迟时间为 0。

否则,新提升的实例可能缺少提交到主实例的部分事务。

如需将副本提升为独立实例,请按如下所述操作:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud SQL 实例页面。

    转到“Cloud SQL 实例”

  2. 点击某副本实例的名称以选择该实例。
  3. 点击提升副本
  4. 点击确定

gcloud

gcloud sql instances promote-replica REPLICA_NAME
  

REST v1

如需在命令行提示符处执行此 cURL 命令,请使用 gcloud auth print-access-token 命令获取访问令牌,也可以使用 Instances:promoteReplica 页面上的 APIs Explorer 发送 REST API 请求。

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

  • project-id:项目 ID
  • replica-name:副本实例的名称

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/replica-name/promoteReplica

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

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

REST v1beta4

如需在命令行提示符处执行此 cURL 命令,请使用 gcloud auth print-access-token 命令获取访问令牌,也可以使用 Instances:promoteReplica 页面上的 APIs Explorer 发送 REST API 请求。

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

  • project-id:项目 ID
  • replica-name:副本实例的名称

HTTP 方法和网址:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/replica-name/promoteReplica

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

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

确认已正确配置提升的实例。 具体而言,如果需要,请考虑配置实例以使其具备高可用性

配置并行复制

减少复制延迟对于管理复制性能至关重要。如果只读副本的更新滞后于主实例的更新,则会发生复制延迟。本部分介绍了用户如何启用并行复制,从而减少复制延迟。

在 MySQL 复制中,复制 SQL 线程用于执行只读副本的中继日志中收集的事务。并行复制通过增加执行这些事务的 SQL 线程数来缩短复制延迟时间。启用了并行复制的只读副本有时称为多线程副本。

在 Cloud SQL for MySQL 中,在以下三种情况下可以使用并行复制:

为简单起见,本页面使用“主实例”和“只读副本”这两个术语。

更改并行复制标志的基本步骤

启用并行复制的步骤如下所示:

  1. 在只读副本上,停用复制功能
  2. 在只读副本上,为并行复制设置标志。使用 gcloud 命令可以设置标志。停用复制功能时,系统会停用 Google Cloud Console 选项。
  3. 在只读副本上,启用复制功能
  4. (可选)在主实例上设置标志以优化并行复制的性能

只读副本:并行复制标志

Cloud SQL for MySQL 支持多个在只读副本上进行并行复制的标志。如需了解这些标志,请点击指向 MySQL 8.0 文档的链接:

更改这些标志不会重启只读副本。

下表包含以下标志允许使用的范围和默认值:

只读副本标志 允许使用的值 MySQL 5.7(默认值) MySQL 8.0(默认值)
slave_parallel_workers 0-1024 0 0(MySQL 8.0.26 及更早版本)
4(MySQL 8.0.27 及更高版本)
slave_parallel_type DATABASE, LOGICAL_CLOCK DATABASE DATABASE(MySQL 8.0.26 及更早版本)
LOGICAL_CLOCK(MySQL 8.0.27 及更高版本)
slave_preserve_commit_order ON, OFF OFF OFF(MySQL 8.0.26 及更早版本)
ON(MySQL 8.0.27 及更高版本)
slave_pending_jobs_size_max 1024-1 GB 16 MB 128 MB

slave_preserve_commit_order 标志可防止从副本的中继日志执行的事务序列中存在间断。

slave_preserve_commit_order=1 设置要求执行以下操作:

slave_pending_jobs_size_max 标志用于设置尚未应用的适用队列保留事件可用的最大内存(以字节为单位)。

主实例:并行复制标志

Cloud SQL for MySQL 支持在主实例上使用多个标志。您可以使用这些标志来调整启用了并行复制的关联只读副本的复制性能。如需了解这些标志,请点击指向 MySQL 8.0 文档的链接:

更改这些标志不会重启主实例。

下表包含以下标志允许使用的范围和默认值:

主实例标志 允许使用的值 MySQL 5.7(默认值) MySQL 8.0(默认值)
binlog_transaction_dependency_history_size 1-1000000 25000 25000
binlog_transaction_dependency_tracking COMMIT_ORDER, WRITESET, WRITESET_SESSION COMMIT_ORDER WRITESET
transaction_write_set_extraction OFF, MURMUR32, XXHASH64 OFF XXHASH64

在 MySQL 5.7 中,如果 binlog_transaction_dependency_tracking 设置为 WRITESETWRITESET_SESSION,则 transaction_write_set_extraction 应设置为非 OFF 值(XXHASH64MURMUR32)。

检查复制状态

使用 Google Cloud 控制台查看副本实例或使用管理客户端登录实例时,您可以获取有关复制的详细信息(包括状态和指标)。使用 gcloud CLI 时,您会看到有关复制配置的简短摘要。

在检查 Cloud SQL 副本实例的复制状态之前,请使用
gcloud sql instances describe 命令显示实例的状态。这样,您便可以查看是否已为副本实例启用了复制功能。

以下指标适用于副本实例。(详细了解适用于所有实例的其他指标,包括非副本实例。)

指标说明
复制状态
(cloudsql.googleapis.com/database/replication/state)

指示复制是否主动将日志从主实例流式传输到副本。可能的值包括:

  • Running
  • Stopped
  • Error

如果副本的 I/O 和 SQL 线程同时报告它们正在运行,则此指标会报告 Running。请参阅下面的从属 I/O 线程运行状态从属 SQL 线程运行状态指标了解详情,或查阅 MySQL 参考手册中的检查复制状态

复制延迟时间
(cloudsql.googleapis.com/database/replication/replica_lag)

副本状态滞后于主实例状态的时间长度。这是指 (1) 当前时间与 (2) 在主实例提交当前对副本应用的事务的原始时间戳之间的差值。具体而言,如果副本尚未被写入数据库,则即使写入副本已被写入,也可能会计为延迟。

对于级联副本,每个主实例-副本对都单独进行监控,并且没有一个指标会导致端到端(主实例到副本)延迟。

当副本在副本上运行 SHOW SLAVE STATUS 时,该指标会报告 Seconds_Behind_Master 的值。如需了解详情,请参阅《MySQL 参考手册》中的检查复制状态

网络延迟
(cloudsql.googleapis.com/database/replication/network_lag)

从在主数据库中写入二进制日志到抵达副本中的 IO 线程所花费的时间(以秒为单位)。

如果 network_lag 为零,或者可以忽略不计,但 `replica_lag` 较高,则表示 SQL 线程无法足够快速地应用复制更改。

从属 I/O 线程运行状态
(cloudsql.googleapis.com/database/mysql/replication/slave_io_running_state)

指示用于读取主实例二进制日志的 I/O 线程是否正在副本上运行。可能的值包括:

  • Yes
  • No
  • Connecting

当副本在副本上运行 SHOW SLAVE STATUS 时,该指标会报告 Slave_IO_Running 的值。如需了解详情,请参阅《MySQL 参考手册》中的检查复制状态

从属 SQL 线程运行状态
(cloudsql.googleapis.com/database/mysql/replication/slave_sql_running_state)

指示用于执行中继日志中的事件的 SQL 线程是否正在副本上运行。可能的值包括:

  • Yes
  • No
  • Connecting

当副本在副本上运行 SHOW SLAVE STATUS 时,该指标会报告 Slave_SQL_Running 的值。如需了解详情,请参阅《MySQL 参考手册》中的检查复制状态

如需检查复制状态,请执行以下操作:

控制台

Cloud SQL 会在默认 Cloud SQL 监控信息中心上报告 Replication StateReplication Lag 指标。

如需查看区域内和跨区域副本以及外部服务器副本的其他指标,请创建自定义信息中心并向其添加要监控的指标:

  1. 在 Google Cloud Console 中,转到 Monitoring 页面。

    转至 Resources

  2. 选择信息中心标签页。
  3. 点击创建信息中心
  4. 为信息中心命名,然后点击“确定”。
  5. 点击添加图表
  6. 对于资源类型,请选择 Cloud SQL 数据库
  7. 执行以下任意操作:
    1. 监控复制状态指标:在选择指标字段中,输入 Replication state。然后,添加 state = "Running" 过滤条件。如果复制正在运行,图表会显示 1,否则显示 0。
    2. 监控复制延迟指标,在选择指标字段中,输入 replica_lag。图表会显示副本的状态滞后于其主实例的时长。
    3. 监控副本的 I/O 线程的状态:在选择指标字段中,输入 Slave I/O thread running state。然后,添加 state = "Yes" 过滤条件。如果线程正在运行,则图表会显示 1,否则显示 0。
    4. 监控副本的 SQL 线程的状态:在选择指标字段中,输入 Slave SQL thread running state。然后,添加 state = "Yes" 过滤条件。如果线程正在运行,则图表会显示 1,否则显示 0。

gcloud

对于副本实例,请使用以下命令检查复制状态:

gcloud sql instances describe REPLICA_NAME

在输出中,查找属性 databaseReplicationEnabledmasterInstanceName

对于主实例,请使用以下命令检查是否存在副本:

gcloud sql instances describe PRIMARY_INSTANCE_NAME

在输出中,查找属性 replicaNames

mysql 客户端

  1. 使用 MySQL 客户端连接到副本。

    如需了解详情,请参阅外部应用连接方案

  2. 检查副本的状态:
    SHOW SLAVE STATUS \G

    在此命令的输出中查找以下指标:

    • Master_Host:主实例的名称。
    • Slave_IO_RunningSlave_SQL_Running:I/O 和 SQL 线程是否正在运行。这些线程负责将事件从主数据库传输到副本的中继日志,并从中继日志中执行这些事件。如果线程正在运行,则指标的值为 Yes。两个线程必须同时运行,才能实现复制。
    • Seconds_Behind_Master:副本在处理主数据库的事务时滞后的时间(以秒为单位),即 (1) 当前时间与 (2) 主数据库提交当前正在应用到副本的事务的原始时间戳之差。如果复制中断,则值为 NULL
    • Master_Log_fileRead_Master_Log_PosRelay_Master_Log_FileExec_Master_Log_Pos:这些指标显示 I/O 线程读取事件可达到(Master_Log_fileRead_Master_Log_Pos)的坐标(文件名和偏移),而 SQL 线程执行事件可达到(Relay_Master_Log_FileExec_Master_Log_Pos)。如果它们相同(即 Master_Log_file 等于 Relay_Master_Log_FileRead_Master_Log_Pos 等于 Exec_Master_Log_Pos),则副本已处理完它从主数据库收到的所有事件。

如需详细了解此命令的输出,请参阅有关检查复制状态的 MySQL 文档。

问题排查

问题 问题排查
创建时读取副本未开始复制。 日志文件中可能有更具体的错误信息。在 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 等查询会导致基于行的复制出现复制延迟。

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

复制延迟时间突然激增。 这是因为长时间运行的事务导致。当事务(单语句或多语句)在源实例上提交时,事务的开始时间记录在二进制日志中。当副本收到此 binlog 事件时,会将该时间戳与当前时间戳进行比较,以计算复制延迟时间。因此,来源上的长时间运行的事务将导致副本的复制延迟时间大幅度增加。如果事务中的行更改量很大,则副本还会花费很长时间来执行它。在此期间,复制延迟时间不断增加。一旦副本完成此事务,同步周期将取决于来源上的写入工作负载以及副本的处理速度。

为了避免长时间运行的事务,可以考虑一些可能的解决方案,包括:

  • 将事务拆分为多个小事务
  • 将单个大型写入查询分成较小的批次
  • 尝试将长时间运行的 SELECT 查询与混合 DML 的事务分开
更改并行复制标志会导致错误。 一个或多个这些标志的值设置错误。

在显示错误消息的主实例上,设置并行复制标志:

  1. 修改 binlog_transaction_dependency_trackingtransaction_write_set_extraction 标志:
    • binlog_transaction_dependency_tracking=COMMIT_ORDER
    • transaction_write_set_extraction=OFF
  2. 添加 slave_pending_jobs_size_max 标志:

    slave_pending_jobs_size_max=33554432

  3. 修改 transaction_write_set_extraction 标志:

    transaction_write_set_extraction=XXHASH64

  4. 修改 binlog_transaction_dependency_tracking 标志:

    binlog_transaction_dependency_tracking=WRITESET

副本创建失败并超时。 主实例上长时间运行的未提交事务可能会导致只读副本创建失败。

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

后续步骤