如何在 Ubuntu 20.04 上配置 MySQL 组复制

介绍

MySQL 复制可靠地反映了从一个数据库到另一个数据库的数据和操作。 传统复制涉及一个配置为接受数据库写作操作的主要服务器,其次服务器将从主服务器的日志复制和应用操作到自己的数据集。

团体复制是实施更灵活,更能容错的复制机制的一种方式. 这一过程涉及建立一套服务器,每个服务器都参与确保正确复制数据。 如果主服务器遇到问题,成员选举可以从组中选择一个新的主服务器. 这使得剩余的节点即使在面临问题的情况下也能继续运行. 通过实施Paxos共识算法,提供会员谈判、故障检测和消息发送.

在本教程中,您将使用三组Ubuntu 20.04服务器设置MySQL组复制。 请注意,三个是您需要在MySQL中部署组复制的MySQL实例的最小数目,而九个是最大数目。

<美元 > [注] ** 注:数据库服务器在复制设置中可以有两个角色之一:它们可以是:primary example(也叫:source_example_example),用户可以向它写数据;也可以是:replica(或:second sample),将所有数据的副本存储在源上. 历史上,这些角色被分别称为"主案例"和"奴隶案例". MySQL团队在2020年7月发表的一则博客文章中承认这一名词的负面来源,并宣布他们努力更新数据库程序及其文档,以使用更具包容性的语言.

尽管MySQL的文档和该程序版本8中的许多命令已被更新,以代替将复制 topology中的服务器称为 primary 和其 secondaries (或 source 和其 replicas),但仍然存在负面术语的地方。

前提条件

要完成本指南,您将需要:

  • 联合国 三台服务器运行于Ubuntu 20.04. 每个用户应有一个具有 " sudo " 权限的非根本行政用户和一个装有UFW的防火墙。 遵循我们的初始服务器设置指南为Ubuntu 20.04设置每个服务器.
  • MySQL 安装在每个服务器上. 本指南假定您正在使用默认的Ubuntu寄存器中可用的最新版本MySQL,截至此书写时为8.0.28版本. 要在您的所有服务器上安装此功能, 请遵循我们的指南 : [如何在 Ubuntu 20. 04 上安装 MySQL (https://andsky.com/tech/tutorials/how-to-install-mysql-on-ubuntu-20-04 ) 。 .

为了让事情变得清晰,本指南将把三个服务器称为 member1 , ** member2** 和 ** member3** ,在整个指南中的示例中,这些成员将有以下IP地址:

MemberIP address
member1203.0.113.1
member2203.0.113.2
member3203.0.113.3

任何必须在 member1 上运行的命令都将具有蓝色背景,如下:

1[environment second]

同样,必须在 member2 上运行的任何命令都将具有红色背景:

1[environment third]

任何必须在 member3 上运行的命令都将具有绿色背景:

1[environment fourth]

最后,任何必须在三个服务器中运行的命令都将具有标准背景:

步骤 1 — 生成 UUID 来识别 MySQL 组

在打开 MySQL 配置文件以配置组复制设置之前,您需要生成一个 UUID,您可以使用它来识别您要创建的 MySQL 组。

member1 上,使用uuidgen命令生成该组的有效 UUID:

1[environment second]
2uuidgen
1[secondary_label Output]
2[environment second]
3168dcb64-7cce-473a-b338-6501f305e561

复制您收到的值,因为您在为您的服务器集群配置组名称时必须在某个时刻引用此值。

步骤 2 — 在 MySQL 配置文件中设置组复制

现在你已经准备好修改MySQL的配置文件了,在每个MySQL服务器上打开主MySQL配置文件,使用你喜欢的文本编辑器。

1sudo nano /etc/mysql/my.cnf

在Ubuntu上,MySQL配备了许多不同的文件,您可以用来定义各种配置更改。默认情况下,‘my.cnf’文件只用于从子目录中添加额外的文件。

要开始,请添加一个`[mysqld]' 标题来开始新的一节,然后添加您需要的设置,以便实现组复制,如下例所突出显示的。 注意这些设置是从[官方 MySQL 文件] (https://dev.mysql.com/doc/refman/8.0/en/group-replication-configuring-instances.html)中概述的组复制所需的最小设置来修改的. " loose- " 前缀允许MySQL处理它不优雅和不失败地承认的选项。 ** 您需要很快填写并定制其中一些设置** :

 1[label /etc/mysql/my.cnf]
 2. . .
 3!includedir /etc/mysql/conf.d/
 4!includedir /etc/mysql/mysql.conf.d/
 5
 6[mysqld]
 7
 8# General replication settings
 9disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
10gtid_mode = ON
11enforce_gtid_consistency = ON
12master_info_repository = TABLE
13relay_log_info_repository = TABLE
14binlog_checksum = NONE
15log_slave_updates = ON
16log_bin = binlog
17binlog_format = ROW
18transaction_write_set_extraction = XXHASH64
19loose-group_replication_bootstrap_group = OFF
20loose-group_replication_start_on_boot = OFF
21loose-group_replication_ssl_mode = REQUIRED
22loose-group_replication_recovery_use_ssl = 1
23
24# Shared replication group configuration
25loose-group_replication_group_name = ""
26loose-group_replication_ip_whitelist = ""
27loose-group_replication_group_seeds = ""
28
29# Single or Multi-primary mode? Uncomment these two lines
30# for multi-primary mode, where any host can accept writes
31#loose-group_replication_single_primary_mode = OFF
32#loose-group_replication_enforce_update_everywhere_checks = ON
33
34# Host specific replication configuration
35server_id = 
36bind-address = ""
37report_host = ""
38loose-group_replication_local_address = ""

为了更清楚地解释所有这些配置选项,这些选项已分为以下子部分,请仔细阅读,因为有些部分为您提供有关如何部署复制组的选择,或者要求您输入特定于您的配置的详细信息。

Boilerplate 组复制设置

第一个部分包含不需要修改的组复制所需的一般设置:

 1[label /etc/mysql/my.cnf]
 2. . .
 3# General replication settings
 4disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
 5gtid_mode = ON
 6enforce_gtid_consistency = ON
 7master_info_repository = TABLE
 8relay_log_info_repository = TABLE
 9binlog_checksum = NONE
10log_slave_updates = ON
11log_bin = binlog
12binlog_format = ROW
13transaction_write_set_extraction = XXHASH64
14loose-group_replication_bootstrap_group = OFF
15loose-group_replication_start_on_boot = OFF
16loose-group_replication_ssl_mode = REQUIRED
17loose-group_replication_recovery_use_ssl = 1
18. . .

MySQL 中的组复制的一个特殊要求是数据必须存储在 InnoDB 存储引擎中. MySQL 文档明确建议禁用可能导致错误的其他存储引擎,就像本节中第一个未评论的行一样。

剩余的设置启用全球交易ID,配置组复制所需的二进制日志,并为组配置SSL。 此配置还设置了一些其他项目,有助于恢复和启动。

共享组复制设置

第二部分为该组设置共享设置. 您必须一次定制此设置,然后在每个节点上使用相同的设置. 具体来说,您必须添加该组的 UUID(您在上一步创建的),授权组成员列表,以及与您联系的种子成员,以获取加入组时的初始数据。

loose-group_replication_group_name设置为您之前使用uuidgen命令生成的 UUID 值。

接下来,将loose-group_replication_ip_whitelist设置为您的 MySQL 服务器所有 IP 地址的列表,分开为条纹。loose-group_replication_group_seeds设置应该与白名单几乎相同,但应将指定组复制端口附加到每个成员的末端。

1[label /etc/mysql/my.cnf]
2. . .
3# Shared replication group configuration
4loose-group_replication_group_name = "168dcb64-7cce-473a-b338-6501f305e561"
5loose-group_replication_ip_whitelist = "203.0.113.1,203.0.113.2,203.0.113.3"
6loose-group_replication_group_seeds = ""203.0.113.1:33061,203.0.113.2:33061,203.0.113.3:33061"
7. . .

这个部分应该在每个MySQL服务器上都是一样的,所以一定要仔细地将其复制到每个服务器上。

选择单一或多重初级

接下来,您需要决定是否要配置一个 single-primarymulti-primary 组. 在一个单一的初级配置中,MySQL指定一个单一的初级服务器(几乎总是第一组成员)来处理写作操作。

如果您想配置多元主组,请删除loose-group_replication_single_primary_modeloose-group_replication_enforce_update_everywhere_checks指令,从而创建一个多元主组。

1[label /etc/mysql/my.cnf]
2. . .
3# Single or Multi-primary mode? Uncomment these two lines
4# for multi-primary mode, where any host can accept writes
5#loose-group_replication_single_primary_mode = OFF
6#loose-group_replication_enforce_update_everywhere_checks = ON
7. . .

**这些设置必须在您的每个MySQL服务器上相同。

您可以稍后更改此设置,但在这样做之后,您必须重新启动您的MySQL组的每个成员。 要更改到新配置,您将不得不停止组中的每个MySQL实例,开始每个成员使用新设置,然后重新启动组复制。

主机特定的配置设置

第四部分包含在每个服务器上不同的设置,包括:

  • 服务器ID * 连接的地址 * 向其他会员报告的地址 * 本地复制地址和收听端口

server_id ' 指令必须设置为独有的编号。 对于第一位成员,将此设定为1'并增加每个新增东道主的编号。 将bind-addressreport_host设置到服务器的 IP 地址,使 MySQL 实例能够听到外部连接,并将其地址正确报告给其他主机。 还应当将loose-group_replation_local_address设置在目前的服务器的IP地址上,并附带IP地址的组复制端口(`33061').

举个例子,以下是 member1 使用其样本 IP 地址的配置部分:

1[label /etc/mysql/my.cnf]
2[environment second]
3. . .
4# Host specific replication configuration
5server_id = 1
6bind-address = "203.0.113.1"
7report_host = "203.0.113.1"
8loose-group_replication_local_address = "203.0.113.1:33061"

在您的每个MySQL服务器上完成此过程. 以下是 member2 的配置:

1[label /etc/mysql/my.cnf]
2[environment third]
3. . .
4# Host specific replication configuration
5server_id = 2
6bind-address = "203.0.113.2"
7report_host = "203.0.113.2"
8loose-group_replication_local_address = "203.0.113.2:33061"

以下是 member3 的配置:

1[label /etc/mysql/my.cnf]
2[environment fourth]
3. . .
4# Host specific replication configuration
5server_id = 3
6bind-address = "203.0.113.3"
7report_host = "203.0.113.3"
8loose-group_replication_local_address = "203.0.113.3:33061"

** 请确保将每个突出的 IP 地址更新到您正在编辑的配置服务器的 IP 地址。

完成后,双重检查共享复制设置在每个主机上是相同的,并且每个主机的特定设置是自定义的. 完成后,在每个主机上保存并关闭文件. 如果您使用nano来编辑文件,则可以按CTRL + X,Y,然后按ENTER

每个服务器的 MySQL 配置文件现在都包含启动 MySQL 组复制所需的指令. 若要将新设置应用到 MySQL 实例中,请使用以下命令在 ** 每个服务器上重新启动服务:

1sudo systemctl restart mysql

通过此,您可以通过更新每个服务器的防火墙规则来启用远程访问。

步骤 3 — 更新每个服务器的 UFW 规则

假设您遵循了 初始服务器设置指南的先决条件,您将在您安装MySQL的每个服务器上设置防火墙,并允许访问OpenSSH UFW配置文件,这是一个重要的安全措施,因为这些防火墙目前阻止了您服务器上的任何端口的连接,而ssh连接会显示与每个服务器的授权_keys文件中的密钥相一致的密钥。

在MySQL配置文件中,您将服务配置为在默认端口3306上收听外部连接,您还将33061定义为成员应用于复制协调的端口。

** 在您的每个会员服务器上** ,您需要为该组中的其他会员打开两个端口,以便他们可以彼此通信。

1[environment second]
2sudo ufw allow from member2_server_ip to any port 3306
3sudo ufw allow from member2_server_ip to any port 33061

请确保更改member2_server_ip以反映您的 member2 服务器的实际IP地址,然后,为 ** member3** 打开相同的端口,运行以下命令:

1[environment second]
2sudo ufw allow from member3_server_ip to any port 3306
3sudo ufw allow from member3_server_ip to any port 33061

接下来,更新您的其他两个服务器的防火墙规则,在 member2 上运行以下命令,确保更改 IP 地址以反映 ** member1** 和 ** member3** 的地址:

1[environment third]
2sudo ufw allow from member1_server_ip to any port 3306
3sudo ufw allow from member1_server_ip to any port 33061
4sudo ufw allow from member3_server_ip to any port 3306
5sudo ufw allow from member3_server_ip to any port 33061

最后,在 member3 上运行这两个命令. 再次,请确保为每个服务器输入正确的IP地址:

1[environment fourth]
2sudo ufw allow from member1_server_ip to any port 3306
3sudo ufw allow from member1_server_ip to any port 33061
4sudo ufw allow from member2_server_ip to any port 3306
5sudo ufw allow from member2_server_ip to any port 33061

添加这些 UFW 规则后,您的三个 MySQL 实例将被允许访问其他两个服务器上使用的 MySQL 端口。

随着访问 MySQL 端口的开放,您现在可以创建复制用户并启用组复制插件。

步骤4:配置复制用户并启用组复制插件

为了与复制组中的其他服务器建立连接,每个MySQL实例必须有一个专用复制用户。

在您的每一个MySQL服务器上,与管理用户登录您的MySQL实例,以启动交互式会话:

1sudo mysql

<$>[注] :请确保在每个MySQL实例上运行本节中的每个命令。

由于每个服务器将有自己的复制用户,您需要在创建过程中关闭二进制日志。否则,一旦复制开始,该组将尝试将复制用户从主服务器传播到其他服务器,从而与已经存在的复制用户发生冲突。

1SET SQL_LOG_BIN=0;

现在你可以运行一个CREATE USER声明来创建你的复制用户. 运行以下命令,创建一个名为repl的用户。 此命令规定复制用户必须使用SSL进行连接。

1CREATE USER 'repl'@'%' IDENTIFIED BY 'password' REQUIRE SSL;

接下来,在服务器上授予新用户复制权限:

1GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

然后清除特权来执行更改:

1FLUSH PRIVILEGES;

接下来,重新启用二进制日志以恢复正常操作:

1SET SQL_LOG_BIN=1;

接下来,设置group_replication_recovery频道以使用您的新复制用户及其相关密码,然后每个服务器将使用这些身份验证来验证组:

1CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

注意:如果您使用的是早于 8.0.23 的 MySQL 版本,则需要使用 MySQL 传统语法来设置此功能:

1CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';

美元

有了复制用户,您可以启用group_replication插件来准备初始化组:

1INSTALL PLUGIN group_replication SONAME 'group_replication.so';

通过运行以下命令来验证插件是否活跃:

1SHOW PLUGINS;

group_replication插件将出现在列表的底部,因为它是最近添加的插件:

 1[secondary_label Output]
 2+----------------------------+----------+--------------------+----------------------+---------+
 3| Name                       | Status   | Type               | Library              | License |
 4+----------------------------+----------+--------------------+----------------------+---------+
 5|                            |          |                    |                      |         |
 6| . . .                      | . . .    | . . .              | . . .                | . . .   |
 7|                            |          |                    |                      |         |
 8| group_replication          | ACTIVE   | GROUP REPLICATION  | group_replication.so | GPL     |
 9+----------------------------+----------+--------------------+----------------------+---------+
1045 rows in set (0.00 sec)

此输出确认插件已加载并目前处于活跃状态. 在继续到下一步之前,请确保您在每一个MySQL实例上运行本节中的每个命令。

步骤5 - 开始组复制

现在每个MySQL服务器都配置了复制用户并启用了群组复制插件,您可以开始创建您的群组。

启动第一个节点

要启动组,请在 ** 组的单个成员 ** 上完成下列步骤。

组成员依赖现有成员发送复制数据、最新的会员列表和其他信息,当他们最初加入该组. 因此,您需要使用略有不同的程序来启动最初的组成员,以便该成员知道不要从其种子列表中的其他成员中期望此信息。

如果设置,则group_replication_bootstrap_group变量告诉会员不应该期望收到同行信息,而应该建立一个新组并自行选择主要会员。

1[environment second]
2SET GLOBAL group_replication_bootstrap_group=ON;

然后,您可以开始对初始组成员的复制:

1[environment second]
2START GROUP_REPLICATION;

然后,您可以将group_replication_bootstrap_group变量重新设置为OFF,因为唯一适当的情况是没有现有组成员:

1[environment second]
2SET GLOBAL group_replication_bootstrap_group=OFF;

该组将以该服务器作为唯一的成员启动,请通过在performance_schema数据库中的replication_group_members表中的条目来验证:

1[environment second]
2SELECT * FROM performance_schema.replication_group_members;

此查询将返回代表当前主机的单行:

1[secondary_label Output]
2[environment second]
3+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
4| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
5+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
6| group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1  |        3306 | ONLINE       | PRIMARY     | 8.0.28         | XCom                       |
7+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
81 row in set (0.00 sec)

ONLINE值为MEMBER_STATE表示该节点在组内完全运行。

然后创建一个测试数据库和表,其中包含一些样本数据. 一旦添加到该组的更多成员,这些数据将自动复制到他们。

首先,创建一个名为游乐场的样本数据库:

1[environment second]
2CREATE DATABASE playground;

接下来,用以下命令在游乐场数据库中创建一个名为设备的示例表:

1[environment second]
2CREATE TABLE playground.equipment ( 
3id INT NOT NULL AUTO_INCREMENT,
4type VARCHAR(50),
5quant INT,
6color VARCHAR(25),
7PRIMARY KEY(id)
8);

本表包含以下四个列:

  • id:此列将包含自动增加的整数值,这意味着您在加载表中示例数据时不必为此列指定值 * 类型:此列将包含描述行代表哪种类型的游乐场设备的字符串值 * 量子:此列将包含代表特定类型的游乐场设备的数量的整数值 * 颜色:此列将包含指定的设备颜色的字符串值。

另外,请注意,id列被指定为此表的主要密钥,在MySQL中,每个复制到组的表必须有一个列被指定为该表的主要密钥。

最后,运行以下命令将一行数据插入表中:

1[environment second]
2INSERT INTO playground.equipment (type, quant, color) VALUES ("slide", 2, "blue");

查询表以确保数据正确输入:

1[environment second]
2SELECT * FROM playground.equipment;
1[secondary_label Output]
2[environment second]
3+----+-------+-------+-------+
4| id | type  | quant | color |
5+----+-------+-------+-------+
6|  1 | slide |     2 | blue  |
7+----+-------+-------+-------+
81 row in set (0.00 sec)

验证该服务器是组成员并具有写作功能后,其他服务器可以加入该组。

启动剩余节点

接下来,开始组复制在 member2 . 由于您已经有一个活跃的会员,您不需要启动该组,该会员可以立即加入:

1[environment third]
2START GROUP_REPLICATION;

member3 中,以相同的方式开始组复制:

1[environment fourth]
2START GROUP_REPLICATION;

在任何三個伺服器上再次檢查會員名單,這次將有三個伺服器列出:

1[environment third]
2SELECT * FROM performance_schema.replication_group_members;
 1[environment third]
 2[secondary_label Output]
 3
 4+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
 5| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST   | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
 6+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
 7| group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1  |        3306 | ONLINE       | PRIMARY     | 8.0.28         | XCom                       |
 8| group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2  |        3306 | ONLINE       | SECONDARY   | 8.0.28         | XCom                       |
 9| group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3  |        3306 | ONLINE       | SECONDARY   | 8.0.28         | XCom                       |
10+---------------------------+--------------------------------------+---------------+-------------+--------------+-------------+----------------+----------------------------+
113 rows in set (0.00 sec)

所有会员都应该有MEMBER_STATE值为ONLINE。对于一个新的组,如果任何节点被列为RECOVERING超过几秒钟,则通常表明出现了错误或某些错误的配置。

接下来,检查测试数据库信息是否在新成员中复制:

1[environment third]
2SELECT * FROM playground.equipment;
1[secondary_label Output]
2[environment third]
3+----+-------+-------+-------+
4| id | type  | quant | color |
5+----+-------+-------+-------+
6|  1 | slide |     2 | blue  |
7+----+-------+-------+-------+
81 row in set (0.01 sec)

如果新成员的数据可用,则表示组复制工作正确。

第6步:测试新组成员的写作能力

接下来,您可以尝试从您的新复制组成员写入数据库. 是否成功或不成功,取决于您是否选择配置单个主组或多主组。

在单一主要环境中测试写作

在单个主组中,您应该预计来自非主服务器的任何写作操作将因一致性原因被拒绝,您可以通过在复制组的任何成员上运行下面的查询来随时找到当前的主组:

1[environment third]
2SHOW STATUS LIKE '%primary%';
1[secondary_label Output]
2[environment third]
3+----------------------------------+--------------------------------------+
4| Variable_name                    | Value                                |
5+----------------------------------+--------------------------------------+
6| group_replication_primary_member | 13324ab7-1b01-11e7-9dd1-22b78adaa992 |
7+----------------------------------+--------------------------------------+
81 row in set (0.01 sec)

查询的值将是一个MEMBER_ID,您可以通过像以前一样查询组成员列表来匹配一个主机:

1[environment third]
2SELECT * FROM performance_schema.replication_group_members;
 1[secondary_label Output]
 2[environment third]
 3+---------------------------+--------------------------------------+--------------+-------------+--------------+
 4| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST  | MEMBER_PORT | MEMBER_STATE |
 5+---------------------------+--------------------------------------+--------------+-------------+--------------+
 6| group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1  |        3306 | ONLINE       |
 7| group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2  |        3306 | ONLINE       |
 8| group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3  |        3306 | ONLINE       |
 9+---------------------------+--------------------------------------+--------------+-------------+--------------+
103 rows in set (0.01 sec)

正如本示例输出所示,在 203.0.113.1 的主机 - member1 - 目前是主要服务器. 如果您尝试从其他成员写入数据库,该操作将失败:

1[environment third]
2INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");
1[secondary_label Output]
2[environment third]
3ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

如果主服务器出现问题并离开该组,该组将自动选择一个新成员作为主,并接受写作。

在多元原始环境中测试写作

对于已配置为多主导方向的组,任何会员都应该能够向数据库订购写作。

您可以通过再次检查group_replication_primary_member变量的值来双重验证您的组是否处于多原始模式:

1[environment third]
2SHOW STATUS LIKE '%primary%';
1[secondary_label Output]
2[environment third]
3+----------------------------------+-------+
4| Variable_name                    | Value |
5+----------------------------------+-------+
6| group_replication_primary_member |       |
7+----------------------------------+-------+
81 row in set (0.02 sec)

如果变量是空的,这意味着没有指定的主要主机,任何成员都应该能够接受写作。

通过尝试在设备表中写一些数据来测试 member2 :

1[environment third]
2INSERT INTO playground.equipment (type, quant, color) VALUES ("swing", 10, "yellow");
1[secondary_label Output]
2[environment third]
3Query OK, 1 row affected (0.00 sec)

member2 在没有任何错误的情况下完成了写作操作。

member3 中,运行以下查询以检查是否添加了新项目:

1[environment fourth]
2SELECT * FROM playground.equipment;
1[secondary_label Output]
2[environment fourth]
3+----+-------+-------+--------+
4| id | type  | quant | color  |
5+----+-------+-------+--------+
6|  1 | slide |     2 | blue   |
7|  2 | swing |    10 | yellow |
8+----+-------+-------+--------+
92 rows in set (0.00 sec)

这证实了 member2 的写作已成功复制。

现在,通过运行以下INSERT语句来测试 member3 上的写字能力:

1[environment fourth]
2INSERT INTO playground.equipment (type, quant, color) VALUES ("seesaw", 3, "green");
1[secondary_label Output]
2[environment fourth]
3Query OK, 1 row affected (0.02 sec)

回到 member1 ,测试以确保两位新成员的写作操作被复制回来:

1[environment second]
2SELECT * FROM playground.equipment;
 1[secondary_label Output]
 2[environment second]
 3+----+--------+-------+--------+
 4| id | type   | quant | color  |
 5+----+--------+-------+--------+
 6|  1 | slide  |     2 | blue   |
 7|  2 | swing  |    10 | yellow |
 8|  3 | seesaw |     3 | green  |
 9+----+--------+-------+--------+
103 rows in set (0.01 sec)

这证实复制在每个方向工作,每个成员都能执行写作操作。

步骤7 - 带领组备份

一旦组启动,单个成员可以加入和离开,而不会影响可用性,只要有足够的成员选择主服务器. 但是,如果某些配置更改(如单个和多主环境之间切换),或所有组成员离开,您可能需要重新启动该组,就像最初一样。

member1 中,将group_replication_bootstrap_group变量设置为ON:

1[environment second]
2SET GLOBAL GROUP_REPLICATION_BOOTSTRAP_GROUP=ON;

然后开始组:

1[environment second]
2START GROUP_REPLICATION;

然后,您可以将group_replication_bootstrap_group变量重新设置为OFF:

1[environment second]
2SET GLOBAL GROUP_REPLICATION_BOOTSTRAP_GROUP=OFF;

一旦第一个成员启动了组,其他成员可以加入:

1[environment third]
2START GROUP_REPLICATION;

对于任何额外的会员,请遵循此过程:

1[environment fourth]
2START GROUP_REPLICATION;

该组现在应该在线,所有成员可用:

1[environment fourth]
2SELECT * FROM performance_schema.replication_group_members;
 1[secondary_label Output]
 2[environment fourth]
 3+---------------------------+--------------------------------------+--------------+-------------+--------------+
 4| CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST  | MEMBER_PORT | MEMBER_STATE |
 5+---------------------------+--------------------------------------+--------------+-------------+--------------+
 6| group_replication_applier | 13324ab7-1b01-11e7-9dd1-22b78adaa992 | 203.0.113.1  |        3306 | ONLINE       |
 7| group_replication_applier | 1ae4b211-1b01-11e7-9d89-ceb93e1d5494 | 203.0.113.2  |        3306 | ONLINE       |
 8| group_replication_applier | 157b597a-1b01-11e7-9d83-566a6de6dfef | 203.0.113.3  |        3306 | ONLINE       |
 9+---------------------------+--------------------------------------+--------------+-------------+--------------+
103 rows in set (0.01 sec)

这个过程可以用来在必要时重新启动组。

第8步:在MySQL启动时自动加入组

使用当前设置,如果会员服务器重新启动,则不会在启动时自动重新加入该组. 如果您希望会员自动重新加入该组,则可以稍微修改配置文件。

在此步骤中描述的设置是有用的,当您希望会员在启动时自动加入时. 但是,您应该注意一些事情. 首先,此设置只会影响MySQL实例本身启动时。

其次,在第一次启动组时启用此设置可能会有害。当没有现有组加入时,MySQL过程需要很长时间才能启动,因为它会尝试与其他非现有成员联系以初始化。

考虑到上述警告,如果您想要配置节点在 MySQL 启动时自动加入组,请打开主 MySQL 配置文件:

1sudo nano /etc/mysql/my.cnf

在内部,找到loose-group_replication_start_on_boot变量,并将其设置为ON:

1[label /etc/mysql/my.cnf]
2
3[mysqld]
4. . .
5loose-group_replication_start_on_boot = ON
6. . .

完成后保存并关闭文件. 会员应在下次启动其 MySQL 实例时自动尝试加入该组。

结论

通过完成本教程,您学会了如何在三个Ubuntu 20.04服务器之间配置MySQL群组复制。对于单一主体设置,会员在需要时会自动选择一个可写的主体。

组复制提供了灵活的复制 topology,允许成员随意加入或离开,同时提供数据一致性和消息排序的保证。

Published At
Categories with 技术
comments powered by Disqus