配置外部副本

本页面介绍了如何配置可复制到一个或多个 Cloud SQL 外部副本的 Cloud SQL 实例,以及如何通过外部副本配置将主实例降级以逆转配置。

如需详细了解复制,请参阅 Cloud SQL 中的复制简介

设置外部副本配置

准备工作

在开始此任务之前,您必须有一个 Cloud SQL 实例和一个符合外部副本要求的外部 MySQL 实例。

源实例要求

外部读取副本的源实例必须是主实例或独立实例。您无法将 Cloud SQL 读取副本用作外部读取副本的源实例。有时,读取副本会根据其主实例的磁盘克隆重新创建,并且读取副本无法维护其到外部读取副本的复制状态。

配置主实例

  1. 在 Google Cloud 控制台中前往“Cloud SQL 实例”页面。
  2. 为外部副本的 IP 地址启用对主实例的访问权限。

    如需了解如何启用 IP 访问权限,请参阅为 IP 连接配置访问权限

  3. 记录主实例的公共 IP 地址和公共传出 IP 地址以备后用。您可以在实例的概览页面上找到这些值。
  4. 点击右上角的 Cloud Shell 图标 ()。
  5. 在 Cloud Shell 提示符处,使用内置的 MySQL 客户端连接到您的主实例:
        gcloud sql connect PRIMARY_INSTANCE_NAME \ --user=root        
  6. 输入您的根密码。您随后应该会看到 mysql 提示符。
  7. 创建一个特殊用户以用于实现复制功能并授予复制权限:
    CREATE USER 'REPLICATION_USER'@'%' IDENTIFIED BY 'REPLICATION_USER_PASSWORD'; GRANT REPLICATION SLAVE ON *.* TO 'REPLICATION_USER'@'%';    
  8. 如果要开始使用新数据库,请在主实例和副本实例上创建相同的数据库和表。例如:
    CREATE DATABASE test;  USE test;  CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text); INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');
  9. 如果主实例上已有数据库,您必须在副本上创建该数据库。为此,请将主实例中的数据库导出到一个 Cloud Storage 存储桶,并将其导入副本。详细了解如何将 Cloud SQL 中的数据导出到 Cloud Storage 中的 SQL 转储文件

配置外部副本

警告:此过程会使用主实例中的设置和数据覆盖副本上 MySQL 数据库中托管的任何数据,包括用户和密码。
  1. 在托管副本的机器上,使用您通过主实例创建的导出文件作为新外部 MySQL 实例的种子。

    例如,以下命令会加载名为 mydump.sql 的导出文件:

     mysql --user=root --password < mydump.sql 
  2. 确定此副本-主实例对的服务器 ID。

    服务器 ID 是一个数值(例如“3”),它在外部副本配置中必须是唯一的(每个副本都必须具有唯一的服务器 ID)。

  3. 将以下选项添加到副本的 my.cnf 选项文件中:
     [mysqld] server-id=[SERVER_ID] gtid_mode=ON enforce_gtid_consistency=ON log_slave_updates=ON replicate-ignore-db=mysql binlog-format=ROW log_bin=mysql-bin expire_logs_days=1 read_only=ON 

    如需详细了解 MySQL 复制选项,请参阅复制和二进制日志记录选项

  4. 重启 mysqld 进程以使系统读取配置文件。
  5. 在副本的 mysql 客户端中,输入以下命令:
     CHANGE MASTER TO MASTER_HOST='MASTER_IP_ADDRESS', MASTER_USER='REPLICATION_USER', MASTER_PASSWORD='REPLICATION_PASSWORD', MASTER_AUTO_POSITION=1; 
  6. 在副本上启动复制:
     START SLAVE; 
  7. 确认复制状态:

     SHOW SLAVE STATUS\G; 

    如果您看到“等待主实例发送事件”(Waiting for master to send event),则表示复制正在正常运行。

将外部副本的主实例降级

如果您的 Cloud SQL 实例附带外部副本,您可以逆转配置,但这样做会引发以下更改:

  • 外部副本成为新的主实例。
  • Cloud SQL 实例成为读取副本,从之前是外部副本的服务器(现称为源数据库服务器)进行复制。

要逆转外部副本配置,请执行以下操作:

  1. 创建源表示形式实例

    降级操作完成后,此实例将代表 Cloud SQL 副本的源数据库服务器。

     gcloud auth login ACCESS_TOKEN="$(gcloud auth print-access-token)" curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \      --header 'Content-Type: application/json' \      --data '{          "name": "SOURCE_REPRESENTATION_NAME",          "region": "REGION",          "databaseVersion": "EXTERNAL_SERVER_DATABASE_VERSION",          "onPremisesConfiguration": {              "hostPort": "EXTERNAL_SERVER_IP:EXTERNAL_SERVER_PORT"          }      }' \      -X POST \      https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances 

    使用您希望 Cloud SQL 副本驻留的区域。

  2. 启动降级流程。

    由于此 API 调用要求您提供敏感信息,因此您应该使用 JSON 文件将数据提供给 cURL,而不是在命令行中提供该数据。

    创建数据文件:

     {     "demoteMasterContext": {         "replicaConfiguration": {             "mysqlReplicaConfiguration": {                 "username": "REPLICATION_USERNAME",                 "password": "PASSWORD",                 "caCertificate": "EXTERNAL_SERVER_CA",                 "clientCertificate": "CLIENT_CERT",                 "clientKey": "PRIVATE_KEY"             }         },         "masterInstanceName": "SOURCE_REPRESENTATION_NAME",     }, } 

    然后调用 API。

     curl --header "Authorization: Bearer ${ACCESS_TOKEN}" \      --header 'Content-Type: application/json' \      --data @PATH_TO_DATA_FILE \      https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT-ID/instances/INSTANCE_NAME/demoteMaster 

    如需详细了解 SSL/TLS 选项,请参阅 SSL/TLS 选项。如需详细了解 replicaConfiguration 对象使用的属性,请参阅从外部服务器进行复制

  3. 等待外部副本完成主实例的所有待处理事务。

    当赶上副本的状态时,SHOW SLAVE STATUS 命令中的 Seconds Behind Master 将显示为 0,并且外部副本和 Cloud SQL 主实例将拥有相同的 Executed_Gtid_Set 值。

  4. 使用 mysql 客户端停止外部副本上的复制操作:

     STOP SLAVE RESET SLAVE ALL 
  5. 等待 Cloud SQL 实例从外部服务器(现为源数据库服务器)进行复制。

    在 Cloud SQL 实例上运行 SHOW SLAVE STATUS 命令可获取复制状态。

  6. 当 Cloud SQL 实例成功完成从源数据库服务器执行的复制操作时,将源数据库服务器的 read_only 标志设置为 off,并将应用更新为指向源数据库服务器。

问题排查

问题 问题排查
错误消息:The slave is connecting ... master has purged binary logs containing GTIDs that the slave requires 主 Cloud SQL 实例具有自动备份和二进制日志,并且启用了时间点恢复,因此它应该具有副本可以捕获的足够的日志。但在这种情况下,虽然存在二进制日志,但副本不知道从哪个行开始读取。

使用正确的标志设置创建一个新的转储文件,并使用该文件配置外部副本

  1. 通过 Compute Engine 实例连接到您的 mysql 客户端。
  2. 运行 mysqldump 并使用 --master-data=1--flush-privileges 标志。

    重要提示:请勿添加 --set-gtid-purged=OFF 标志

    了解详情

  3. 确保刚创建的转储文件包含 SET @@GLOBAL.GTID_PURGED='...' 行。
  4. 将转储文件上传到 Cloud Storage 存储桶,然后使用转储文件配置副本

后续步骤