MySQL 8.3 组复制可以使用以下方法之一来保护组成员之间的通信连接:
-
使用其自己的安全协议实现,包括 TLS/SSL 和组通信系统(GCS)连接的允许列表。
-
使用 MySQL 服务器自己的连接安全,而不是组复制的实现。使用 MySQL 协议意味着可以使用标准的用户身份验证方法来授予(或撤销)组访问权限,而不是使用允许列表,并且服务器协议的最新功能总是可用的。
通过设置系统变量 group_replication_communication_stack
为 XCOM
使用组复制自己的实现(这是默认选择),或设置为 MYSQL
使用 MySQL 服务器的连接安全。
要使用 MySQL 通信堆栈,需要进行以下附加配置。特别是在从使用 XCom 通信堆栈切换到使用 MySQL 通信堆栈时,确保满足这些要求。
使用 MySQL 通信堆栈的组复制要求
-
每个组成员的网络地址必须通过
group_replication_local_address
系统变量设置为 MySQL 服务器监听的 IP 地址和端口之一,如bind_address
系统变量所指定的那样。每个成员的 IP 地址和端口组合必须在组中唯一。建议将group_replication_group_seeds
系统变量配置为包含所有组成员的本地地址。 -
MySQL 通信堆栈支持网络命名空间,而 XCom 通信堆栈不支持。如果使用网络命名空间与组复制的本地地址(
group_replication_local_address
),则必须使用CHANGE REPLICATION SOURCE TO
语句为每个组成员配置命名空间。此外,每个组成员的report_host
服务器系统变量必须设置为报告命名空间。所有组成员必须使用相同的命名空间,以避免分布式恢复期间的地址解析问题。 -
必须将
group_replication_ssl_mode
系统变量设置为组通信所需的设置。该系统变量控制是否启用或禁用组通信的 TLS/SSL。当使用 MySQL 通信堆栈时,TLS/SSL 配置来自组复制的分布式恢复设置。该设置应该在所有组成员上相同,以避免潜在的冲突。 -
--ssl
或--skip-ssl
服务器选项和require_secure_transport
服务器系统变量的设置应该在所有组成员上相同,以避免潜在的冲突。如果group_replication_ssl_mode
设置为REQUIRED
、VERIFY_CA
或VERIFY_IDENTITY
,则使用--ssl
和require_secure_transport=ON
。如果group_replication_ssl_mode
设置为DISABLED
,则使用require_secure_transport=OFF
。 -
如果启用了组通信的TLS/SSL,则必须配置或验证安全分布式恢复的设置,以便Group Replication使用这些设置来保护分布式恢复连接和一般组通信。
group_replication_recovery_use_ssl
和其他group_replication_recovery_*
系统变量在第20.6.3.2节,“安全套接字层(SSL)连接用于分布式恢复”中进行了解释。 -
当组使用MySQL通信栈时,不使用Group Replication allowlist,因此
group_replication_ip_allowlist
系统变量将被忽略,不需要设置。 -
Group Replication用于分布式恢复的复制用户帐户,如使用CHANGE REPLICATION SOURCE TO语句配置的那样,由MySQL通信栈用于身份验证时设置Group Replication连接。该用户帐户,在所有组成员上都是相同的,必须授予以下权限:
-
GROUP_REPLICATION_STREAM
。该权限是用户帐户使用MySQL通信栈建立Group Replication连接所需的。 -
CONNECTION_ADMIN
。该权限是必要的,以便Group Replication连接不被终止,如果其中一个服务器被置于离线模式。如果没有该权限,MySQL通信栈将被终止,成员将被从组中驱逐。
这些权限是除了所有复制用户帐户必须拥有的
REPLICATION SLAVE
和BACKUP_ADMIN
权限之外的(见第20.2.1.3节,“分布式恢复的用户凭证”)。在添加新权限时,请确保在每个组成员上跳过二进制日志记录,通过在发出GRANT
语句之前设置SET SQL_LOG_BIN=0
,然后在语句之后设置SET SQL_LOG_BIN=1
,以便本地事务不干扰Group Replication的重新启动。 -
group_replication_communication_stack
实际上是一个组范围的配置设置,该设置必须在所有组成员上相同。但是,这不是由Group Replication自己的组范围配置检查所强制执行的。具有不同值的成员无法与其他成员通信,因为通信协议不兼容,因此无法交换配置设置信息。
这意味着,虽然可以在Group Replication运行时更改系统变量的值,并在重新启动Group Replication后生效,但成员仍然无法重新加入组,直到所有成员的设置都被更改。你必须停止所有成员的Group Replication,然后在所有成员上更改系统变量的值,然后才能重新启动组。由于所有成员都被停止,因此需要对组进行完整的重新启动(由具有group_replication_bootstrap_group=ON
的服务器引导)以使值更改生效。你可以在成员停止时对组成员进行其他所需的设置更改。
要将组从XCom通信栈迁移到MySQL通信栈,或者从MySQL通信栈迁移到XCom通信栈,请按照以下步骤更改group_replication_communication_stack
的值和其他所需的设置:
-
使用
STOP GROUP_REPLICATION
语句在每个组成员上停止Group Replication。最后停止主成员,以免触发新的主选举并等待其完成。 -
在每个组成员上,设置系统变量
group_replication_communication_stack
到新的通信栈,MYSQL
或XCOM
,根据情况选择。您可以通过编辑 MySQL 服务器配置文件(通常在 Linux 和 Unix 系统上命名为my.cnf
,在 Windows 系统上命名为my.ini
),或使用SET
语句。例如:SET PERSIST group_replication_communication_stack="MYSQL";
-
如果您将复制组从 XCom 通信栈(默认)迁移到 MySQL 通信栈,在每个组成员上,配置或重新配置所需的系统变量,以适当的设置,如上所述。例如,
group_replication_local_address
系统变量必须设置为 MySQL 服务器监听的 IP 地址和端口之一。还可以使用CHANGE REPLICATION SOURCE TO
语句配置网络命名空间。 -
如果您将复制组从 XCom 通信栈(默认)迁移到 MySQL 通信栈,在每个组成员上,发出
GRANT
语句,以授予复制用户帐户GROUP_REPLICATION_STREAM
和CONNECTION_ADMIN
权限。您需要将组成员从只读状态中取出,该状态是在停止 Group Replication 时应用的。还需要确保在每个组成员上跳过二进制日志记录,通过发出SET SQL_LOG_BIN=0
语句,然后发出GRANT
语句,最后发出SET SQL_LOG_BIN=1
语句,以便本地事务不干扰重新启动 Group Replication。例如:SET GLOBAL SUPER_READ_ONLY=OFF; SET SQL_LOG_BIN=0; GRANT GROUP_REPLICATION_STREAM ON *.* TO rpl_user@'%'; GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%'; SET SQL_LOG_BIN=1;
-
如果您将复制组从 MySQL 通信栈迁移到 XCom 通信栈,在每个组成员上,重新配置系统变量,以适合 XCom 通信栈的设置。第 20.9 节,“Group Replication 变量” 列出了 XCom 通信栈的系统变量默认值和要求。
Note-
XCom 通信栈不支持网络命名空间,因此 Group Replication 本地地址 (
group_replication_local_address
系统变量) 不能使用这些命名空间。可以通过发出CHANGE REPLICATION SOURCE TO
语句来取消这些设置。 -
当您回到 XCom 通信栈时,
group_replication_recovery_use_ssl
和其他group_replication_recovery_*
系统变量不再用于保护组通信。相反,Group Replication 系统变量group_replication_ssl_mode
用于激活组通信连接的 SSL 保护,并指定连接的安全模式。详细信息,请参阅 第 20.6.2 节,“使用 Secure Socket Layer (SSL) 保护组通信连接”。
-
-
要重新启动组,请按照 第 20.5.2 节,“重新启动组” 中的过程,安全地引导组,其中事务已经执行和认证。需要使用
group_replication_bootstrap_group=ON
引导组,因为所有成员都必须关闭。 -
现在,成员使用新的通信栈连接彼此。任何设置了
group_replication_communication_stack
(或在XCom的情况下默认)为以前的通信栈的服务器将无法加入组。需要注意的是,因为组复制无法看到加入尝试,因此它不会检查并以错误消息拒绝加入的成员。相反,当以前的通信栈放弃尝试联系新的通信栈时,加入尝试将默默失败。