每当成员加入或重新加入复制组时,它都必须追赶上在它加入之前或它不在的时候由组成员应用的事务。这个过程称为分布式恢复。
加入的成员首先检查其 group_replication_applier
频道中的中继日志,以查找它已从组中接收但尚未应用的任何事务。如果加入的成员之前在组中,它可能会发现它离开之前的未应用事务,在这种情况下,它会将这些事务作为第一步应用。新加入组的成员没有要应用的任何内容。
之后,加入的成员连接到在线的现有成员以执行状态转移。加入的成员转移在它加入之前或它不在的时候发生在组中的所有事务,这些事务由现有成员提供(称为 捐赠者)。接下来,加入的成员应用在状态转移正在进行时发生在组中的事务。当此过程完成时,加入的成员已追赶上组中的其余服务器,并且它开始正常参与组。
组复制使用这些方法的组合来在分布式恢复期间执行状态转移
使用克隆插件功能的远程克隆操作。要启用此状态转移方法,您必须在组成员和加入的成员上安装克隆插件。组复制会自动配置所需的克隆插件设置并管理远程克隆操作。
从捐赠者的二进制日志复制并应用加入的成员的事务。此方法使用在捐赠者和加入的成员之间建立的标准异步复制通道,名为
group_replication_recovery
。
在您在加入的成员上发出 START GROUP_REPLICATION
后,组复制会自动选择这些方法的最佳组合来执行状态转移。为此,组复制会检查哪些现有成员适合作为捐赠者,加入的成员需要多少事务,以及任何所需的事务是否不再存在于任何组成员的二进制日志文件中。如果加入的成员与合适捐赠者之间的事务差距很大,或者如果某些所需的事务不存在于任何捐赠者的二进制日志文件中,组复制会使用远程克隆操作开始分布式恢复。如果没有大的事务差距,或者没有安装克隆插件,组复制会直接从捐赠者的二进制日志执行状态转移。
在远程克隆操作期间,加入的成员上的现有数据将被删除,并替换为捐赠者数据的副本。当远程克隆操作完成并且加入的成员已重新启动时,会从捐赠者的二进制日志执行状态转移,以获取在远程克隆操作进行期间组应用的事务。
在从捐赠者的二进制日志进行状态转移期间,加入的成员从捐赠者的二进制日志复制并应用所需的事务,按收到顺序应用事务,直到二进制日志记录加入的成员已加入组(视图更改事件)。在此过程中,加入的成员会缓冲组应用的新事务。当从二进制日志进行的状态转移完成时,加入的成员会应用缓冲的事务。
当加入的成员与组的所有事务同步时,它将被声明为在线,并且可以作为正常成员参与组,并且分布式恢复完成。
从二进制日志进行状态转移是组复制分布式恢复的基本机制,如果您的复制组中的捐赠者和加入的成员未设置为支持克隆,这是唯一可用的选项。由于从二进制日志进行状态转移基于经典异步复制,如果加入组的服务器根本没有组的数据,或者从非常旧的备份映像获取了数据,则可能需要很长时间。因此,在这种情况下,建议在将服务器添加到组之前,通过从已在组中的服务器传输最近的快照来为服务器设置组的数据。这将最大限度地减少分布式恢复所需的时间,并减少对捐赠服务器的影响,因为它们必须保留和传输的二进制日志文件更少。