无论何时成员加入或重新加入复制组,它都必须赶上组成员之前应用的交易。这一过程称为分布式恢复。
加入的成员首先检查其relay日志中的group_replication_applier
通道,以查找它从组中收到的但尚未应用的交易。如果加入的成员之前曾经在组中,它可能会找到尚未应用的交易,从而作为第一步应用。新的成员不需要应用任何交易。
然后,加入的成员连接到在线的现有成员,以执行状态传输。加入的成员从现有成员(称为捐赠者)那里获取组中之前或离开期间发生的所有交易。然后,加入的成员应用在状态传输期间发生的交易。当这个过程完成时,加入的成员赶上了组中的其他服务器,并开始正常参与组。
组复制使用以下方法之一来执行状态传输,以便在分布式恢复期间:
-
使用克隆插件的远程克隆操作,该插件从MySQL 8.0.17开始可用。要启用该状态传输方法,您必须在组成员和加入的成员上安装克隆插件。组复制自动配置所需的克隆插件设置,并管理远程克隆操作。
-
从捐赠者的二进制日志中复制交易,并在加入的成员上应用这些交易。这使用了一个名为
group_replication_recovery
的标准异步复制通道,该通道在捐赠者和加入的成员之间建立。
组复制自动选择状态传输的最佳组合方法,方法是检查哪些现有成员适合作为捐赠者,加入的成员需要从捐赠者那里获取多少交易,以及是否有任何必需的交易不再存在于任何组成员的二进制日志文件中。如果加入的成员和捐赠者之间的交易差距很大,或者如果某些必需的交易不再存在于任何捐赠者的二进制日志文件中,组复制将开始分布式恢复,使用远程克隆操作。如果没有大的交易差距,或者克隆插件未安装,组复制将直接从捐赠者的二进制日志中进行状态传输。
-
在远程克隆操作期间,加入的成员上的现有数据将被删除,并被捐赠者的数据副本所取代。当远程克隆操作完成并且加入的成员重新启动时,将从捐赠者的二进制日志中进行状态传输,以获取组在远程克隆操作期间应用的交易。
-
在从捐赠者的二进制日志中进行状态传输期间,加入的成员将复制和应用捐赠者的二进制日志中的必需交易,直到加入的成员加入组的点(视图更改事件)。在此期间,加入的成员将缓冲组应用的新交易。当状态传输从二进制日志完成时,加入的成员将应用缓冲的交易。
当加入的成员赶上了组中的所有交易时,它将被宣布在线,并可以作为正常成员参与组,分布式恢复完成。
从二进制日志的状态传输是Group Replication的基本机制,用于分布式恢复,如果您的复制组中的donor和加入成员没有设置克隆支持,那么这是唯一可用的选项。由于从二进制日志的状态传输基于经典的异步复制,因此如果加入组的服务器没有组的数据,或者来自非常旧的备份镜像,那么可能需要很长时间。在这种情况下,在将服务器添加到组之前,建议您使用组中已有的服务器的最新快照来设置它,以便最小化分布式恢复所需的时间,并减少对donor服务器的影响,因为它们只需要保留和传输较少的二进制日志文件。