20.6.1 连接安全性管理:通信栈
MySQL 8.4 Group Replication 可以通过以下方法来保护组间通信连接:
-
使用自己的安全协议实现,包括 TLS/SSL 和入站 Group Communication System(GCS)连接的白名单。
-
使用 MySQL Server 自己的连接安全性取代 Group Replication 的实现。使用 MySQL 协议意味着可以使用标准用户身份验证方法来授予(或撤销)对组的访问权限,而不是白名单,并且服务器协议的最新功能总是可用的。
选择由设置系统变量group_replication_communication_stack
到XCOM
以使用 Group Replication 自己的实现(这是默认选择),或到MYSQL
以使用 MySQL Server 连接安全性。
以下是 replication 组要使用 MySQL 通信栈所需的额外配置。特别重要的是,在从使用 XCom 通信栈切换到 MySQL 通信栈时,确保这些要求都被满足。
Group Replication 对 MySQL 通信栈的要求
-
每个组成员的网络地址,配置由
group_ replication_local_address
系统变量指定,必须设置为MySQL Server监听的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配置将来自Group Replication的分布式恢复设置。该设置应在所有群组成员上相同,以避免潜在冲突。 -
服务器系统变量
require_secure_transport
的值应该在所有群组成员上相同,以避免潜在冲突。如果group_replication_ssl_mode
设置为REQUIRED
、VERIFY_CA
或VERIFY_IDENTITY
,请使用require_secure_transport=ON
。如果group_replication_ssl_mode
设置为DISABLED
,请使用require_secure_transport=OFF
。 -
如果为群组通信启用TLS/SSL,Group Replication的分布式恢复安全设置必须配置或验证。如果这些设置已经存在,可以忽略本节内容。MySQL 通信栈使用这些设置不仅用于成员之间的分布式恢复连接,还用于一般群组通信中的TLS/SSL配置。
group_ replication_recovery_use_ssl
和其他group_ replication_recovery_*
系统变量在第20.6.3.2节,“Secure Socket Layer (SSL) Connections for Distributed Recovery”中有详细解释。 -
Group Replication allowlist在使用MySQL 通信栈时不被使用,因此
group_ replication_ip_allowlist
系统变量将被忽略,不需要设置。 -
Group Replication用于分布式恢复的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节,“分布式恢复用户凭证”)。在添加新权限时,请确保在每个组成员上设置SET SQL_LOG_BIN=0
,然后执行GRANT
语句,并在完成后设置SET SQL_LOG_BIN=1
,以免本地事务干扰 Group Replication 重启。 -
group_replication_communication_stack
是一个群组级别的配置设置,所有群组成员都必须具有相同的值。然而,这不是 Group Replication 自己检查群组级别配置设置的方式。拥有不同值的成员无法与其他成员通信,因为通信协议不兼容,因此无法交换其配置设置信息。
这意味着,即使在 Group Replication 运行时可以更改该系统变量的值,并且在重新启动群组成员后生效,但是成员仍然不能重新加入群组,直到所有成员都更改了该值。你必须停止 Group Replication 在所有成员上,然后在所有成员上更改该系统变量的值,最后才能重新启动群组。由于所有成员都已停止,因此需要对群组进行完整的重启(由具有group_replication_bootstrap_group=ON
的服务器执行的引导)以使更改生效。你可以在成员停止时对其他必需设置进行更改。
要将运行中的群组从 XCom 通信栈迁移到 MySQL 通信栈,或者从 MySQL 通信栈迁移到 XCom 通信栈,请按照以下步骤更改group_replication_communication_stack
和其他必需设置的值:
-
在每个组成员上,使用
STOP GROUP_REPLICATION
语句停止群组复制。最后停止主成员,以避免触发新的主选举并等待其完成。 -
在每个组成员上,设置系统变量
group_replication_communication_stack
为新的通信栈,例如MYSQL
或XCOM
。您可以通过编辑MySQL Server配置文件(通常名为my.cnf
在Linux和Unix系统上,或者my.ini
在Windows系统上),或使用SET
语句来实现。例如:SET PERSIST group_replication_communication_stack="MYSQL";
-
如果您正在从XCom通信栈(默认)迁移到MySQL通信栈,在每个组成员上,配置或重新配置所需的系统变量,以适应上述列表中的设置。例如,
group_replication_local_address
系统变量必须设置为MySQL Server正在监听的IP地址和端口之一。另外,还需要使用CHANGE REPLICATION SOURCE TO
语句配置网络命名空间。 -
如果您正在从XCom通信栈(默认)迁移到MySQL通信栈,每个组成员上都需要执行
GRANT
语句,以授予复制用户账户GROUP_REPLICATION_STREAM
和CONNECTION_ADMIN
权限。您需要将组成员从Group Replication停止时应用的只读状态中取出。此外,请在执行GRANT
语句前,设置每个组成员上的SQL_LOG_BIN
为0,然后在执行GRANT
语句后,设置为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 Variables”列出了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 使用,并指定连接的安全模式,剩余配置将来自服务器的 SSL 配置。详见第20.6.2节,“使用 Secure Socket Layer (SSL) 保护组通信”。
-
-
要重新启动组,请按照第20.5.2节,“重启组”中的过程进行,该节解释了如何安全地在事务已经执行和证实的情况下引导组。由具有
group_replication_bootstrap_group=ON
的服务器进行引导是必要的,因为所有成员都需要关闭。 -
现在,每个成员使用新的通信栈连接到其他成员。任何具有
group_replication_communication_stack
设置为之前的通信栈(或在XCom的情况下默认)的服务器现在不能加入组。需要注意的是,因为Group Replication无法看到加入尝试,它不会检查并 reject加入成员,并返回错误消息,而是当之前的通信栈放弃尝试联系新的通信栈时,加入尝试失败地 silence。