为 RDS for MySQL 配置主动-主动集群 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

为 RDS for MySQL 配置主动-主动集群

您可以使用 MySQL 组复制插件为 RDS for MySQL 设置主动-主动集群。运行版本 8.0.35 及更高次要版本的 RDS for MySQL 数据库实例支持组复制插件。

有关 MySQL 组复制的信息,请参阅 MySQL 文档中的 Group Replication。MySQL 文档包含有关此功能的详细信息,而本主题则介绍如何在 RDS for MySQL 数据库实例上配置和管理插件。

注意

为简洁起见,本主题中所有提及的“主动-主动”集群均指使用 MySQL 组复制插件的主动-主动集群。

主动-主动集群的用例

以下情况很适合使用主动-主动集群:

  • 需要集群中所有数据库实例才能支持写入操作的应用程序。组复制插件可使主动-主动集群中每个数据库实例的数据保持一致。有关这一点的工作原理的更多信息,请参阅 MySQL 文档中的 Group Replication

  • 需要数据库持续可用性的应用程序。对于主动-主动集群,数据将保留在集群中的所有数据库实例上。如果一个数据库实例出现故障,应用程序可以将流量重新路由到集群中的另一个数据库实例。

  • 出于负载均衡的目的,可能需要在集群中的不同数据库实例之间拆分读取和写入操作的应用程序。使用主动-主动集群,您的应用程序可以将读取流量发送到特定的数据库实例,而将写入流量发送到其它数据库实例。您也可以随时切换要向哪些数据库实例发送读取或写入。

主动-主动集群的注意事项和最佳实践

在使用 RDS for MySQL 主动-主动集群之前,请查看以下注意事项和最佳实践:

  • 主动-主动集群的数据库实例不能超过 9 个。

  • 使用组复制插件,您可以控制主动-主动集群的事务一致性保证。有关更多信息,请参阅 MySQL 文档中的 Transaction Consistency Guarantees

  • 当不同的数据库实例更新主动-主动集群中的同一行时,可能会发生冲突。有关冲突和冲突解决的信息,请参阅 MySQL 文档中的 Group Replication

  • 为了实现容错,请在您的主动-主动集群中至少包含三个数据库实例。可以配置只具有一个或两个数据库实例的主动-主动集群,但该集群不具备容错能力。有关容错的信息,请参阅 MySQL 文档中的 Fault-tolerance

  • 当数据库实例加入现有的主动-主动集群并且运行的引擎版本与集群中的最低引擎版本相同时,该数据库实例将以读写模式加入。

  • 当数据库实例加入现有的主动-主动集群并且运行的引擎版本高于集群中的最低引擎版本时,该数据库实例必须保持只读模式。

  • 如果您通过在数据库参数组中将数据库实例的 rds.group_replication_enabled 参数设置为 1 来为它启用组复制,但复制尚未启动或未能启动,则该数据库实例将置于超级只读模式以防止数据不一致。有关超级只读模式的信息,请参阅 MySQL 文档

  • 您可以升级主动-主动集群中的数据库实例,但在主动-主动集群中的所有其它数据库实例都升级到相同的引擎版本或更高的引擎版本之前,该数据库实例是只读的。升级数据库实例时,升级完成后,数据库实例会自动加入同一个主动-主动集群。为避免数据库实例意外切换到只读模式,请对其禁用自动次要版本升级。有关升级 MySQL 数据库实例的信息,请参阅升级 MySQL 数据库引擎

  • 您可以将多可用区数据库实例部署中的数据库实例添加到现有的主动-主动集群中。您还可以将主动-主动集群中的单可用区数据库实例转换为多可用区数据库实例部署。如果多可用区部署中的主数据库实例出现故障,则该主实例会失效转移到备用实例。失效转移完成后,新的主数据库实例会自动加入同一个集群。有关多可用区数据库实例部署的更多信息,请参阅多可用区数据库实例部署

  • 我们建议主动-主动集群中的数据库实例为其维护时段使用不同的时间范围。这种做法可以避免集群中的多个数据库实例同时脱机来进行维护。有关更多信息,请参阅Amazon RDS 维护时段

  • 主动-主动集群可以使用 SSL 在数据库实例之间建立连接。要配置 SSL 连接,请设置 group_replication_recovery_use_sslgroup_replication_ssl_mode 参数。对于主动-主动集群中的所有数据库实例,这些参数的值必须匹配。

    目前,主动-主动集群不支持对 Amazon Web Services 区域之间的连接进行证书颁发机构(CA)验证。因此,对于跨区域集群,必须将 group_replication_ssl_mode 参数设置为 DISABLED(默认)或 REQUIRED

  • RDS for MySQL 主动-主动集群在多主模式下运行。group_replication_enforce_update_everywhere_checks 的默认值为 ON,参数是静态的。当此参数设置为 ON 时,应用程序无法插入到具有级联外键约束的表中。

  • RDS for MySQL 主动-主动集群使用 MySQL 通信堆栈来保护连接安全,而不是 XCOM。有关更多信息,请参阅 MySQL 文档中的 Communication Stack for Connection Security Management

  • 当数据库参数组与主动-主动集群中的数据库实例关联时,我们建议仅将此数据库参数组与集群中的其它数据库实例相关联。

  • 主动-主动集群仅支持 RDS for MySQL 数据库实例。这些数据库实例必须运行受支持的数据库引擎版本。

  • 当主动-主动集群中的数据库实例出现意外故障时,RDS 会自动开始恢复该数据库实例。如果数据库实例无法恢复,我们建议将其替换为新的数据库实例,方法是使用集群中运行状况良好的数据库实例执行时间点恢复。有关说明,请参阅 使用时间点恢复将数据库实例添加到主动-主动集群

  • 您可以删除主动-主动集群中的数据库实例,而不会影响集群中的其它数据库实例。有关删除数据库实例的信息,请参阅删除数据库实例

跨 VPC 主动-主动集群的先决条件

您可以在多个 VPC 中配置包含数据库实例的主动-主动集群。VPC 可以位于相同的 Amazon Web Services 区域或不同的 Amazon Web Services 区域中。

注意

在多个 Amazon Web Services 区域之间发送流量可能会产生额外费用。有关更多信息,请参阅常见架构的数据传输成本概览

如果您要在单个 VPC 中配置主动-主动集群,可以跳过这些步骤并转入使用新的数据库实例设置主动-主动集群

为在多个 VPC 中具有数据库实例的主动-主动集群做准备
  1. 确保 CIDR 块中的 IPv4 地址范围满足以下要求:

    • VPC 的 CIDR 块中的 IPv4 地址范围不能重叠。

    • CIDR 块中的所有 IPv4 地址范围必须小于 128.0.0.0/subnet_mask 或高于 128.0.0.0/subnet_mask

    以下范围说明了这些要求:

    • 支持在一个 VPC 中使用 10.1.0.0/16,而在另一个 VPC 中使用 10.2.0.0/16

    • 支持在一个 VPC 中使用 172.1.0.0/16,而在另一个 VPC 中使用 172.2.0.0/16

    • 支持在一个 VPC 中使用 10.1.0.0/16,而在另一个 VPC 中使用 10.1.0.0/16,因为范围重叠。

    • 支持在一个 VPC 中使用 10.1.0.0/16,而在另一个 VPC 中使用 172.1.0.0/16,因为一个低于 128.0.0.0/subnet_mask,另一个高于 128.0.0.0/subnet_mask

    有关 CIDR 块的信息,请参阅《Amazon VPC 用户指南》中的 VPC CIDR 块

  2. 在每个 VPC 中,请确保 DNS 解析和 DNS 主机名都已启用。

    有关说明,请参阅《Amazon VPC 用户指南》中的查看和更新 VPC 的 DNS 属性

  3. 配置 VPC,以便您可以通过以下方式之一在它们之间路由流量:

    • 在 VPC 之间创建 VPC 对等连接。

      有关说明,请参阅《Amazon VPC Peering Guide》中的 Create a VPC peering connection。在每个 VPC 中,确保您的安全组都有引用对等 VPC 中的安全组的入站规则。此操作将允许流量流入和流出与对等的 VPC 中的已引用安全组关联的实例。有关说明,请参阅《Amazon VPC 对等连接指南》中的更新安全组以引用对等安全组

    • 在 VPC 之间创建一个中转网关。

      有关说明,请参阅《Amazon VPC Transit Gateway》中的开始使用中转网关。在每个 VPC 中,确保您的安全组都有允许来自其它 VPC 的流量的入站规则,例如指定另一个 VPC 的 CIDR 的入站规则。此操作允许流量流入和流出与主动-主动集群中的已引用安全组关联的实例。有关更多信息,请参阅《Amazon VPC 用户指南》中的使用安全组控制到 Amazon 资源的流量

主动-主动集群所需的参数设置

在设置 RDS for MySQL 主动-主动集群时,需要以下参数设置。

参数 描述 所需的设置

binlog_format

设置二进制日志记录格式。RDS for MySQL 的默认值为 MIXED。有关更多信息,请参阅 MySQL 文档

ROW

enforce_gtid_consistency

强制语句执行的 GTID 一致性。RDS for MySQL 的默认值为 OFF。有关更多信息,请参阅 MySQL 文档

ON

group_replication_group_name

将组复制名称设置为 UUID。UUID 格式为 11111111-2222-3333-4444-555555555555。您可以通过连接到 MySQL 数据库实例并运行 SELECT UUID() 生成 MySQL UUID。对于主动-主动集群中的所有数据库实例,该值必须相同。有关更多信息,请参阅 MySQL 文档

MySQL UUID

gtid-mode

控制基于 GTID 的日志记录。RDS for MySQL 的默认值为 OFF_PERMISSIVE。有关更多信息,请参阅 MySQL 文档

ON

rds.custom_dns_resolution

指定是否允许从 VPC 中的 Amazon DNS 服务器进行 DNS 解析。当使用 rds.group_replication_enabled 参数启用组复制时,必须启用 DNS 解析。如果使用 rds.group_replication_enabled 参数禁用组复制,则无法启用 DNS 解析。有关更多信息,请参阅《Amazon VPC 用户指南》中的 Amazon DNS 服务器

1

rds.group_replication_enabled

指定是否为数据库实例启用组复制。必须在主动-主动集群中的数据库实例上启用组复制。

1

slave_preserve_commit_order

控制在副本上提交事务的顺序。RDS for MySQL 的默认值为 ON。有关更多信息,请参阅 MySQL 文档

ON

将现有数据库实例转换为主动-主动集群

要迁移到主动-主动集群的数据库实例的数据库引擎版本必须为 MySQL 8.0.35 或更高版本。如果您需要升级引擎版本,请参阅升级 MySQL 数据库引擎

如果您要在多个 VPC 中设置具有数据库实例的主动-主动集群,请务必完成跨 VPC 主动-主动集群的先决条件中的先决条件。

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

步骤 1:在一个或多个自定义参数组中设置主动-主动集群参数

主动-主动集群中的 RDS for MySQL 数据库实例必须与一个自定义参数组相关联,该参数组对于所需参数具有正确的设置。有关参数和每个参数所需设置的信息,请参阅主动-主动集群所需的参数设置

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

您可以使用 Amazon Web Services Management Console或 Amazon CLI 创建新的自定义参数组。有关更多信息,请参阅创建数据库参数组。以下示例运行 create-db-parameter-group Amazon CLI 命令以创建名为 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"

还可以使用 Amazon Web Services Management Console或 Amazon CLI 设置自定义参数组中的参数。有关更多信息,请参阅修改数据库参数组中的参数

以下示例运行 modify-db-parameter-group Amazon CLI 命令来设置参数:

对于 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:将数据库实例与设置了所需组复制参数的数据库参数组相关联

将数据库实例与您在上一步中创建或修改的参数组相关联。有关说明,请参阅 将数据库参数组与数据库实例关联

重启数据库实例以使新的参数设置生效。有关说明,请参阅 重启中的数据库实例

步骤 3:创建主动-主动集群

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

可以使用 Amazon Web Services Management Console或 Amazon CLI 来设置参数。设置此参数后,您无需重启数据库实例。有关设置参数的更多信息,请参阅 修改数据库参数组中的参数

以下示例运行 modify-db-parameter-group Amazon 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 数据库实例

要为主动-主动集群创建其它数据库实例,请对要转换的数据库实例执行时间点恢复。有关说明,请参阅 使用时间点恢复将数据库实例添加到主动-主动集群

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

步骤 5:在要转换的数据库实例上初始化组

初始化组并开始复制:

  1. 在 SQL 客户端中连接到您要转换的该数据库实例。有关连接到 RDS for MySQL 数据库实例的更多信息,请参阅连接到运行 MySQL 数据库引擎的数据库实例

  2. 在 SQL 客户端中,运行以下存储过程并将 group_replication_user_password 替换为 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,以使用当前数据库实例初始化新组。

    有关此示例中调用的存储过程的更多信息,请参阅管理主动-主动集群

步骤 6:在主动-主动集群中的其它数据库实例上开始复制

对于主动-主动集群中的每个数据库实例,使用 SQL 客户端连接到该实例,然后运行以下存储过程。将 group_replication_user_password 替换为 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:(建议)检查主动-主动集群的状态

要确保集群的每个成员都配置正确,请通过连接到主动-主动集群中的数据库实例并运行以下 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

使用新的数据库实例设置主动-主动集群

完成以下步骤,使用新的 RDS for MySQL 数据库实例设置主动-主动集群。

如果您要在多个 VPC 中设置具有数据库实例的主动-主动集群,请务必完成跨 VPC 主动-主动集群的先决条件中的先决条件。

步骤 1:在一个或多个自定义参数组中设置主动-主动集群参数

主动-主动集群中的 RDS for MySQL 数据库实例必须与一个自定义参数组相关联,该参数组对于所需参数具有正确的设置。有关参数和每个参数所需设置的信息,请参阅主动-主动集群所需的参数设置

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

您可以使用 Amazon Web Services Management Console或 Amazon CLI 创建新的自定义参数组。有关更多信息,请参阅创建数据库参数组。以下示例运行 create-db-parameter-group Amazon CLI 命令以创建名为 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"

还可以使用 Amazon Web Services Management Console或 Amazon CLI 设置自定义参数组中的参数。有关更多信息,请参阅修改数据库参数组中的参数

以下示例运行 modify-db-parameter-group Amazon CLI 命令来设置参数:

对于 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:为主动-主动集群创建新的 RDS for MySQL 数据库实例

版本 8.0.35 及更高版本的 RDS for MySQL 数据库实例支持主动-主动集群。您可为集群创建最多九个新的数据库实例。

您可以使用 Amazon Web Services Management Console或 Amazon CLI 来创建新的数据库实例。有关创建数据库实例的更多信息,请参阅 创建 Amazon RDS 数据库实例。创建数据库实例时,将其与您在上一步中创建或修改的数据库参数组相关联。

步骤 4:指定主动-主动集群中的数据库实例

在与每个数据库实例关联的数据库参数组中,将 group_replication_group_seeds 参数设置为要包含在集群中的数据库实例的端点。

可以使用 Amazon Web Services Management Console或 Amazon CLI 来设置参数。设置此参数后,您无需重启数据库实例。有关设置参数的更多信息,请参阅 修改数据库参数组中的参数

以下示例运行 modify-db-parameter-group Amazon 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,myactivedb2.123456789012.us-east-1.rds.amazonaws.com:3306,myactivedb3.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,myactivedb2.123456789012.us-east-1.rds.amazonaws.com:3306,myactivedb3.123456789012.us-east-1.rds.amazonaws.com:3306',ApplyMethod=immediate"
提示

确保在每个与主动-主动集群中的数据库实例关联的数据库参数组中设置 group_replication_group_seeds 参数。

步骤 5:在数据库实例上初始化组并开始复制

您可以选择任何新数据库来初始化组并开始复制。为此,请完成以下步骤:

  1. 在主动-主动集群中选择一个数据库实例,然后在 SQL 客户端中连接到该数据库实例。有关连接到 RDS for MySQL 数据库实例的更多信息,请参阅连接到运行 MySQL 数据库引擎的数据库实例

  2. 在 SQL 客户端中,运行以下存储过程并将 group_replication_user_password 替换为 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,以使用当前数据库实例初始化新组。

    有关此示例中调用的存储过程的更多信息,请参阅管理主动-主动集群

步骤 6:在主动-主动集群中的其它数据库实例上开始复制

对于主动-主动集群中的每个数据库实例,使用 SQL 客户端连接到该实例,然后运行以下存储过程。将 group_replication_user_password 替换为 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:(建议)检查主动-主动集群的状态

要确保集群的每个成员都配置正确,请通过连接到主动-主动集群中的数据库实例并运行以下 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

步骤 8:(可选)将数据导入到主动-主动集群中的数据库实例

您可以将数据从 MySQL 数据库导入到主动-主动集群中的数据库实例。导入数据后,组复制会将其复制到集群中的其它数据库实例。

有关导入用户的信息,请参阅将数据导入到停机时间更少的 Amazon RDS MariaDB 或 MySQL 实例

将数据库实例添加到主动-主动集群

您可以通过还原数据库快照或将数据库实例还原到某个时间点,将数据库实例添加到主动-主动集群。一个主动-主动集群最多可以包含九个数据库实例。

将数据库实例恢复到某个时间点时,它通常包含比从数据库快照还原的数据库实例较新的事务。当数据库实例具有较新的事务时,启动复制时需要应用的事务会较少。因此,使用时间点恢复将数据库实例添加到集群通常比从数据库快照还原更快。

使用时间点恢复将数据库实例添加到主动-主动集群

您可以通过对集群中的数据库实例执行时间点恢复,将数据库实例添加到主动-主动集群中。

有关在不同的 Amazon Web Services 区域将数据库实例恢复到某个时间点的信息,请参阅将自动备份复制到其他 Amazon Web Services 区域

使用时间点恢复将数据库实例添加到主动-主动集群
  1. 通过对主动-主动集群中的数据库实例执行时间点恢复,创建新的数据库实例。

    您可以对集群中的任何数据库实例执行时间点恢复以创建新的数据库实例。有关说明,请参阅 将数据库实例还原到指定时间

    重要

    在时间点恢复期间,将新的数据库实例与设置了主动-主动集群参数的数据库参数组相关联。否则,组复制将无法在新的数据库实例上启动。有关参数和每个参数所需设置的信息,请参阅主动-主动集群所需的参数设置

    提示

    如果您在开始时间点恢复之前拍摄数据库实例的快照,则可以减少在新数据库实例上应用事务所需的时间量。

  2. 将数据库实例添加到与主动-主动集群中的一个数据库实例相关联的每个数据库参数组中的 group_replication_group_seeds 参数,包括与新数据库实例关联的数据库参数组。

    有关设置参数的更多信息,请参阅 修改数据库参数组中的参数

  3. 在 SQL 客户端中,连接到新的数据库实例,然后调用 mysql.rds_group_replication_set_recovery_channel 存储过程。将 group_replication_user_password 替换为 rdsgrprepladmin 用户的密码。

    call mysql.rds_group_replication_set_recovery_channel('group_replication_user_password');
  4. 使用 SQL 客户端,调用 mysql.rds_group_replication_start 存储过程以开始复制:

    call mysql.rds_group_replication_start(0);

使用数据库快照将数据库实例添加到主动-主动集群

通过在集群中创建数据库实例的数据库快照,然后还原数据库快照,可以将数据库实例添加到主动-主动集群。

有关将快照复制到不同 Amazon Web Services 区域的信息,请参阅跨区域快照复制

使用数据库快照将数据库实例添加到主动-主动集群
  1. 创建主动-主动集群中数据库实例的数据库快照。

    您可以创建集群中任何数据库实例的数据库快照。有关说明,请参阅 为单可用区数据库实例创建数据库快照

  2. 从数据库快照还原数据库实例。

    在快照还原操作期间,将新的数据库实例与设置了主动-主动集群参数的数据库参数组相关联。有关参数和每个参数所需设置的信息,请参阅主动-主动集群所需的参数设置

    有关从数据库快照还原数据库实例的信息,请参阅从数据库快照还原

  3. 将数据库实例添加到与主动-主动集群中的一个数据库实例相关联的每个数据库参数组中的 group_replication_group_seeds 参数,包括与新数据库实例关联的数据库参数组。

    有关设置参数的更多信息,请参阅 修改数据库参数组中的参数

  4. 在 SQL 客户端中,连接到新的数据库实例,然后调用 mysql.rds_group_replication_set_recovery_channel 存储过程。将 group_replication_user_password 替换为 rdsgrprepladmin 用户的密码。

    call mysql.rds_group_replication_set_recovery_channel('group_replication_user_password');
  5. 使用 SQL 客户端,调用 mysql.rds_group_replication_start 存储过程以开始复制:

    call mysql.rds_group_replication_start(0);

监控主动-主动集群

您可以通过连接到集群中的数据库实例并运行以下 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

在主动-主动集群中的数据库实例上停止组复制

您可以在主动-主动集群中的数据库实例上停止组复制。停止组复制后,数据库实例将处于超级只读模式,直到重启复制或从主动-主动集群中移除该数据库实例。有关超级只读模式的信息,请参阅 MySQL 文档

暂时停止主动-主动集群的组复制
  1. 使用 SQL 客户端连接到主动-主动集群中的数据库实例。

    有关连接到 RDS for MySQL 数据库实例的更多信息,请参阅连接到运行 MySQL 数据库引擎的数据库实例

  2. 在 SQL 客户端中,调用 mysql.rds_group_replication_stop 存储过程:

    call mysql.rds_group_replication_stop();

重命名主动-主动集群中的数据库实例

您可以更改主动-主动集群中数据库实例的名称。要重命名主动-主动集群中的多个数据库实例,请一次重命名一个数据库实例。因此,先重命名一个数据库实例并将其重新加入集群,然后重命名下一个数据库实例。

重命名主动-主动集群中的数据库实例
  1. 在 SQL 客户端中连接到数据库实例,然后调用 mysql.rds_group_replication_stop 存储过程:

    call mysql.rds_group_replication_stop();
  2. 按照重命名数据库实例中的说明重命名数据库实例。

  3. 在每个与主动-主动集群中的数据库实例关联的数据库参数组中修改 group_replication_group_seeds 参数。

    在参数设置中,将旧的数据库实例端点替换为新的数据库实例端点。有关设置参数的更多信息,请参阅 修改数据库参数组中的参数

  4. 在 SQL 客户端中连接到数据库实例,然后调用 mysql.rds_group_replication_start 存储过程:

    call mysql.rds_group_replication_start(0);

从主动-主动集群中移除数据库实例

当您从主动-主动集群中移除数据库实例时,它会恢复为独立的数据库实例。

从主动-主动集群中移除数据库实例
  1. 在 SQL 客户端中连接到数据库实例,然后调用 mysql.rds_group_replication_stop 存储过程:

    call mysql.rds_group_replication_stop();
  2. 修改将保留在主动-主动集群中的数据库实例的 group_replication_group_seeds 参数。

    group_replication_group_seeds 参数中,删除要从主动-主动集群中移除的数据库实例。有关设置参数的更多信息,请参阅 修改数据库参数组中的参数

  3. 修改要从主动-主动集群中移除的数据库实例的参数,使其不再是集群的一部分。

    您可以将数据库实例与其它参数组关联,也可以修改与数据库实例关联的数据库参数组中的参数。要修改的参数包括 group_replication_group_namerds.group_replication_enabledgroup_replication_group_seeds。有关主动-主动集群参数的更多信息,请参阅主动-主动集群所需的参数设置

    如果您修改数据库参数组中的参数,请确保该数据库参数组未与主动-主动集群中的其它数据库实例相关联。

  4. 重启您从主动-主动集群中移除的数据库实例,以使新的参数设置生效。

    有关说明,请参阅 重启中的数据库实例

RDS for MySQL 主动-主动集群的限制

以下限制适用于 RDS for MySQL 的主动-主动集群。

  • 对于主动-主动集群中的数据库实例,主用户名不能为 rdsgrprepladmin。此用户名保留用于组复制连接。

  • 对于在主动-主动集群中具有只读副本的数据库实例,除 Replicating 之外的长时间复制状态可能会导致日志文件超出存储限制。有关只读副本的状态的信息,请参阅监控只读复制

  • 主动-主动集群中的数据库实例不支持蓝绿部署。有关更多信息,请参阅使用 Amazon RDS 蓝绿部署进行数据库更新

  • 主动-主动集群中的数据库实例不支持 Kerberos 身份验证。有关更多信息,请参阅对 MySQL 使用 Kerberos 身份验证

  • 无法将多可用区数据库集群中的数据库实例添加到主动-主动集群。

    但是,可以将多可用区数据库实例部署中的数据库实例添加到主动-主动集群。

    有关更多信息,请参阅配置和管理多可用区部署

  • 由于组复制插件拒绝写入,因此不会在主动-主动集群中复制没有主键的表。

  • 不会在主动-主动集群中复制非 InnoDB 表。

  • 主动-主动集群不支持集群中不同数据库实例上的并发 DML 和 DDL 语句。

  • 您无法将主动-主动集群配置为使用单主模式作为该组的复制模式。对于此配置,我们建议改用多可用区数据库集群。有关更多信息,请参阅多可用区数据库集群部署

  • 主动-主动集群中的数据库实例不支持多源复制。

  • 跨区域主动-主动集群无法对组复制连接强制执行证书颁发机构(CA)验证。