文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  分布式恢复的工作原理

20.5.4.5 分布式恢复的工作原理

当组复制的分布式恢复过程从二进制日志中执行状态转移以将加入的成员与捐赠者同步到特定时间点时,加入的成员和捐赠者会利用 GTID(请参阅 第 19.1.3 节,“使用全局事务标识符复制”)。但是,GTID 只能提供一种方式来识别加入的成员缺少哪些事务。它们不能帮助标记服务器加入组后必须赶上的特定时间点,也不能传达认证信息。这是二进制日志视图标记的工作,它们标记二进制日志流中的视图更改,并且还包含其他元数据信息,为加入的成员提供缺少的与认证相关的數據。

本主题解释了视图更改和视图更改标识符的作用,以及从二进制日志中执行状态转移的步骤。

视图和视图更改

一个 视图 对应于一组积极参与当前配置的成员,换句话说,在特定时间点。它们在组中正常运行且在线。

当对组配置进行修改时,例如成员加入或离开,就会发生 视图更改。任何组成员资格更改都会导致一个独立的视图更改,并在同一逻辑时间点传达给所有成员。

一个 视图标识符 唯一标识一个视图。它在发生视图更改时生成。

在组通信层,具有关联视图标识符的视图更改标记了成员加入之前和之后交换的数据之间的边界。该概念通过一个二进制日志事件实现:“视图更改日志事件”(VCLE)。视图标识符被记录下来,以区分在组成员资格发生变化之前和之后传输的事务。

视图标识符本身由两部分组成:一个随机生成的部分和一个单调递增的整数。随机生成的部分在创建组时生成,并在组中至少有一个成员时保持不变。每次发生视图更改时,整数都会递增。使用这两个不同的部分使视图标识符能够识别由于成员加入或离开而导致的增量组更改,并识别所有成员在完全组关闭时离开组的情况,因此不会保留关于组处于哪种视图的信息。在从头开始启动组时随机生成标识符的一部分,可以确保二进制日志中的数据标记保持唯一,并且在完全组关闭后不会重新使用相同的标识符,因为这会导致将来分布式恢复出现问题。

开始:稳定组

所有服务器都处于联机状态,并处理来自组的传入事务。一些服务器在复制的事务方面可能略微落后,但最终它们会收敛。该组充当一个分布式和复制的数据库。

图 20.8 稳定组

Servers S1, S2, and S3 are members of the group. The most recent item in all of their binary logs is transaction T20.

视图更改:成员加入

每当新的成员加入组,因此执行视图更改时,每个在线服务器都会排队执行视图更改日志事件。这是排队的,因为在视图更改之前,服务器上可能会排队几个要应用的事务,因此这些事务属于旧视图。在它们之后排队视图更改事件可以保证对更改发生时间的正确标记。

同时,加入的成员从成员服务通过视图抽象提供的在线服务器列表中选择合适的捐赠者。成员在视图 4 上加入,在线成员将视图更改事件写入二进制日志。

图 20.9 成员加入

Server S4 joins the group and looks for a donor. Servers S1, S2, and S3 each queue the view change entry VC4 for their binary logs. Meanwhile, server S1 is receiving new transaction T21.

状态转移:赶上

如果组成员和加入的成员都设置了克隆插件(请参阅 第 20.5.4.2 节,“用于分布式恢复的克隆”),并且加入的成员与组之间的事务差异超过了为远程克隆操作设置的阈值(group_replication_clone_threshold),组复制将使用远程克隆操作开始分布式恢复。如果所需的事务不再存在于任何组成员的二进制日志文件中,也会执行远程克隆操作。在远程克隆操作期间,加入的成员上的现有数据将被删除,并用捐赠者数据的副本替换。当远程克隆操作完成且加入的成员已重新启动后,将从捐赠者的二进制日志中执行状态转移,以获取在远程克隆操作进行期间组应用的事务。如果没有大的事务差距,或者没有安装克隆插件,组复制将直接进行从捐赠者的二进制日志中进行状态转移。

对于从捐赠者的二进制日志中进行状态转移,将在加入的成员和捐赠者之间建立连接,并开始状态转移。与捐赠者的这种交互将持续到加入组的服务器的应用程序线程处理对应于加入组的服务器进入组时触发的视图更改的视图更改日志事件为止。换句话说,加入组的服务器从捐赠者复制,直到它到达与它已经所在的视图标记匹配的视图标识符标记。

图 20.10 状态转移:赶上

Server S4 has chosen server S2 as the donor. State transfer is executed from server S2 to server S4 until the view change entry VC4 is reached (view_id = VC4). Server S4 uses a temporary applier buffer for state transfer, and its binary log is currently empty.

由于视图标识符是在同一逻辑时间传达给组中的所有成员的,因此加入组的服务器知道它应该在哪个视图标识符处停止复制。这避免了复杂的 GTID 集计算,因为视图标识符明确标记了哪些数据属于每个组视图。

当加入组的服务器从捐赠者处复制数据时,它也会缓存来自组的传入事务。最终,它会停止从捐赠者处复制,并切换到应用那些被缓存的事务。

图 20.11 队列事务

State transfer is complete. Server S4 has applied the transactions up to T20 and written them to its binary log. Server S4 has cached transaction T21, which arrived after the view change, in a temporary applier buffer while recovering.

完成:已追赶

当加入组的服务器识别到具有预期视图标识符的视图更改日志事件时,它会终止与捐赠者的连接并开始应用缓存的事务。尽管它在二进制日志中充当标记,界定视图更改,但视图更改日志事件也扮演着另一个角色。它传递了所有服务器在加入组的服务器进入组时感知的认证信息,换句话说,就是最后一次视图更改。如果没有它,加入组的服务器将没有必要的信息来认证(检测冲突)后续的事务。

追赶的持续时间是不确定的,因为它取决于工作负载和传入组的事务速率。此过程完全在线进行,加入组的服务器在追赶期间不会阻塞组中的任何其他服务器。因此,加入组的服务器在进入此阶段时落后的事务数量可能会因工作负载而异,因此会随着工作负载的增加或减少而增加或减少。

当加入组的服务器的队列事务数达到零,并且其存储的数据与其他成员相同,它的公共状态将变为在线。

图 20.12 实例在线

Server S4 is now an online member of the group. It has applied cached transaction T21, so its binary log shows the same items as the binary logs of the other group members, and it no longer needs the temporary applier buffer. New incoming transaction T22 is now received and applied by all group members.