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