• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 克隆分布式恢复

    每当成员加入或重新加入复制组时,它都必须赶上加入前或离开时该组成员所应用的事务。此过程称为分布式恢复。

    加入成员首先检查中继日志中其group_replication_applier通道的已从该组接收到但尚未应用的任何事务。如果加入成员以前在该组中,则它可能会在离开之前找到未应用的事务,在这种情况下,它将第一步应用这些事务。该组的新成员没有任何要申请的内容。

    此后,加入成员连接到在线现有成员以执行状态转移。加入成员转移组中加入之前或离开时在组中发生的所有处理,这些处理由现有成员(称为捐赠者)提供。接下来,加入成员应用在进行此状态转移时在组中发生的事务。完成此过程后,加入成员已赶上了该组中的其余服务器,并且开始正常加入该组。

    组复制将这些方法的组合用于分布式恢复期间的状态转移:

    • 使用克隆插件功能的远程克隆操作,可从MySQL 8.0.17获得。要启用这种状态转移方法,必须在组成员和加入成员上安装克隆插件。组复制会自动配置所需的克隆插件设置,并管理远程克隆操作。
    • 从捐助者的二进制日志复制并在加入成员上应用事务。此方法使用group_replication_recovery在捐赠者和加入成员之间建立的名为的标准异步复制通道。

    发出后,组复制会自动选择这些方法的最佳组合进行状态转移START GROUP_REPLICATION在加入成员上。为此,组复制将检查哪些现有成员适合用作捐赠者,加入成员需要捐赠者进行多少处理,以及任何必需的处理是否不再存在于任何组成员的二进制日志文件中。如果加入成员与合适的捐赠者之间的处理差距很大,或者如果某些要求的处理不在捐赠者的二进制日志文件中,则组复制将通过远程克隆操作开始分布式恢复。如果处理间隔不大,或者未安装克隆插件,则组复制将直接从捐助者的二进制日志进行状态转移。

    • 在远程克隆操作期间,将删除加入成员上的现有数据,并用捐赠者数据的副本替换。当远程克隆操作完成并且加入成员已重新启动时,将从施主的二进制日志中进行状态转移,以获取在进行远程克隆操作时组所应用的事务。
    • 在从捐赠者的二进制日志进行状态转移期间,加入成员从捐赠者的二进制日志中复制并应用所需的事务,并在收到处理时应用这些事务,直到二进制日志记录加入成员加入了该组为止(a参见更改事件)。在此过程中,加入成员将缓冲该组应用的新事务。从二进制日志完成状态传输后,加入成员将应用缓冲的事务。

    当加入成员与该组的所有事务保持最新时,该成员将在线声明并可以作为普通成员加入该组,并且分布式恢复已完成。


    克隆分布式恢复

    MySQL Server的克隆插件可从MySQL 8.0.17获得。如果要将远程克隆操作用于组中的分布式恢复,则必须预先设置现有成员和加入成员以支持此功能。如果不想在组中使用此功能,请不要进行设置,在这种情况下,组复制仅使用来自二进制日志的状态传输。

    要使用克隆,必须预先设置至少一个现有的组成员和加入成员以支持远程克隆操作。至少,您必须在供体和加入成员上安装克隆插件,将BACKUP_ADMIN权限授予复制用户以进行分布式恢复,并将group_replication_clone_threshold系统变量设置为适当的级别。为了确保捐助者的最大可用性,建议设置所有当前和将来的组成员以支持远程克隆操作。

    请注意,在从供体传输数据之前,远程克隆操作会从连接成员中删除用户创建的表空间和数据。如果在进行中操作停止,则连接成员可能只剩下部分数据或没有数据。可以通过重试组复制自动执行的远程克隆操作来修复此问题。

    克隆的前提条件

    有关设置和配置克隆插件的完整说明,请参见“MySQL服务器克隆插件”。“克隆远程数据”中介绍了进行远程克隆操作的详细前提条件。对于组复制,请注意以下要点和区别:

    • 施主(现有组成员)和受主(加入成员)必须已安装克隆插件并处于活动状态。有关执行此操作的说明,请参见“MySQL服务器克隆插件”。
    • 施主和受主必须在相同的操作系统上运行,并且必须具有相同的MySQL Server版本(必须为MySQL 8.0.17或更高版本才能支持克隆插件)。因此,克隆不适用于成员运行不同MySQL Server版本的组。
    • 施主和受主必须已安装并激活了“组复制”插件,施主上所有活动的其他插件(例如,密钥环插件)也必须在受主上活动。
    • 如果将分布式恢复配置为使用SSL(group_replication_recovery_use_ssl=ON),则组复制会将此设置应用于远程克隆操作。组复制自动配置为克隆SSL选项(设置clone_ssl_caclone_ssl_certclone_ssl_key)来匹配您的设置相应的组复制分布式恢复选项(group_replication_recovery_ssl_cagroup_replication_recovery_ssl_cert,和group_replication_recovery_ssl_key)。
    • 您不需要clone_valid_donor_list为加入复制组而在系统变量中设置有效供体列表。从现有的组成员中选择捐助者后,组复制会自动为您配置此设置。请注意,远程克隆操作使用服务器的SQL协议主机名和端口。
    • 克隆插件具有许多系统变量,可管理远程克隆操作的网络负载和性能影响。组复制未配置这些设置,因此您可以参见它们并根据需要进行设置,也可以将它们设置为默认值。请注意,将远程克隆操作用于分布式恢复时,克隆插件的clone_enable_compression设置适用于该操作,而不适用于“组复制”压缩设置。
    • 要在收件人上调用远程克隆操作,组复制将使用内部mysql.session用户,该用户已经具有该CLONE_ADMIN特权,因此您无需进行设置。
    • 作为用于远程克隆操作的提供者上的克隆用户,组复制使用您为分布式恢复设置的复制用户(“用户凭据”中介绍)。因此,您必须给BACKUP_ADMIN在支持克隆的所有组成员上对此复制用户具有特权。在为成员配置组复制时,还应向复制用户授予加入成员的特权,因为加入成员后,他们可以充当捐赠者。若要将此特权授予现有成员上的复制用户,可以在禁用二进制日志记录的情况下在每个组成员上单独发出此语句,或者在启用二进制日志记录的情况下在一个组成员上发出以下语句:

      GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
      

    克隆阈值

    设置组成员以支持克隆后,group_replication_clone_threshold系统变量将指定一个阈值,表示为多个事务,以便在分布式恢复中使用远程克隆操作。如果施主上的处理与加入成员上的处理之间的距离大于此数目,则在技术上可行时,将使用远程克隆操作将状态转移到加入成员。组复制根据以下内容计算是否已超过阈值:gtid_executed现有小组成员的集合。在事务间隙较大的情况下使用远程克隆操作可以使您将新成员添加到组中,而无需事先将组中的数据手动传输到服务器,还可以使过时的成员更有效地进行追赶。

    group_replication_clone_threshold组复制系统变量的默认设置非常高(GTID中事务的最大允许序列号),因此,只要有可能从二进制日志转移状态,它就可以有效地禁用克隆。要使组复制能够为状态转移选择一个远程克隆操作以进行状态转移,在更合适的情况下,将系统变量设置为将多个事务指定为要进行克隆的事务间隔。

    警告

    不要group_replication_clone_threshold在活动组中使用较低的设置。如果在进行远程克隆操作的同时在组中发生了超过阈值的事务,则加入成员在重新启动后会再次触发远程克隆操作,并且可以无限期地继续进行。为避免这种情况,请确保将阈值设置为一个数字,该数字应大于在远程克隆操作所花费的时间段内组中可能发生的事务数。

    当无法从捐赠者的二进制日志进行状态转移时,组复制尝试执行远程克隆操作,而不管您的阈值如何,例如,因为加入成员所需的事务在任何现有组成员的二进制日志中均不可用。组复制会根据gtid_purged现有组成员的集合来识别这一点。group_replication_clone_threshold当所需的事务在任何成员的二进制日志文件中不可用时,您不能使用系统变量来停用克隆,因为在这种情况下,克隆是手动将数据传输到加入成员的唯一选择。

    克隆操作

    设置组成员和加入成员进行克隆后,组复制将为您管理远程克隆操作。远程克隆操作可能需要一些时间才能完成,具体取决于数据的大小。有关监视过程的信息,请参见“监视克隆操作”。

    注意

    状态转移完成后,组复制将重新启动加入成员以完成该过程。如果group_replication_start_on_boot=OFF在加入成员上设置了,则必须START GROUP_REPLICATION在重新启动后再次手动发出。如果group_replication_start_on_boot=ON在配置文件中或使用SET PERSIST语句设置了启动组复制所需的其他设置,则无需干预,该过程将自动继续以使加入成员联机。

    远程克隆操作会克隆保存在表中的设置(从供体到收件人)以及数据。组复制管理专门与组复制通道相关的设置。配置文件中保留的组复制成员设置(例如组复制本地地址)不会被克隆,也不会在加入成员上更改。

    group_replication_recovery克隆后,供体用于复制通道的凭据(复制用户和密码)将转移到加入成员并由其使用,它们在那里必须是有效的。因此,通过远程克隆操作接收到状态转移的所有组成员都使用相同的复制用户和密码进行分布式恢复。但是,组复制保留与SSL使用有关的通道设置,因此这些设置对于单个成员而言是唯一的。

    如果使用了一个PRIVILEGE_CHECKS_USER帐户来保护复制应用程序的安全(请参见“组复制通道的特权检查”),则从MySQL 8.0.19开始,该PRIVILEGE_CHECKS_USER帐户和来自捐助者的相关设置将被克隆到加入成员中。如果将加入成员设置为在启动时启动组复制,它将自动使用该帐户在相应的复制通道上进行特权检查。(在MySQL 8.0.18中,由于许多限制,建议您不要使用PRIVILEGE_CHECKS_USER具有组复制通道的帐户。)

    用于其他目的的克隆

    组复制启动并管理用于分布式恢复的克隆操作。设置为支持克隆的组成员也可以参与用户手动启动的克隆操作。例如,您可能希望通过从组成员作为供体进行克隆来创建新的服务器实例,但是您不希望新的服务器实例立即加入或可能永远不会加入该组。

    在所有支持克隆的发行版中,您可以手动启动涉及停止了组复制的组成员的克隆操作。请注意,由于克隆要求供体和接收方上的活动插件必须匹配,因此即使您不希望该服务器实例加入组,也必须在另一个服务器实例上安装并激活组复制插件。您可以通过发出以下语句来安装插件:

    INSTALL PLUGIN group_replication SONAME 'group_replication.so';
    

    在MySQL 8.0.20之前的版本中,如果操作涉及正在运行“组复制”的组成员,则无法手动启动克隆操作。从MySQL 8.0.20开始,只要克隆操作不会删除和替换接收者上的数据,就可以执行此操作。因此,DATA DIRECTORY如果正在运行组复制,则用于启动克隆操作的语句必须包含该子句。