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