组复制旨在确保数据库服务连续可用,即使组中的某些服务器由于计划维护或意外问题无法参与组。只要剩余成员达到组的多数,他们可以选举新的主服务器并继续作为组运作。然而,如果组中的每个成员都离开组,并且在每个成员上停止组复制,或者系统关闭,那么组现在只存在于理论上,即成员上的配置。在那种情况下,为了重新创建组,必须像第一次启动一样引导它。
第一次引导组和第二次或后续引导组之间的区别在于,后一种情况下,组成员可能具有不同的交易集,取决于它们停止或失败的顺序。成员不能加入组,如果它具有其他组成员不存在的交易。对于组复制,这包括已经提交和应用的交易,这些交易在 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
。 -
启动 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
通道上)。您可以手动地通过查看 GTIDs 来做到这一点,或者使用存储函数来比较 GTID 集,如 第 19.1.3.8 节,“存储函数示例来操作 GTIDs” 中所述。 -
使用拥有最大的事务集的成员来引导组,通过连接客户端到组成员并发出以下语句:
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
是默认值)。