配置外部副本

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

如需详细了解外部副本配置,请参阅关于外部复制

设置外部副本配置

准备工作

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

配置主实例

  1. 转到 Google Cloud Console 中的“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 存储桶,然后使用转储文件配置副本

后续步骤