【MGR】MySQL Group Replication快速开始

目录

17.2 Getting Started

17.2.1 Deploying Group Replication in Single-Primary Mode

17.2.1.1 Deploying Instances for Group Replication

17.2.1.2 Configuring an Instance for Group Replication

Storage Engines

Replication Framework

Group Replication Settings

plugin-load-add

group_replication_group_name

group_replication_start_on_boot

group_replication_local_address

group_replication_group_seeds

group_replication_bootstrap_group

17.2.1.3 User Credentials

17.2.1.4 Launching Group Replication

17.2.1.5 Bootstrapping the Group

17.2.1.6 Adding Instances to the Group

17.2.1.6.1 Adding a Second Instance

17.2.1.6.2 Adding Additional Instances


17.2 Getting Started

MySQL Group Replication作为MySQL服务器的插件提供;组中的每个服务器都需要配置和安装该插件。本节提供了一个详细的教程,介绍了创建至少三个成员的复制组所需的步骤。

提示

部署多个MySQL实例的另一种方法是使用InnoDB Cluster,它使用Group Replication并将其封装在一个编程环境中,使您可以在MySQL Shell 8.0中轻松处理MySQL服务器实例组。此外,InnoDB Cluster与MySQL Router无缝交互,并简化了具有高可用性的MySQL部署。请参阅MySQL AdminAPI。

17.2.1 Deploying Group Replication in Single-Primary Mode

在一个组中,每个MySQL服务器实例都可以在独立的物理主机上运行,这是部署Group Replication的推荐方式。本节将介绍如何创建一个由三个MySQL服务器实例组成的复制组,每个实例运行在不同的主机上。有关在同一台主机上部署运行Group Replication的多个MySQL服务器实例的信息,请参阅第17.2.2节,“本地部署Group Replication”。例如,用于测试目的。

Figure 17.4 Group Architecture

这个教程将解释如何获取和部署带有Group Replication插件的MySQL服务器,如何在创建组之前配置每个服务器实例,并如何使用性能模式监视来验证一切是否正常工作。

17.2.1.1 Deploying Instances for Group Replication

第一步是部署至少三个 MySQL Server 实例,该过程演示了在多个主机上使用实例,命名为 s1、s2 和 s3。假定每个主机上都安装了 MySQL Server(请参阅第 2 章,“安装和升级 MySQL”)。Group Replication 插件随 MySQL Server 5.7.17 及更高版本一起提供;不需要额外的软件,但必须在运行的 MySQL 服务器中安装该插件。有关部署 Group Replication 实例的更多信息,请参阅第 17.2.1.1 节,“部署用于 Group Replication 的实例”;有关其他信息,请参阅第 5.5 节,“MySQL Server 插件”。

在本示例中,使用三个实例来组成组,这是创建组的最少实例数。添加更多实例会增加组的容错能力。例如,如果组由三个成员组成,在一个实例失败的情况下,组可以继续运行。但在另一个失败的情况下,组将无法继续处理写事务。通过添加更多实例,组在继续处理事务的同时可以容忍更多服务器的故障。可用于组的最大实例数为九个。有关更多信息,请参阅第 17.1.3.2 节,“故障检测”。

17.2.1.2 Configuring an Instance for Group Replication

这一部分解释了用于 Group Replication 的 MySQL Server 实例所需的配置设置。有关背景信息,请参阅第 17.3 节,“要求和限制”。

  • 存储引擎
  • 复制框架
  • Group Replication 设置
Storage Engines

对于 Group Replication,数据必须存储在 InnoDB 事务存储引擎中(有关原因的详细信息,请参阅第 17.3.1 节,“Group Replication 要求”)。使用其他存储引擎,包括临时的 MEMORY 存储引擎,可能会在 Group Replication 中引发错误。请按照以下方式设置 disabled_storage_engines 系统变量以防止它们的使用:

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

请注意,如果禁用了 MyISAM 存储引擎,则在将 MySQL 实例升级到仍然使用 mysql_upgrade 的版本(MySQL 8.0.16 之前),mysql_upgrade 可能会失败并显示错误。为了处理这个问题,在运行 mysql_upgrade 时,您可以重新启用该存储引擎,然后在重新启动服务器时将其禁用。有关更多信息,请参阅第 4.4.7 节,“mysql_upgrade — 检查和升级 MySQL 表”。

Replication Framework

以下设置根据 MySQL Group Replication 的要求配置复制。

server_id=1 # 配置服务器使用唯一标识号码 1
gtid_mode=ON # 启用GTID
enforce_gtid_consistency=ON 
master_info_repository=TABLE # 复制元数据存储在系统表中而不是文件中
relay_log_info_repository=TABLE  # 复制元数据存储在系统表中而不是文件中
binlog_checksum=NONE  # 禁用二进制日志事件校验
log_slave_updates=ON
log_bin=binlog # 服务器打开二进制日志记录
binlog_format=ROW # 使用基于行的格式

有关更多详细信息,请参阅第 17.3.1 节,“Group Replication 要求”。

Group Replication Settings

此时,选项文件确保服务器已配置,并被指示在给定配置下实例化复制基础设施。以下部分为服务器配置了 Group Replication 设置。

plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "s1:33061"
group_replication_group_seeds= "s1:33061,s2:33061,s3:33061"
group_replication_bootstrap_group=off
plugin-load-add

plugin-load-add命令将Group Replication插件添加到服务器在启动时加载的插件列表中。在生产部署中,这比手动安装插件更可取。

group_replication_group_name

配置group_replication_group_name告知插件,它正在加入或创建的组名为"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"。

group_replication_group_name的值必须是有效的UUID。此UUID在为二进制日志中的Group Replication事件设置GTID时内部使用。您可以使用SELECT UUID()生成UUID

group_replication_start_on_boot

将group_replication_start_on_boot变量配置为off会指示插件在服务器启动时不自动启动操作。这在设置Group Replication时很重要,因为它确保您可以在手动启动插件之前配置服务器。一旦成员配置好,您可以将group_replication_start_on_boot设置为on,以便在服务器引导时自动启动Group Replication。

意思是先设置为OFF,配置好之后再设置为ON

group_replication_local_address

配置group_replication_local_address设置成员用于与组中其他成员进行内部通信的网络地址和端口。Group Replication使用此地址进行涉及组通信引擎(XCom,一种Paxos变体)的远程实例的内部成员之间的连接。

重要提示
此地址必须与用于SQL的主机名和端口不同,并且不能用于客户端应用程序。它只能用于在运行Group Replication时组内成员之间的内部通信。

由group_replication_local_address配置的网络地址必须由所有组成员解析。例如,如果每个服务器实例位于具有固定网络地址的不同计算机上,您可以使用机器的IP地址,例如10.0.0.1。如果使用主机名,必须使用完全限定名称,并确保通过DNS、正确配置的/etc/hosts文件或其他名称解析进程进行解析。从MySQL 8.0.14开始,还可以使用IPv6地址(或解析为其的主机名),以及IPv4地址。一个组可以包含使用IPv6和使用IPv4的成员的混合。有关IPv6网络的Group Replication支持以及混合IPv4和IPv6组的更多信息,请参阅IPv6和混合IPv6和IPv4组的支持。

group_replication_local_address的推荐端口是33061。group_replication_local_address由Group Replication用作复制组中组成员的唯一标识符。只要主机名或IP地址不同,您就可以为所有复制组成员使用相同的端口,如本教程所示。或者,您可以为所有成员使用相同的主机名或IP地址,只要端口都不同,例如在第17.2.2节“在本地部署Group Replication”中所示。

group_replication_group_seeds

配置group_replication_group_seeds设置用于新成员建立与组的连接的组成员的主机名和端口。这些成员称为种子成员。建立连接后,组成员信息将列在performance_schema.replication_group_members中。通常,group_replication_group_seeds列表包含每个组成员的group_replication_local_address的主机名:端口,但这不是强制性的,可以选择组成员的子集作为种子。

重要提示

group_replication_group_seeds中列出的主机名:端口是种子成员的内部网络地址,由group_replication_local_address配置,而不是用于客户端连接的SQL主机名:端口,并且在performance_schema.replication_group_members表中显示。

启动组的服务器不使用此选项,因为它是初始服务器,因此负责引导组。换句话说,引导组的服务器上存在的任何现有数据都将用作下一个加入成员的数据。加入的第二个服务器询问组中唯一的成员加入,第二个服务器上缺失的任何数据都会从引导组成员的捐赠数据中复制,然后组扩展。加入的第三个服务器可以询问其中任何两个以加入,数据会与新成员同步,然后组再次扩展。加入时,后续服务器重复此过程。

警告

同时加入多个服务器时,请确保它们指向已在组中的种子成员。不要使用也正在加入组的成员作为种子,因为当联系时,它们可能尚未加入组。

最好先启动引导成员,并让它创建组。然后使其成为加入的其他成员的种子成员。这可以确保在加入其他成员时形成了一个组。

不支持同时创建组并加入多个成员。可能会起作用,但很可能会发生操作竞争,然后加入组的行为最终导致错误或超时。

group_replication_bootstrap_group

配置group_replication_bootstrap_group指示插件是否引导组。在这种情况下,即使s1是组的第一个成员,我们也将此变量设置为选项文件中的off。相反,我们在实例运行时配置group_replication_bootstrap_group,以确保只有一个成员实际引导组。

重要提示

group_replication_bootstrap_group变量必须在组中的一个服务器实例上启用,通常是第一次引导组时(或在整个组被关闭并重新启动时)。如果多次引导组,例如,当多个服务器实例具有此选项设置时,则它们可能会创建一个人工分裂脑场景,其中存在具有相同名称的两个不同组。始终在第一个服务器实例上线后设置group_replication_bootstrap_group=off。

组中所有服务器的配置非常相似。您需要更改有关每个服务器的具体信息(例如server_id、datadir、group_replication_local_address)。这在本教程的后续部分中有所说明。

17.2.1.3 User Credentials

Group Replication利用异步复制协议来实现第17.9.5节“分布式恢复”,在将其加入组之前同步组成员。分布式恢复过程依赖于一个名为group_replication_recovery的复制通道,该通道用于将事务从捐赠成员传输到加入组的成员。因此,您需要设置一个具有正确权限的复制用户,以便Group Replication可以建立直接成员之间的恢复复制通道。

启动MySQL服务器实例,然后连接到客户端。使用REPLICATION SLAVE权限创建一个MySQL用户。此过程可以在二进制日志中捕获,然后您可以依靠分布式恢复来复制用于创建用户的语句。或者,您可以使用SET SQL_LOG_BIN=0;禁用二进制日志记录,然后在每个成员上手动创建用户,例如,如果您希望避免更改传播到其他服务器实例。如果决定禁用二进制日志记录,请确保在配置用户后重新启用它。

在以下示例中,显示了用户名为rpl_user,密码为password的用户。在配置服务器时,请使用合适的用户名和密码。

mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;

如果已禁用二进制日志记录,请在创建用户后再次启用它,使用SET SQL_LOG_BIN=1;。

一旦用户已配置好,使用CHANGE MASTER TO语句配置服务器,在下一次需要从另一个成员恢复其状态时,使用给定的凭据为group_replication_recovery复制通道。执行以下操作,将rpl_user和password替换为创建用户时使用的值。

mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' \\
		      FOR CHANNEL 'group_replication_recovery';

分布式恢复是加入组的服务器采取的第一步,该服务器与组成员具有不同的事务集。如果未正确设置这些凭据以用于group_replication_recovery复制通道和如上所示的rpl_user,则服务器无法连接到捐赠成员并运行分布式恢复过程以与其他组成员同步,因此最终无法加入该组。请参阅第17.9.5节“分布式恢复”。

同样,如果服务器无法通过服务器的主机名正确识别其他成员,则恢复过程可能会失败。建议运行MySQL的操作系统具有经过正确配置的唯一主机名,可以使用DNS或本地设置。此主机名可以在performance_schema.replication_group_members表的Member_host列中进行验证。如果多个组成员将由操作系统设置的默认主机名外部化,则有可能会导致成员无法解析为正确的成员地址而无法加入该组。在这种情况下,请使用report_host为每个服务器配置一个唯一的主机名进行外部化。

17.2.1.4 Launching Group Replication

首先必须确保在服务器s1上安装了Group Replication插件。如果您在选项文件中使用了plugin_load_add='group_replication.so',那么Group Replication插件已经安装了,您可以继续下一步。否则,您必须手动安装插件;要做到这一点,请使用mysql客户端连接到服务器,并执行下面显示的SQL语句:

mysql> INSTALL PLUGIN group_replication SONAME 'group_replication.so';

 重要提示:

在加载Group Replication之前,必须存在mysql.session用户。mysql.session用户是在MySQL版本5.7.19中添加的。如果您的数据字典是使用早期版本初始化的,则必须执行MySQL升级过程(请参阅第2.10节“升级MySQL”)。如果未运行升级,则Group Replication无法启动,并显示错误消息:尝试使用用户mysql.session@localhost访问服务器时出错。确保用户存在于服务器中,并且在服务器更新后运行了mysql_upgrade。

要检查插件是否成功安装,请执行SHOW PLUGINS; 并检查输出。它应该显示类似于以下内容:

mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+----------------------+-------------+
| Name                       | Status   | Type               | Library              | License     |
+----------------------------+----------+--------------------+----------------------+-------------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL                 | PROPRIETARY |

(...)

| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | PROPRIETARY |
+----------------------------+----------+--------------------+----------------------+-------------+
17.2.1.5 Bootstrapping the Group

第一次启动组的过程称为引导。您可以使用group_replication_bootstrap_group系统变量引导组。引导应该只由单个服务器完成,即启动组的服务器,并且只执行一次。这就是为什么group_replication_bootstrap_group选项的值没有存储在实例的选项文件中。如果保存在选项文件中,服务器在重新启动时将自动用相同名称引导第二个组。这将导致具有相同名称的两个不同组。同样的推理也适用于将此选项设置为ON停止和重新启动插件。因此,为了安全地引导组,请连接到s1并执行以下操作:

mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

一旦START GROUP_REPLICATION语句返回,组就已经启动了。您可以检查组是否已经创建,并且其中有一个成员:

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE  |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| group_replication_applier | ce9be252-2b71-11e6-b8f4-00212844f856 |   s1        |       3306  | ONLINE        |
+---------------------------+--------------------------------------+-------------+-------------+---------------+

该表中的信息确认了该组中有一个成员,其唯一标识符为ce9be252-2b71-11e6-b8f4-00212844f856,它处于ONLINE状态,并且在s1上通过端口3306监听客户端连接。

为了证明服务器确实处于一个组中并且能够处理请求,创建一个表并向其中添加一些内容。

mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL);
mysql> INSERT INTO t1 VALUES (1, 'Luis');

mysql> SELECT * FROM t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+

mysql> SHOW BINLOG EVENTS;
+---------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
| Log_name      | Pos | Event_type     | Server_id | End_log_pos | Info                                                               |
+---------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+
| binlog.000001 |   4 | Format_desc    |         1 |         123 | Server ver: 5.7.44-log, Binlog ver: 4                              |
| binlog.000001 | 123 | Previous_gtids |         1 |         150 |                                                                    |
| binlog.000001 | 150 | Gtid           |         1 |         211 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1'  |
| binlog.000001 | 211 | Query          |         1 |         270 | BEGIN                                                              |
| binlog.000001 | 270 | View_change    |         1 |         369 | view_id=14724817264259180:1                                        |
| binlog.000001 | 369 | Query          |         1 |         434 | COMMIT                                                             |
| binlog.000001 | 434 | Gtid           |         1 |         495 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2'  |
| binlog.000001 | 495 | Query          |         1 |         585 | CREATE DATABASE test                                               |
| binlog.000001 | 585 | Gtid           |         1 |         646 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:3'  |
| binlog.000001 | 646 | Query          |         1 |         770 | use `test`; CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL) |
| binlog.000001 | 770 | Gtid           |         1 |         831 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:4'  |
| binlog.000001 | 831 | Query          |         1 |         899 | BEGIN                                                              |
| binlog.000001 | 899 | Table_map      |         1 |         942 | table_id: 108 (test.t1)                                            |
| binlog.000001 | 942 | Write_rows     |         1 |         984 | table_id: 108 flags: STMT_END_F                                    |
| binlog.000001 | 984 | Xid            |         1 |        1011 | COMMIT /* xid=38 */                                                |
+---------------+-----+----------------+-----------+-------------+--------------------------------------------------------------------+

如上所述,已创建数据库和表对象,并编写了它们对应的DDL语句,并将这些操作记录到二进制日志中。此外,数据已插入到表中,并记录到二进制日志中。二进制日志条目的重要性在后续部分得到了说明,当组扩展并执行分布式恢复时,新成员试图追赶并上线时。

17.2.1.6 Adding Instances to the Group

此时,该组中有一个成员,即服务器s1,在其中有一些数据。现在是时候通过添加先前配置的另外两台服务器来扩展该组了。

17.2.1.6.1 Adding a Second Instance

要添加第二个实例,即服务器s2,首先创建其配置文件。配置与用于服务器s1的配置类似,但是像server_id这样的一些项会有所不同。以下清单中突出显示了这些不同的行。

[mysqld]

#
# Disable other storage engines
#
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

#
# Replication configuration parameters
#
server_id=2
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

#
# Group Replication configuration
#
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "s2:33061"
group_replication_group_seeds= "s1:33061,s2:33061,s3:33061"
group_replication_bootstrap_group= off

与设置服务器s1的过程类似,配置文件准备就绪后,启动服务器。然后按如下配置恢复凭据。这些命令与设置服务器s1时使用的命令相同,因为用户在组内是共享的。这个成员需要在第17.2.1.3节“用户凭证”中配置相同的复制用户。如果您依赖分布式恢复来在所有成员上配置用户,则当s2连接到种子s1时,复制用户将被复制到s1。如果在配置了s1的用户凭证时没有启用二进制日志记录,则必须在s2上创建复制用户。在这种情况下,连接到s2并发出以下命令:

SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' \\
	FOR CHANNEL 'group_replication_recovery';

如有必要,安装Group Replication插件,请参阅第17.2.1.4节“启动Group Replication”。

启动Group Replication,并让s2开始加入组的过程。

mysql> START GROUP_REPLICATION;

与在s1上执行的先前步骤不同的是,在这里存在一个区别,即您无需引导该组,因为该组已经存在。换句话说,在s2上,group_replication_bootstrap_group设置为off,您在启动Group Replication之前不需要发出SET GLOBAL group_replication_bootstrap_group=ON;命令,因为组已经由服务器s1创建和引导了。此时,服务器s2只需要被添加到已经存在的组中。

提示

 当Group Replication成功启动并且服务器加入组时,它会检查super_read_only变量。通过在成员的配置文件中将super_read_only设置为ON,您可以确保在任何原因导致启动Group Replication失败时,服务器不会接受事务。如果服务器应该作为读写实例加入组,例如作为单主组中的主服务器或作为多主组的成员,则当super_read_only变量设置为ON时,加入组后会被设置为OFF。

再次检查performance_schema.replication_group_members表,现在显示该组中有两个ONLINE服务器。

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE  |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| group_replication_applier | 395409e1-6dfa-11e6-970b-00212844f856 |   s1        |        3306 | ONLINE        |
| group_replication_applier | ac39f1e6-6dfa-11e6-a69d-00212844f856 |   s2        |        3306 | ONLINE        |
+---------------------------+--------------------------------------+-------------+-------------+---------------+

当s2尝试加入组时,第17.9.5节“分布式恢复”确保s2应用了与s1应用的相同的事务。一旦这个过程完成,s2就可以作为成员加入组,并在这一点上标记为ONLINE。换句话说,它必须已经自动追赶了服务器s1。一旦s2处于ONLINE状态,它就开始与组一起处理事务。验证s2确实已经与服务器s1同步如下。

mysql> SHOW DATABASES LIKE 'test';
+-----------------+
| Database (test) |
+-----------------+
| test            |
+-----------------+

mysql> SELECT * FROM test.t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+

mysql> SHOW BINLOG EVENTS;
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| Log_name      | Pos  | Event_type     | Server_id | End_log_pos | Info                                                               |
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| binlog.000001 |    4 | Format_desc    |         2 |         123 | Server ver: 5.7.44-log, Binlog ver: 4                              |
| binlog.000001 |  123 | Previous_gtids |         2 |         150 |                                                                    |
| binlog.000001 |  150 | Gtid           |         1 |         211 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1'  |
| binlog.000001 |  211 | Query          |         1 |         270 | BEGIN                                                              |
| binlog.000001 |  270 | View_change    |         1 |         369 | view_id=14724832985483517:1                                        |
| binlog.000001 |  369 | Query          |         1 |         434 | COMMIT                                                             |
| binlog.000001 |  434 | Gtid           |         1 |         495 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2'  |
| binlog.000001 |  495 | Query          |         1 |         585 | CREATE DATABASE test                                               |
| binlog.000001 |  585 | Gtid           |         1 |         646 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:3'  |
| binlog.000001 |  646 | Query          |         1 |         770 | use `test`; CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL) |
| binlog.000001 |  770 | Gtid           |         1 |         831 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:4'  |
| binlog.000001 |  831 | Query          |         1 |         890 | BEGIN                                                              |
| binlog.000001 |  890 | Table_map      |         1 |         933 | table_id: 108 (test.t1)                                            |
| binlog.000001 |  933 | Write_rows     |         1 |         975 | table_id: 108 flags: STMT_END_F                                    |
| binlog.000001 |  975 | Xid            |         1 |        1002 | COMMIT /* xid=30 */                                                |
| binlog.000001 | 1002 | Gtid           |         1 |        1063 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:5'  |
| binlog.000001 | 1063 | Query          |         1 |        1122 | BEGIN                                                              |
| binlog.000001 | 1122 | View_change    |         1 |        1261 | view_id=14724832985483517:2                                        |
| binlog.000001 | 1261 | Query          |         1 |        1326 | COMMIT                                                             |
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+

如上所述,第二台服务器已添加到群组中,并且它已经使用分布式恢复自动地从服务器 s1 复制了更改。换句话说,在 s2 加入群组之前应用在 s1 上的交易已被复制到 s2。

17.2.1.6.2 Adding Additional Instances

将其他实例添加到群组本质上与添加第二台服务器的步骤相同,只是配置必须像对服务器 s2 那样进行更改。总结所需的命令如下

1. Create the configuration file

[mysqld]

#
# Disable other storage engines
#
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

#
# Replication configuration parameters
#
server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

#
# Group Replication configuration
#
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "s3:33061"
group_replication_group_seeds= "s1:33061,s2:33061,s3:33061"
group_replication_bootstrap_group= off

2. Start the server and connect to it. Configure the recovery credentials for the group_replication_recovery channel.

SET SQL_LOG_BIN=0;
CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
FLUSH PRIVILEGES;
SET SQL_LOG_BIN=1;
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password'  \\
FOR CHANNEL 'group_replication_recovery';

4. Install the Group Replication plugin and start it.

INSTALL PLUGIN group_replication SONAME 'group_replication.so';
START GROUP_REPLICATION;

此时,服务器 s3 已启动并正在运行,已加入群组,并已与群组中的其他服务器同步。再次查询 performance_schema.replication_group_members 表可以确认这一点。

mysql> SELECT * FROM performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE  |
+---------------------------+--------------------------------------+-------------+-------------+---------------+
| group_replication_applier | 395409e1-6dfa-11e6-970b-00212844f856 |   s1        |       3306  | ONLINE        |
| group_replication_applier | 7eb217ff-6df3-11e6-966c-00212844f856 |   s3        |       3306  | ONLINE        |
| group_replication_applier | ac39f1e6-6dfa-11e6-a69d-00212844f856 |   s2        |       3306  | ONLINE        |
+---------------------------+--------------------------------------+-------------+-------------+---------------+

在服务器 s2 或服务器 s1 上发出相同的查询会产生相同的结果。此外,您可以验证服务器 s3 已经追赶上来:

mysql> SHOW DATABASES LIKE 'test';
+-----------------+
| Database (test) |
+-----------------+
| test            |
+-----------------+

mysql> SELECT * FROM test.t1;
+----+------+
| c1 | c2   |
+----+------+
|  1 | Luis |
+----+------+

mysql> SHOW BINLOG EVENTS;
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| Log_name      | Pos  | Event_type     | Server_id | End_log_pos | Info                                                               |
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+
| binlog.000001 |    4 | Format_desc    |         3 |         123 | Server ver: 5.7.44-log, Binlog ver: 4                              |
| binlog.000001 |  123 | Previous_gtids |         3 |         150 |                                                                    |
| binlog.000001 |  150 | Gtid           |         1 |         211 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1'  |
| binlog.000001 |  211 | Query          |         1 |         270 | BEGIN                                                              |
| binlog.000001 |  270 | View_change    |         1 |         369 | view_id=14724832985483517:1                                        |
| binlog.000001 |  369 | Query          |         1 |         434 | COMMIT                                                             |
| binlog.000001 |  434 | Gtid           |         1 |         495 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:2'  |
| binlog.000001 |  495 | Query          |         1 |         585 | CREATE DATABASE test                                               |
| binlog.000001 |  585 | Gtid           |         1 |         646 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:3'  |
| binlog.000001 |  646 | Query          |         1 |         770 | use `test`; CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 TEXT NOT NULL) |
| binlog.000001 |  770 | Gtid           |         1 |         831 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:4'  |
| binlog.000001 |  831 | Query          |         1 |         890 | BEGIN                                                              |
| binlog.000001 |  890 | Table_map      |         1 |         933 | table_id: 108 (test.t1)                                            |
| binlog.000001 |  933 | Write_rows     |         1 |         975 | table_id: 108 flags: STMT_END_F                                    |
| binlog.000001 |  975 | Xid            |         1 |        1002 | COMMIT /* xid=29 */                                                |
| binlog.000001 | 1002 | Gtid           |         1 |        1063 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:5'  |
| binlog.000001 | 1063 | Query          |         1 |        1122 | BEGIN                                                              |
| binlog.000001 | 1122 | View_change    |         1 |        1261 | view_id=14724832985483517:2                                        |
| binlog.000001 | 1261 | Query          |         1 |        1326 | COMMIT                                                             |
| binlog.000001 | 1326 | Gtid           |         1 |        1387 | SET @@SESSION.GTID_NEXT= 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:6'  |
| binlog.000001 | 1387 | Query          |         1 |        1446 | BEGIN                                                              |
| binlog.000001 | 1446 | View_change    |         1 |        1585 | view_id=14724832985483517:3                                        |
| binlog.000001 | 1585 | Query          |         1 |        1650 | COMMIT                                                             |
+---------------+------+----------------+-----------+-------------+--------------------------------------------------------------------+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/428686.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【好书推荐-第七期】《RTC程序设计:实时音视频权威指南》(音视频开发必看!)

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:洲与AI。 🎈 本文专栏:本文收录…

物联网边缘计算云边协同

文章目录 一、物联网云边协同1.IoT云边协同设计2.物联网平台设计3.物联网平台实现 二、部署环境1.节点配置2.版本信息 三、IoT云边协同部署1.部署Kubernetes集群2.部署KubeEdge3.部署ThingsBoard集群4.部署Node-RED边缘网关4.1.边缘网关功能4.2.部署EMQX4.2.部署Node-RED 5.配置…

【sgCollapseBtn】自定义组件:底部折叠/展开按钮

特性&#xff1a; 支持自定义折叠状态支持自定义标签名称 sgCollapseBtn源码 <template><div :class"$options.name" click"show !show" :placement"placement"><div class"collapse-btns"><div class"c…

YOLOv9独家原创改进|加入幽灵卷积Ghost Convolution模块,轻量化!

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、论文摘要 由于内存和计算资源有限&#xff0c;在嵌入式设备上部署卷积神经网络是困难的。特征图中的冗余是那些成功的细胞神经网络的一个重要特征…

Linux基础命令[10]-cmp

文章目录 1. cmp 命令说明2. cmp 命令语法3. cmp 命令示例3.1 不加参数3.2 -b&#xff08;显示不同的字节&#xff09;3.3 -i&#xff08;跳过字节&#xff09;3.4 -l&#xff08;显示所有不同&#xff09;3.5 -n&#xff08;比较n个字节&#xff09;3.6 -s&#xff08;不显示信…

深圳牵头打造鸿蒙原生应用软件生态 | 百能云芯

深圳市工业和信息化局、深圳市政务服务和数据管理局于3月3日联合印发了《深圳市支持开源鸿蒙原生应用发展2024年行动计划》。这一计划旨在通过政策引导、市场推动、社会协同的方式&#xff0c;将深圳打造成一个鸿蒙原生应用软件生态的中心&#xff0c;推动鸿蒙系统在当地的发展…

Spring Boot2.2.4版本启动项目时,访问登录接口显示页面不存在

问题触发场景&#xff1a;IDEA 2023.3.4 SpringBoot 2.2.4 上面4张图片分别是项目结构、Spring Boot启动配置、SpringMVC配置和页面展示在项目中存放的位置&#xff0c;表面上看上去没有太大问题&#xff0c;项目应该会达到预期结果&#xff0c;但是bug总是在不经意间出现&…

HarmonyOS端云体化开发—创建端云一体化开发工程

云开发工程模板 DevEco Studio目前提供了两种云开发工程模板&#xff1a;通用云开发模板和商城模板。您可根据工程向导轻松创建端云一体化开发工程&#xff0c;并自动生成对应的代码和资源模板。在创建端云一体化开发工程前&#xff0c;请提前了解云开发工程模板的相关信息。 …

基于 Vue3打造前台+中台通用提效解决方案(下)

47、通用组件 - 倒计时组件 特惠部分存在一个倒计时的功能,所以我们需要先处理对应的倒计时模块,并把它处理成一个通用组件。 那么对于倒计时模块我们又应该如何进行处理呢? 所谓倒计时,其实更多的是一个时间的处理,那么对于时间的处理,此时我们就需要使用到一个第三方…

Kubernetes(k8s第一部分)

这个技术一定会成为以后企业技术的标准 尙硅谷的王阳这个部分这个讲的特别好&#xff0c;可以自己去看 1&#xff0c;发展经历 阿里云iaas Infrastructure as a Service 平台及服务paas新浪云 platform as a service(号称免运维)&#xff08;docker是下一代的标准&#x…

Docker镜像操作介绍

一、镜像操作 镜像的操作可分为&#xff1a; 拉取镜像&#xff1a;拉取远程仓库的镜像到本地 docker pull重命名镜像&#xff1a;使用docker tag 命令重命名镜像查看镜像&#xff1a;使用docker image ls 或者 docker images命令查看本地已经存在的镜像删除镜像&#xff1a;删…

IP-guard邮件管控再升级,记录屏幕画面,智能阻断泄密邮件

邮件是工作沟通以及文件传输的重要工具,却也成为了信息泄露的常见渠道。员工通过邮件对外发送了什么内容,是否含有敏感信息都无从得知,机密通过邮件渠道外泄也难以制止。想要防止企业的重要信息通过邮件方式泄露,我们不仅需要通过技术措施对外发邮件的行为进行规范,也要对…

(学习日记)2024.03.01:UCOSIII第三节 + 函数指针 (持续更新文件结构)

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Oracle定时任务和存储过程

--1.声明定时任务 DECLAREjob NUMBER; BIGIN dbms_job.sumit(job, --任务ID,系统定义的test_prcedure(19)&#xff0c;--调用存储过程&#xff1f;to_date(20240305 02:00&#xff0c;yyyymmdd hh24:mi) --任务开始时间sysdate1/(24*60) --任务执行周期 [每分钟执行…

ROS 2基础概念#3:主题(Topic)| ROS 2学习笔记

在ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;主题&#xff08;Topics&#xff09;是实现节点之间通信的主要机制之一。节点&#xff08;Node&#xff09;可以发布&#xff08;publish&#xff09;消息到话题&#xff0c;或者订阅&#xff08;subscribe&…

k8s 1.28.x node资源预留

当前NOde的配置 默认位置如下: vim /var/lib/kubelet/config.yaml #再最后添加如下&#xff0c;参加应该大家一看就明白什么意思&#xff0c;不做多解释了 #max-pods: 230 evictionHard:memory.available: 100Minodefs.available: 10%nodefs.inodesFree: 5% kubeReserved:cpu:…

centos7升级openssl_3

1、查看当前openssl版本 openssl version #一般都是1.几的版本2、下载openssl_3的包 wget --no-check-certificate https://www.openssl.org/source/old/3.0/openssl-3.0.3.tar.gz#解压 tar zxf openssl-3.0.3.tar.gz#进入指定的目录 cd openssl-3.0.33、编译安装遇到问题缺…

C++ 之LeetCode刷题记录(三十七)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 目标&#xff1a;执行用时击败90%以上使用 C 的用户。 17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表…

MSCKF5讲:后端代码分析

MSCKF5讲&#xff1a;后端代码分析 文章目录 MSCKF5讲&#xff1a;后端代码分析1 初始化initialize()1.1 加载参数1.2 初始化IMU连续噪声协方差矩阵1.3 卡方检验1.4 接收与订阅话题createRosIO() 2 IMU静止初始化3 重置resetCallback()4 featureCallback4.1 IMU初始化判断4.2 I…

其他组件分析

对于数据大屏&#xff0c;基于网络安全大赛来看的话主要有 团队队伍的分析界面&#xff1a;分为两类&#xff1a; 一类是对队伍的解题所考虑的知识点画一个5星图&#xff0c;每个方面占一角&#xff0c;可以更直观看到队伍的擅长方面&#xff1a;&#xff08;这部分可能用不到…