如果要在组中使用远程克隆操作进行分布式恢复,则必须事先设置现有成员和加入成员以支持此功能。如果不想在组中使用此功能,请不要设置它,在这种情况下,组复制仅使用二进制日志中的状态转移。
要使用克隆,必须事先设置至少一个现有组成员和加入成员以支持远程克隆操作。至少,您必须在捐赠者和加入成员上安装克隆插件,向用于分布式恢复的复制用户授予 BACKUP_ADMIN
权限,并将 group_replication_clone_threshold
系统变量设置为适当的级别。为了确保捐赠者的最大可用性,建议设置所有当前和未来的组成员以支持远程克隆操作。
请注意,远程克隆操作会在从捐赠者传输数据之前从加入成员中删除用户创建的表空间和数据。如果操作在进行中停止,则加入成员可能会留下部分数据或没有数据。这可以通过重试远程克隆操作来修复,组复制会自动执行此操作。
有关设置和配置克隆插件的完整说明,请参阅 第 7.6.7 节“克隆插件”。远程克隆操作的详细先决条件在 第 7.6.7.3 节“克隆远程数据” 中介绍。对于组复制,请注意以下关键点和差异
捐赠者(现有组成员)和接收者(加入成员)必须安装并激活克隆插件。有关如何执行此操作的说明,请参阅 第 7.6.7.1 节“安装克隆插件”。
捐赠者和接收者必须在相同的操作系统上运行,并且必须在相同的 MySQL 服务器版本系列上。因此,克隆不适用于成员运行不同次要 MySQL 服务器版本(例如 MySQL 8.0 和 8.4)的组。
捐赠者和接收者必须安装并激活组复制插件,并且捐赠者上处于活动状态的任何其他插件(例如密钥环插件)也必须在接收者上处于活动状态。
如果分布式恢复配置为使用 SSL(
group_replication_recovery_use_ssl=ON
),则组复制会将此设置应用于远程克隆操作。组复制会自动配置克隆 SSL 选项(clone_ssl_ca
、clone_ssl_cert
和clone_ssl_key
)的设置,以匹配您对相应组复制分布式恢复选项(group_replication_recovery_ssl_ca
、group_replication_recovery_ssl_cert
和group_replication_recovery_ssl_key
)的设置。您无需在
clone_valid_donor_list
系统变量中设置有效捐赠者列表,以便加入复制组。组复制会在从现有组成员中选择捐赠者后自动为您配置此设置。请注意,远程克隆操作使用服务器的 SQL 协议主机名和端口。克隆插件具有许多系统变量,用于管理网络负载和远程克隆操作的性能影响。组复制不会配置这些设置,因此您可以查看它们并在需要时进行设置,或者允许它们默认。请注意,当远程克隆操作用于分布式恢复时,克隆插件的
clone_enable_compression
设置适用于该操作,而不是组复制压缩设置。要在接收者上调用远程克隆操作,组复制使用内部
mysql.session
用户,该用户已具有CLONE_ADMIN
权限,因此您无需设置此权限。作为远程克隆操作在捐赠者上的克隆用户,组复制使用您为分布式恢复设置的复制用户(这在 第 20.2.1.3 节“用于分布式恢复的用户凭据” 中介绍)。因此,您必须在所有支持克隆的组成员上向此复制用户授予
BACKUP_ADMIN
权限。在为组复制配置加入成员时,也要向复制用户授予权限,因为它们在加入组后可以充当捐赠者。每个组成员在分布式恢复上都使用相同的复制用户。要向现有成员上的复制用户授予此权限,您可以在禁用二进制日志记录的情况下在每个组成员上单独发出此语句,或者在启用二进制日志记录的情况下在一个组成员上发出此语句GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
如果您在之前使用
CHANGE REPLICATION SOURCE TO
提供用户凭据的服务器上,使用START GROUP_REPLICATION
指定复制用户凭据,请确保在执行任何远程克隆操作之前,从复制元数据存储库中删除用户凭据。还要确保在加入的成员上设置了group_replication_start_on_boot=OFF
。有关说明,请参阅第 20.6.3 节 “保护分布式恢复连接”。如果不取消设置用户凭据,则在远程克隆操作期间,这些凭据将被传输到加入的成员。然后,group_replication_recovery
通道可能会在原始成员或从其克隆的成员上使用存储的凭据无意中启动。在服务器引导时(包括在远程克隆操作之后)自动启动组复制将使用存储的用户凭据,如果操作员未在START GROUP_REPLICATION
命令上指定分布式恢复凭据,也会使用这些凭据。
当组成员已设置为支持克隆时,group_replication_clone_threshold
系统变量指定一个阈值(以事务数表示),用于在分布式恢复中使用远程克隆操作。如果捐赠者上的事务与加入成员上的事务之间的差距大于此数字,则在技术上可行的情况下,将在状态转移到加入成员时使用远程克隆操作。组复制根据现有组成员的 gtid_executed
集计算是否已超过阈值。如果事务差距很大,则使用远程克隆操作可以将新成员添加到组中,而无需事先手动将组的数据传输到服务器,还可以使版本非常旧的成员更有效地进行追赶。
group_replication_clone_threshold
组复制系统变量的默认设置非常高(GTID 中事务允许的最大序列号),因此,只要可以从二进制日志进行状态转移,它就会有效地停用克隆。要使组复制能够选择更合适的远程克隆操作进行状态转移,请设置系统变量以指定事务数作为要执行克隆的事务差距阈值。
不要在活动组中对 group_replication_clone_threshold
使用较低的设置。如果在远程克隆操作进行期间,组中发生的事务数超过阈值,则加入成员会在重新启动后再次触发远程克隆操作,并且可能会无限期地继续此操作。为避免这种情况,请确保将阈值设置为高于在远程克隆操作期间预期在组中发生的事务数。
当无法从捐赠者的二进制日志进行状态转移时(例如,因为任何现有组成员的二进制日志中都没有加入成员所需的事务),组复制会尝试执行远程克隆操作,而不管您的阈值如何。组复制根据现有组成员的 gtid_purged
集识别这种情况。当任何成员的二进制日志文件中都没有所需的事务时,您不能使用 group_replication_clone_threshold
系统变量停用克隆,因为在这种情况下,克隆是手动将数据传输到加入成员的唯一替代方法。
当组成员和加入成员设置为进行克隆时,组复制会为您管理远程克隆操作。远程克隆操作可能需要一些时间才能完成,具体取决于数据的大小。有关监控过程的信息,请参阅第 7.6.7.10 节 “监控克隆操作”。
状态转移完成后,组复制将重新启动加入成员以完成该过程。如果在加入成员上设置了 group_replication_start_on_boot=OFF
(例如,因为您在 START GROUP_REPLICATION
语句上指定了复制用户凭据),则必须在此重新启动后手动再次发出 START GROUP_REPLICATION
。如果 group_replication_start_on_boot=ON
并且在配置文件中或使用 SET PERSIST
语句设置了启动组复制所需的其他设置,则您无需干预,该过程将自动继续,使加入成员联机。
远程克隆操作会将表中持久化的设置以及数据从捐赠者克隆到接收者。组复制管理与组复制通道特别相关的设置。持久化在配置文件中的组复制成员设置(例如组复制本地地址)不会被克隆,也不会在加入成员上更改。组复制还会保留与使用 SSL 相关的通道设置,因此这些设置对于各个成员是唯一的。
如果使用 CHANGE REPLICATION SOURCE TO
语句将捐赠者用于 group_replication_recovery
复制通道的复制用户凭据存储在复制元数据存储库中,则这些凭据将在克隆后传输到加入成员并由其使用,并且这些凭据在那里必须有效。因此,使用存储的凭据,所有通过远程克隆操作接收状态转移的组成员都将自动接收用于分布式恢复的复制用户名和密码。如果您在 START GROUP_REPLICATION
语句上指定了复制用户凭据,则这些凭据将用于启动远程克隆操作,但不会在克隆后传输到加入成员并由其使用。如果不希望将凭据传输到新的加入者并在那里记录,请确保在执行远程克隆操作之前取消设置它们,如第 20.6.3 节 “保护分布式恢复连接” 中所述,并使用 START GROUP_REPLICATION
来提供它们。
如果已使用 PRIVILEGE_CHECKS_USER
帐户来帮助保护复制应用器(请参阅第 19.3.3.2 节 “组复制通道的权限检查”),则会将捐赠者的 PRIVILEGE_CHECKS_USER
帐户和相关设置克隆到加入成员。如果加入成员设置为在引导时启动组复制,它将自动使用该帐户对相应复制通道执行权限检查。
组复制启动并管理用于分布式恢复的克隆操作。已设置为支持克隆的组成员也可以参与用户手动启动的克隆操作。例如,您可能希望通过从作为捐赠者的组成员进行克隆来创建新的服务器实例,但您不希望新的服务器实例立即加入该组,或者可能永远不会加入。
在所有支持克隆的版本中,您都可以在已停止组复制的组成员上手动启动克隆操作。请注意,由于克隆要求捐赠者和接收者上的活动插件必须匹配,因此即使您不打算让其他服务器实例加入组,也必须在该服务器实例上安装并激活组复制插件。您可以通过发出以下语句来安装该插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
如果操作涉及正在运行组复制的组成员,则可以手动启动克隆操作,前提是该克隆操作不会删除和替换接收者上的数据。因此,如果组复制正在运行,则启动克隆操作的语句必须包含 DATA DIRECTORY
子句。