如需详细了解外部副本配置,请参阅关于外部复制。
设置外部副本配置
准备工作
在开始此任务之前,您必须有一个 Cloud SQL 实例和一个符合外部副本要求的外部 MySQL 实例。
配置主实例
- 转到 Google Cloud 控制台中的“Cloud SQL 实例”页面。
- 为外部副本的 IP 地址启用对主实例的访问权限。
如需了解如何启用 IP 访问权限,请参阅为 IP 连接配置访问权限。
- 记录主实例的公共 IP 地址和公共传出 IP 地址以备后用。您可以在实例的概览页面上找到这些值。
- 点击右上角的 Cloud Shell 图标 ()。
- 在 Cloud Shell 提示符处,使用内置的 MySQL 客户端连接到您的主实例:
gcloud sql connect PRIMARY_INSTANCE_NAME \ --user=root
- 输入您的根密码。您随后应该会看到 mysql 提示符。
- 创建一个特殊用户以用于实现复制功能并授予复制权限:
CREATE USER 'REPLICATION_USER'@'%' IDENTIFIED BY 'REPLICATION_USER_PASSWORD'; GRANT REPLICATION SLAVE ON *.* TO 'REPLICATION_USER'@'%';
- 如果要开始使用新数据库,请在主实例和副本实例上创建相同的数据库和表。例如:
CREATE DATABASE test; USE test; CREATE TABLE replica_test (id SERIAL PRIMARY KEY, data text); INSERT INTO replica_test (data) VALUES ('apple'), ('banana'), ('cherry');
- 如果主实例上已有数据库,您必须在副本上创建该数据库。为此,请将主实例中的数据库导出到一个 Cloud Storage 存储桶,并将其导入副本。详细了解如何将 Cloud SQL 中的数据导出到 Cloud Storage 中的 SQL 转储文件。
配置外部副本
警告:此过程会使用主实例中的设置和数据覆盖副本上 MySQL 数据库中托管的任何数据,包括用户和密码。-
在托管副本的机器上,使用您通过主实例创建的导出文件作为新外部 MySQL 实例的种子。
例如,以下命令会加载名为
mydump.sql
的导出文件:mysql --user=root --password < mydump.sql
- 确定此副本-主实例对的服务器 ID。
服务器 ID 是一个数值(例如“3”),它在外部副本配置中必须是唯一的(每个副本都必须具有唯一的服务器 ID)。
- 将以下选项添加到副本的
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 复制选项,请参阅复制和二进制日志记录选项。
- 重启
mysqld
进程以使系统读取配置文件。 - 在副本的
mysql
客户端中,输入以下命令:CHANGE MASTER TO MASTER_HOST='MASTER_IP_ADDRESS', MASTER_USER='REPLICATION_USER', MASTER_PASSWORD='REPLICATION_PASSWORD', MASTER_AUTO_POSITION=1;
- 在副本上启动复制:
START SLAVE;
确认复制状态:
SHOW SLAVE STATUS\G;
如果您看到“等待主实例发送事件”(Waiting for master to send event),则表示复制正在正常运行。
将外部副本的主实例降级
如果您的 Cloud SQL 实例附带外部副本,您可以逆转配置,但这样做会引发以下更改:
- 外部副本成为新的主实例。
- Cloud SQL 实例成为读取副本,从之前是外部副本的服务器(现称为源数据库服务器)进行复制。
要逆转外部副本配置,请执行以下操作:
-
创建源表示形式实例。
降级操作完成后,此实例将代表 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 副本驻留的区域。
启动降级流程。
由于此 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
对象使用的属性,请参阅从外部服务器进行复制。-
等待外部副本完成主实例的所有待处理事务。
当赶上副本的状态时,
SHOW SLAVE STATUS
命令中的Seconds Behind Master
将显示为 0,并且外部副本和 Cloud SQL 主实例将拥有相同的Executed_Gtid_Set
值。 使用
mysql
客户端停止外部副本上的复制操作:STOP SLAVE RESET SLAVE ALL
等待 Cloud SQL 实例从外部服务器(现为源数据库服务器)进行复制。
在 Cloud SQL 实例上运行
SHOW SLAVE STATUS
命令可获取复制状态。- 当 Cloud SQL 实例成功完成从源数据库服务器执行的复制操作时,将源数据库服务器的
read_only
标志设置为off
,并将应用更新为指向源数据库服务器。
问题排查
问题 | 问题排查 |
---|---|
错误消息:The slave is connecting ... master has purged
binary logs containing GTIDs that the slave requires 。 |
主 Cloud SQL 实例具有自动备份和二进制日志,并且启用了时间点恢复,因此它应该具有副本可以捕获的足够的日志。但在这种情况下,虽然存在二进制日志,但副本不知道从哪个行开始读取。 使用正确的标志设置创建一个新的转储文件,并使用该文件配置外部副本
|