17.4.2 调整恢复

每当新成员加入复制组时,它都会连接到合适的供体,并获取丢失的数据,直到将其声明为在线为止。组复制中的此关键组件是容错的并且是可配置的。下一节说明恢复的工作方式以及如何调整设置

Donor Selection

从组中现有的在线成员中选择一个随机的捐助者。这样,当多个成员进入该组时,很有可能一次选择同一台服务器的机会不止一次。

如果与所选捐助者的连接失败,则会自动尝试与新的候选捐助者构建新的连接。一旦达到连接重试限制,恢复过程将终止并显示错误。

Note

从当前视图的在线成员列 table 中随机选择一个捐助者。

增强的自动捐助者切换

整个恢复过程中,另一个值得关注的主要问题是确保它可以应对故障。因此,组复制提供了可靠的错误检测机制。在早期版本的组复制中,当与捐助者联系时,恢复只能检测到由于身份验证问题或其他问题引起的连接错误。对这种有问题的方案的反应是切换到新的捐助者,因此尝试与其他成员进行新的连接。

此行为已扩展为还涵盖其他失败方案:

  • 清除数据方案-如果选定的捐助者包含恢复过程所需的一些清除数据,则会发生错误。恢复检测到此错误,并选择了新的供体。

  • 重复的数据-如果在恢复过程中加入该组的服务器已经包含某些数据,这些数据与来自选定供体的数据相冲突,则会发生错误。这可能是由于加入该组的服务器中存在一些错误的事务引起的。

有人可能会辩称,恢复应该失败,而不是转移到另一个捐助者,但是在异类组织中,其他成员有可能共享冲突的 Transaction,而其他成员则没有。出于这个原因,一旦出错,恢复就会从组中选择另一个供体。

  • 其他错误-如果任何恢复线程失败(接收方线程或应用线程失败),则会发生错误,并且恢复将切换到新的施主。

Note

如果出现某些永久性故障,甚至出现暂时性故障,恢复将自动重试连接到相同或新的捐助者的连接。

供体连接重试

恢复数据传输依赖于二进制日志和现有的 MySQL 复制框架,因此,某些暂时性错误可能会导致接收方或应用线程中的错误。在这种情况下,供体转换过程具有重试功能,类似于常规复制中的功能。

尝试次数

尝试从捐赠者池连接到捐赠者时,加入组的服务器尝试尝试的次数为 10.这是通过group_replication_recovery_retry_count plugin 变量配置的。以下命令将尝试连接到施主的最大尝试次数设置为 10.

mysql> SET GLOBAL group_replication_recovery_retry_count= 10;

请注意,这说明了加入组的服务器尝试连接到每个合适的供体的全局尝试次数。

Sleep Routines

group_replication_recovery_reconnect_interval插件变量定义恢复过程在捐助者连接尝试之间应休眠的时间。该变量的默认设置为 60 秒,您可以动态更改此值。以下命令将恢复施主连接重试间隔设置为 120 秒。

mysql> SET GLOBAL group_replication_recovery_reconnect_interval= 120;

但是请注意,每次尝试进行捐助者连接后,恢复都不会停止。由于加入该组的服务器正在连接到不同的服务器,而不是一遍又一遍地连接到同一台服务器,因此可以假定影响服务器 A 的问题不影响服务器 B。因此,仅当恢复通过所有服务器后,恢复才会挂起可能的捐助者。一旦加入该组的服务器尝试连接到该组中所有合适的捐助者,并且没有剩余的捐助者,恢复过程将休眠由group_replication_recovery_reconnect_interval变量配置的秒数。