配置外部副本

本页面介绍了如何配置可复制到一个或多个 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 存储桶,然后使用转储文件配置副本

后续步骤