组复制旨在确保数据库服务持续可用,即使构成组的某些服务器当前由于计划维护或意外问题而无法参与其中。只要剩余成员占组的多数,它们就可以选举一个新的主服务器并继续作为组运行。但是,如果复制组的每个成员都离开组,并且每个成员上的组复制都通过 STOP GROUP_REPLICATION
语句或系统关闭而停止,则该组现在实际上只存在于理论上,作为成员上的配置。在这种情况下,要重新创建该组,必须像第一次启动一样通过引导来启动它。
首次引导组与第二次或后续次引导组之间的区别在于,在后一种情况下,已关闭的组的成员可能具有彼此不同的事务集,具体取决于它们停止或失败的顺序。如果成员具有其他组成员上不存在的事务,则该成员无法加入组。对于组复制,这包括已提交和应用的事务(位于 gtid_executed
GTID 集中)以及已认证但尚未应用的事务(位于 group_replication_applier
通道中)。事务提交的确切时间点取决于为组设置的事务一致性级别(请参阅 第 20.5.3 节,“事务一致性保证”)。但是,组复制组成员从不删除已认证的事务,这是一个成员打算提交事务的声明。
因此,必须从最新的成员开始重启复制组,即执行和认证的事务最多的成员。然后,事务较少的成员可以加入并通过分布式恢复来赶上它们缺少的事务。不能假设组的最后一个已知主服务器是组中最新的成员,因为比主服务器晚关闭的成员可能具有更多事务。因此,您必须重启每个成员以检查事务,比较所有事务集,并确定最新的成员。然后,可以使用此成员来引导组。
请按照以下步骤安全地重启每个成员都关闭后的复制组。
依次对每个组成员(以任何顺序)执行以下操作
将客户端连接到组成员。如果组复制尚未停止,请发出
STOP GROUP_REPLICATION
语句,并等待组复制停止。编辑 MySQL 服务器配置文件(在 Linux 和 Unix 系统上通常名为
my.cnf
,在 Windows 系统上通常名为my.ini
),并将系统变量group_replication_start_on_boot=OFF
设置为OFF
。此设置会阻止 MySQL 服务器启动时启动组复制,这是默认设置。如果无法在系统上更改此设置,则可以简单地允许服务器尝试启动组复制,这将失败,因为组已完全关闭且尚未引导。如果采用此方法,请勿在此阶段将
group_replication_bootstrap_group=ON
设置为ON
。启动 MySQL 服务器实例,并验证组复制是否尚未启动(或启动失败)。在此阶段不要启动组复制。
从组成员收集以下信息
gtid_executed
GTID 集的内容。可以通过发出以下语句来获取此内容mysql> SELECT @@GLOBAL.GTID_EXECUTED
group_replication_applier
通道上的已认证事务集。可以通过发出以下语句来获取此内容mysql> SELECT received_transaction_set FROM \ performance_schema.replication_connection_status WHERE \ channel_name="group_replication_applier";
收集到所有组成员的事务集后,请比较它们以查找总体事务集最大的成员,包括已执行的事务 (
gtid_executed
) 和已认证的事务(在group_replication_applier
通道上)。您可以通过手动查看 GTID 来执行此操作,或者可以使用存储函数比较 GTID 集,如 第 19.1.3.8 节,“用于操作 GTID 的存储函数示例” 中所述。使用事务集最大的成员来引导组,方法是将客户端连接到组成员并发出以下语句
mysql> SET GLOBAL group_replication_bootstrap_group=ON; mysql> START GROUP_REPLICATION; mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
不要将设置
group_replication_bootstrap_group=ON
存储在配置文件中非常重要,否则,当再次重启服务器时,会设置具有相同名称的第二个组。要验证该组现在是否存在于引导它的成员中,请在引导该组的成员上发出以下语句
mysql> SELECT * FROM performance_schema.replication_group_members;
通过在每个成员上发出
START GROUP_REPLICATION
语句,将其他每个成员添加回组(以任何顺序)mysql> START GROUP_REPLICATION;
要验证每个成员是否已加入组,请在任何成员上发出以下语句
mysql> SELECT * FROM performance_schema.replication_group_members;
当成员重新加入组后,如果您编辑了它们的配置文件以设置
group_replication_start_on_boot=OFF
,您可以再次编辑它们以设置ON
(或者删除系统变量,因为ON
是默认值)。