

# 将现有数据库实例转换为主动-主动集群
<a name="mysql-active-active-clusters-converting"></a>

要迁移到主动-主动集群的数据库实例的数据库引擎版本必须为以下版本之一：
+ 所有 MySQL 8.4 版本
+ MySQL 8.0.35 及更高的次要版本

如果您需要升级引擎版本，请参阅[升级 RDS for MySQL 数据库引擎](USER_UpgradeDBInstance.MySQL.md)。

如果您要在多个 VPC 中设置具有数据库实例的主动-主动集群，请务必完成[跨 VPC 主动-主动集群的准备工作](mysql-active-active-clusters-cross-vpc-prerequisites.md)中的先决条件。

完成以下步骤，以将现有数据库实例迁移到 RDS for MySQL 的主动-主动集群。

**Topics**
+ [步骤 1：在一个或多个自定义参数组中设置主动-主动集群参数](#mysql-active-active-clusters-converting-parameter-group)
+ [步骤 2：将数据库实例与设置了所需组复制参数的数据库参数组相关联](#mysql-active-active-clusters-converting-associate-parameter-group)
+ [步骤 3：创建主动-主动集群](#mysql-active-active-clusters-converting-associate-parameter-groups)
+ [步骤 4：为主动-主动集群创建其它 RDS for MySQL 数据库实例](#mysql-active-active-clusters-converting-add-db-instances)
+ [步骤 5：在要转换的数据库实例上初始化组](#mysql-active-active-clusters-converting-start-replication-first)
+ [步骤 6：在主动-主动集群中的其它数据库实例上开始复制](#mysql-active-active-clusters-converting-start-replication-other)
+ [步骤 7：（建议）检查主动-主动集群的状态](#mysql-active-active-clusters-converting-view)

## 步骤 1：在一个或多个自定义参数组中设置主动-主动集群参数
<a name="mysql-active-active-clusters-converting-parameter-group"></a>

主动-主动集群中的 RDS for MySQL 数据库实例必须与一个自定义参数组相关联，该参数组对于所需参数具有正确的设置。有关参数和每个参数所需设置的信息，请参阅[主动-主动集群所需的参数设置](mysql-active-active-clusters-parameters.md)。

您可以在新的参数组或现有参数组中设置这些参数。但是，为避免意外影响不属于主动-主动集群的数据库实例，我们强烈建议您创建一个新的自定义参数组。主动-主动集群中的数据库实例可以与相同的数据库参数组或不同的数据库参数组相关联。

您可以使用 AWS 管理控制台或 AWS CLI 创建新的自定义参数组。有关更多信息，请参阅 [在 Amazon RDS 中创建数据库参数组](USER_WorkingWithParamGroups.Creating.md)。以下示例运行 [create-db-parameter-group](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-parameter-group.html) AWS CLI 命令来为 RDS for MySQL 8.0 创建名为 `myactivepg` 的自定义数据库参数组：

对于 Linux、macOS 或 Unix：

```
aws rds create-db-parameter-group \
  --db-parameter-group-name myactivepg \
  --db-parameter-group-family mysql8.0 \
  --description "Parameter group for active-active clusters"
```

对于：Windows

```
aws rds create-db-parameter-group ^
  --db-parameter-group-name myactivepg ^
  --db-parameter-group-family mysql8.0 ^
  --description "Parameter group for active-active clusters"
```

还可以使用 AWS 管理控制台或 AWS CLI 设置自定义参数组中的参数。有关更多信息，请参阅 [在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

以下示例运行 [modify-db-parameter-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html) AWS CLI 命令来为 RDS for MySQL 8.0 设置参数。要将此示例与 RDS for MySQL 8.4 结合使用，请将 `slave_preserve_commit_order` 更改为 `replica_preserve_commit_order`。

对于 Linux、macOS 或 Unix：

```
aws rds modify-db-parameter-group \
  --db-parameter-group-name myactivepg \
  --parameters "ParameterName='rds.group_replication_enabled',ParameterValue='1',ApplyMethod=pending-reboot" \
               "ParameterName='rds.custom_dns_resolution',ParameterValue='1',ApplyMethod=pending-reboot" \
               "ParameterName='enforce_gtid_consistency',ParameterValue='ON',ApplyMethod=pending-reboot" \
               "ParameterName='gtid-mode',ParameterValue='ON',ApplyMethod=pending-reboot" \
               "ParameterName='binlog_format',ParameterValue='ROW',ApplyMethod=immediate" \
               "ParameterName='slave_preserve_commit_order',ParameterValue='ON',ApplyMethod=immediate" \
               "ParameterName='group_replication_group_name',ParameterValue='11111111-2222-3333-4444-555555555555',ApplyMethod=pending-reboot"
```

对于：Windows

```
aws rds modify-db-parameter-group ^
  --db-parameter-group-name myactivepg ^
  --parameters "ParameterName='rds.group_replication_enabled',ParameterValue='1',ApplyMethod=pending-reboot" ^
               "ParameterName='rds.custom_dns_resolution',ParameterValue='1',ApplyMethod=pending-reboot" ^
               "ParameterName='enforce_gtid_consistency',ParameterValue='ON',ApplyMethod=pending-reboot" ^
               "ParameterName='gtid-mode',ParameterValue='ON',ApplyMethod=pending-reboot" ^
               "ParameterName='binlog_format',ParameterValue='ROW',ApplyMethod=immediate" ^
               "ParameterName='slave_preserve_commit_order',ParameterValue='ON',ApplyMethod=immediate" ^
               "ParameterName='group_replication_group_name',ParameterValue='11111111-2222-3333-4444-555555555555',ApplyMethod=pending-reboot"
```

## 步骤 2：将数据库实例与设置了所需组复制参数的数据库参数组相关联
<a name="mysql-active-active-clusters-converting-associate-parameter-group"></a>

将数据库实例与您在上一步中创建或修改的参数组相关联。有关说明，请参阅[在 Amazon RDS 中将数据库参数组与数据库实例关联](USER_WorkingWithParamGroups.Associating.md)。

重启数据库实例以使新的参数设置生效。有关说明，请参阅[重启数据库实例](USER_RebootInstance.md)。

## 步骤 3：创建主动-主动集群
<a name="mysql-active-active-clusters-converting-associate-parameter-groups"></a>

在与数据库实例关联的数据库参数组中，将 `group_replication_group_seeds` 参数设置为要转换的数据库实例的端点。

可以使用 AWS 管理控制台或 AWS CLI 来设置参数。设置此参数后，您无需重启数据库实例。有关设置参数的更多信息，请参阅 [在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

以下示例运行 [modify-db-parameter-group](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html) AWS CLI 命令来设置参数：

对于 Linux、macOS 或 Unix：

```
aws rds modify-db-parameter-group \
  --db-parameter-group-name myactivepg \
  --parameters "ParameterName='group_replication_group_seeds',ParameterValue='myactivedb1.123456789012.us-east-1.rds.amazonaws.com:3306',ApplyMethod=immediate"
```

对于：Windows

```
aws rds modify-db-parameter-group ^
  --db-parameter-group-name myactivepg ^
  --parameters "ParameterName='group_replication_group_seeds',ParameterValue='myactivedb1.123456789012.us-east-1.rds.amazonaws.com:3306',ApplyMethod=immediate"
```

## 步骤 4：为主动-主动集群创建其它 RDS for MySQL 数据库实例
<a name="mysql-active-active-clusters-converting-add-db-instances"></a>

要为主动-主动集群创建其它数据库实例，请对要转换的数据库实例执行时间点恢复。有关说明，请参阅[使用时间点恢复将数据库实例添加到主动-主动集群](mysql-active-active-clusters-adding.md#mysql-active-active-clusters-adding-pitr)。

一个主动-主动集群最多可以有九个数据库实例。在数据库实例上执行时间点恢复，直到集群拥有所需的数据库实例数量。执行恢复点恢复时，请确保将您要添加的数据库实例与将 `rds.group_replication_enabled` 设置为 `1` 的数据库参数组相关联。否则，组复制将无法在新添加的数据库实例上启动。

## 步骤 5：在要转换的数据库实例上初始化组
<a name="mysql-active-active-clusters-converting-start-replication-first"></a>

初始化组并开始复制：

1. 在 SQL 客户端中连接到您要转换的该数据库实例。有关连接到 RDS for MySQL 数据库实例的更多信息，请参阅[连接到 MySQL 数据库实例](USER_ConnectToInstance.md)。

1. 在 SQL 客户端中，运行以下存储过程并将 *group\$1replication\$1user\$1password* 替换为 `rdsgrprepladmin` 用户的密码。在主动-主动集群中，`rdsgrprepladmin` 用户保留用于组复制连接。在主动-主动集群中的所有数据库实例上，该用户的密码必须相同。

   ```
   call mysql.rds_set_configuration('binlog retention hours', 168); -- 7 days binlog
   call mysql.rds_group_replication_create_user('group_replication_user_password');
   call mysql.rds_group_replication_set_recovery_channel('group_replication_user_password');
   call mysql.rds_group_replication_start(1);
   ```

   此示例将 `binlog retention hours` 值设置为 `168`，这意味着二进制日志文件在数据库实例上保留七天。您可以根据要求调整该值。

   此示例在 `mysql.rds_group_replication_start` 存储过程中指定 `1`，以使用当前数据库实例初始化新组。

   有关此示例中调用的存储过程的更多信息，请参阅[管理主动-主动集群](mysql-stored-proc-active-active-clusters.md)。

## 步骤 6：在主动-主动集群中的其它数据库实例上开始复制
<a name="mysql-active-active-clusters-converting-start-replication-other"></a>

对于主动-主动集群中的每个数据库实例，使用 SQL 客户端连接到该实例，然后运行以下存储过程。将 *group\$1replication\$1user\$1password* 替换为 `rdsgrprepladmin` 用户的密码。

```
call mysql.rds_set_configuration('binlog retention hours', 168); -- 7 days binlog
call mysql.rds_group_replication_create_user('group_replication_user_password');
call mysql.rds_group_replication_set_recovery_channel('group_replication_user_password');
call mysql.rds_group_replication_start(0);
```

此示例将 `binlog retention hours` 值设置为 `168`，这意味着二进制日志文件在每个数据库实例上保留七天。您可以根据要求调整该值。

此示例在 `mysql.rds_group_replication_start` 存储过程中指定 `0`，以将当前数据库实例加入现有组。

**提示**  
确保在主动-主动集群中的所有其它数据库实例上运行这些存储过程。

## 步骤 7：（建议）检查主动-主动集群的状态
<a name="mysql-active-active-clusters-converting-view"></a>

要确保集群的每个成员都配置正确，请通过连接到主动-主动集群中的数据库实例并运行以下 SQL 命令来检查集群的状态：

```
SELECT * FROM performance_schema.replication_group_members;
```

输出应针对每个数据库实例的 `MEMBER_STATE` 显示 `ONLINE`，如以下示例输出所示：

```
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST    | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 9854d4a2-5d7f-11ee-b8ec-0ec88c43c251 | ip-10-15-3-137 |        3306 | ONLINE       | PRIMARY     | 8.0.35         | MySQL                      |
| group_replication_applier | 9e2e9c28-5d7f-11ee-8039-0e5d58f05fef | ip-10-15-3-225 |        3306 | ONLINE       | PRIMARY     | 8.0.35         | MySQL                      |
| group_replication_applier | a6ba332d-5d7f-11ee-a025-0a5c6971197d | ip-10-15-1-83  |        3306 | ONLINE       | PRIMARY     | 8.0.35         | MySQL                      |
+---------------------------+--------------------------------------+----------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)
```

有关可能的 `MEMBER_STATE` 值的信息，请参阅 MySQL 文档中的 [Group Replication Server States](https://dev.mysql.com/doc/refman/8.0/en/group-replication-server-states.html)。