配置外部副本

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

如需详细了解外部副本配置,请参阅与配置复制有关的要求和提示

设置外部副本配置

准备工作

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

配置主实例

  1. 转到 Google Cloud Console 中的“Cloud SQL 实例”页面。

    转到“Cloud SQL 实例”页面

  2. 为外部副本的 IP 地址启用对主实例的访问权限。

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

  3. 记录主实例的 IP 地址以备后用。

    您可以在实例的概览页面上找到其 IP 地址。

  4. 点击右上角的 Cloud Shell 图标 (Cloud Shell 图标)。

  5. 在 Cloud Shell 提示符处,使用内置的 mysql 客户端连接到您的主实例:

    gcloud sql connect [MASTER_INSTANCE_NAME] --user=root
    
  6. 输入您的根密码。

    您应该会看到 mysql 提示符。

  7. 创建一个特殊用户以用于实现复制功能:

    CREATE USER '[REPLICATION_USER]'@'%' IDENTIFIED BY '[REPLICATION_PASSWORD]';
    
  8. 向复制用户授予复制权限:

    GRANT REPLICATION SLAVE ON *.* TO '[REPLICATION_USER]'@'%';
    
  9. 将主实例的数据库导出到一个 Cloud Storage 存储分区。

    按照创建 SQL 转储文件中的外部复制说明执行操作。

  10. 在托管副本的计算机的 Cloud Storage 控制台中点击文件,将存储分区中的导出文件下载到副本。

配置外部副本

第二代

  1. 在托管副本的计算机上,使用您通过主实例创建的导出文件作为新外部 MySQL 实例的基础。

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

    mysql --user=root --password <  mysqldump.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),则表示复制正在正常运行。

第一代

  1. 在托管副本的计算机上,使用您通过主实例创建的导出文件作为新外部 MySQL 实例的基础。

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

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

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

  3. my.cnf 选项文件中添加类似以下示例的代码行,以设置读取副本的服务器 ID:

    [mysqld]
    server-id=[SERVER_ID]
    

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

  4. 重新启动 mysqld 进程以使系统读取配置文件。
  5. 打开导出文件并找到 CHANGE MASTER TO MASTER_LOG_FILE 命令。
  6. 将该代码行复制并粘贴到 mysql 客户端,注意要删掉开头的短划线(“--”)。

    不要按 Enter 键。

  7. 在结尾处的分号之前,插入 MASTER_HOSTMASTER_USERMASTER_PASSWORD 的值。

    您的语句应类似于如下示例:

    CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107,
    MASTER_HOST='[MASTER_IP_ADDRESS]', MASTER_USER='[REPLICATION_USER]', MASTER_PASSWORD='[REPLICATION_PASSWORD]';
    
  8. Enter 键执行语句。
  9. 在副本上启动复制:

    START SLAVE;
    
  10. 确认复制状态:

    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_MYSQL_VERSION]",
             "onPremisesConfiguration": {
                 "hostPort": "[EXTERNAL_SERVER_IP]:[EXTERNAL_SERVER_PORT]"
             }
         }' \
         -X POST \
         https://www.googleapis.com/sql/v1beta4/projects/[PROJECT-ID]/instances
    

    使用您希望 Cloud SQL 副本所在的区域。

  2. 启动降级流程。

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

    创建数据文件:

    {
        "demoteMasterContext": {
            "replicaConfiguration": {
                "mysqlReplicaConfiguration": {
                    "username": "[MYSQL_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://www.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,并将应用更新为指向源数据库服务器。

后续步骤