人生最重要的不是努力,而是方向

0%

在 Ubuntu 20.04 上配置 MySQL 组复制

介绍

MySQL Group Replication是一个创建高可用性容错数据库架构的插件。在无共享架构下,组复制消除了单点故障(SPOF)的机会。在本指南中,您将安装并配置MySQL组复制插件,以创建高可用性的数据库集群。

先决条件

开始之前,请确保您具有以下内容:

  • 一组配置了私有网络的三个Ubuntu 20.04服务器。本指南使用示例私有IP地址192.0.2.1、192.0.2.2和192.0.2.3。

  • 在每个服务器上具有sudo特权的非根用户。

  • 这三个服务器都是最新的升级版本。

    第 1 步:安装 MySQL 服务器

使用非root账户ssh登陆到第一台服务器访问,安装 MySQL 服务器。

$ sudo apt install mysql-server

为 MySQL 设置root密码并配置安全性。

$ sudo mysql_secure_installation

在其他两台服务器上重复相同的过程。

第 2 步:生成组复制名称

SSH 到服务器 1,以root身份登录到 MySQL 服务器。

$ sudo mysql -u root -p

输入 MySQL 服务器root密码,然后按ENTER以继续。

生成 UUID。

mysql> SELECT UUID();

记下您的新 UUID,其格式将与下面的示例类似,每个服务器使用此 UUID 作为复制组名称。

+--------------------------------------+
| UUID()                               |
+--------------------------------------+
| 00000000-1111-2222-3333-444444444444 |
+--------------------------------------+

退出 MySQL。

mysql> QUIT;

步骤 3:配置服务器1

SSH 到服务器1,编辑 /etc/mysql/my.cnf

$ sudo nano /etc/mysql/my.cnf

将下面的信息粘贴到文件末尾。

  • 服务器1的地址替换192.0.2.1。

  • 192.0.2.2192.0.2.3分别替换为服务器2和3的地址。

  • 用步骤2中的UUID替换loose-group_replication_group_name的值。

    [mysqld]
    server_id=1
    bind-address=0.0.0.0
    gtid_mode=ON 
    enforce_gtid_consistency=ON
    binlog_checksum=NONE
    
    plugin_load_add='group_replication.so'
    group_replication_single_primary_mode=OFF
    loose-group_replication_group_name="00000000-1111-2222-3333-444444444444"
    loose-group_replication_start_on_boot=OFF
    loose-group_replication_local_address= "192.0.2.1:33061"
    loose-group_replication_group_seeds="192.0.2.1:33061, 192.0.2.2:33061, 192.0.2.3:33061"
    loose-group_replication_bootstrap_group=OFF
    report_host=192.0.2.1

注:loose-group_replication前缀指示服务器启动,即使服务器启动时未加载组复制插件也是如此。

保存并关闭文件。

MySQL 配置设置说明了:

server_id=1
这是复制组中的服务器1
bind-address=0.0.0.0
收听所有 IP 地址。
gtid_mode=ON
使用全局事务标识符运行复制。
enforce_gtid_consistency=ON
MySQL 将仅执行可以使用 GTID 安全地记录的语句。
binlog_checksum=NONE
禁用将校验和写入二进制日志。
plugin_load_add='group_replication.so'
加载组复制插件。
group_replication_single_primary_mode=OFF
多主机复制模型,所有成员都有读写访问权限。
loose-group_replication_group_name="00000000-1111-2222-3333-444444444444444"
复制组的唯一名称。
loose-group_replication_start_on_boot_OFF
请勿在启动时启动复制。您需要手动启动复制。详细了解自动启动复制的含义和注意事项。
loose-group_replication_local_address= "192.0.2.1:33061"
此服务器用于复制的地址和端口。
loose-group_replication_group_seeds="192.0.2.1:33061,192.0.2.2:33061,192.0.2.3:33061"
其他组成员的主机和端口组合。
loose-group_replication_bootstrap_group_OFF
设置 OFF 以避免从多个服务器引导组并引发冲突。
report_host=192.0.2.1
此服务器用于向其他成员报告的 IP 地址。

重新启动 MySQL 服务器以应用更改。

$ sudo service mysql restart

步骤 4:创建复制用户

在服务器 1 上登录到 MySQL。

$ sudo mysql -u root -p

创建复制用户,用你的密码替换EXAMPLE_PASSWORD。

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER 'replication_user'@'%' IDENTIFIED WITH mysql_native_password BY 'EXAMPLE_PASSWORD';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='replication_user', MASTER_PASSWORD='EXAMPLE_PASSWORD' FOR CHANNEL 'group_replication_recovery';

引导第一台服务器上的组复制插件
仅引导组的一个成员以避免创建同名的多个组。为此,在第一台服务器上运行以下命令。

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

关闭group_replication_bootstrap_group以避免在重新启动 MySQL 服务器时创建多个组。

mysql> SET GLOBAL group_replication_bootstrap_group=OFF;

通过查询replication_group_members验证组的状态。

mysql> SELECT MEMBER_ID, MEMBER_HOST, MEMBER_STATE FROM performance_schema.replication_group_members;

验证您的输出与此类似。你的MEMBER_ID会有所不同。

+--------------------------------------+-------------+--------------+
| MEMBER_ID                            | MEMBER_HOST | MEMBER_STATE |
+--------------------------------------+-------------+--------------+
| 11111111-40c4-11e9-92b4-7a4c400acda6 | 192.0.2.1   | ONLINE       |
+--------------------------------------+-------------+--------------+

创建测试数据库,test_db

mysql> CREATE DATABASE test_db;

切换到数据库。

mysql> USE test_db; 

创建测试表,test_tbl

mysql> CREATE TABLE test_tbl (employee_id INT PRIMARY KEY, employee_name VARCHAR(30) NOT NULL) Engine = InnoDB;

确认表存在。

mysql> SHOW TABLES;

+----------------------------+
| Tables_in_test_replication |
+----------------------------+
| test_tbl                   |
+----------------------------+

第5步: 配置服务器 2

ssh链接到服务器2 ,编辑 /etc/mysql/my.cnf

$ sudo nano /etc/mysql/my.cnf

将下面的信息粘贴到文件末尾。

  • 用服务器2的地址替换为192.0.2.2

  • 将192.0.2.1和192.0.2.3分别替换为服务器 1 和 3 的地址。

  • 将loose-group_replication_group_name的值替换为步骤 2 中的 UUID。

    [mysqld]
    server_id=2
    bind-address=0.0.0.0
    gtid_mode=ON 
    enforce_gtid_consistency=ON
    binlog_checksum=NONE
    
    plugin_load_add='group_replication.so'
    group_replication_single_primary_mode=OFF
    loose-group_replication_group_name="00000000-1111-2222-3333-444444444444"
    loose-group_replication_start_on_boot=OFF
    loose-group_replication_local_address= "192.0.2.2:33061"
    loose-group_replication_group_seeds="192.0.2.1:33061, 192.0.2.2:33061, 192.0.2.3:33061"
    loose-group_replication_bootstrap_group=OFF
    report_host=192.0.2.2

保存并关闭文件。

重新启动 MySQL。

$ sudo service mysql restart

以根身份登录到 MySQL。

$ sudo mysql -u root -p
为服务器 2 创建复制用户,将EXAMPLE_PASSWORD替换为你的密码。

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER 'replication_user'@'%' IDENTIFIED WITH mysql_native_password BY 'EXAMPLE_PASSWORD';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='replication_user', MASTER_PASSWORD='EXAMPLE_PASSWORD' FOR CHANNEL 'group_replication_recovery';

启动组复制插件。

mysql> START GROUP_REPLICATION;

验证服务器 2 现在是组的成员。

mysql> SELECT MEMBER_ID, MEMBER_HOST, MEMBER_STATE FROM performance_schema.replication_group_members;

验证您的输出与此类似。你的MEMBER_ID会有所不同。

+--------------------------------------+-------------+--------------+
| MEMBER_ID                            | MEMBER_HOST | MEMBER_STATE |
+--------------------------------------+-------------+--------------+
| 11111111-40c4-11e9-92b4-7a4c400acda6 | 192.0.2.1  | ONLINE        |
| 22222222-40c4-11e9-92b4-7a4c400acda6 | 192.0.2.2  | ONLINE        |
+--------------------------------------+-------------+--------------+

验证服务器2已经复制了测试数据库。

mysql> SHOW databases;

+--------------------+
| Database           |
+--------------------+
| test_db            |
+--------------------+

确认服务器 2 上存在测试表。

mysql> SHOW TABLES;

+----------------------------+
| Tables_in_test_replication |
+----------------------------+
| test_tbl                   |
+----------------------------+

步骤6: 配置服务器3
SSH连接到服务器3,编辑/etc/mysql/my.cnf

$ sudo nano `/etc/mysql/my.cnf`

将下面的信息粘贴到文件末尾

  • 192.0.2.3替换为服务器 3的地址。
  • 192.0.2.1和192.0.2.2分别替换为服务器 1 和 2的地址。
  • loose-group_replication_group_name的值替换为步骤 2 中的 UUID。
[mysqld]
server_id=3
bind-address=0.0.0.0
gtid_mode=ON 
enforce_gtid_consistency=ON
binlog_checksum=NONE

plugin_load_add='group_replication.so'
group_replication_single_primary_mode=OFF
loose-group_replication_group_name="00000000-1111-2222-3333-444444444444"
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address= "192.0.2.3:33061"
loose-group_replication_group_seeds="192.0.2.1:33061, 192.0.2.2:33061, 192.0.2.3:33061"
loose-group_replication_bootstrap_group=OFF
report_host=192.0.2.3

保存并关闭

重启mysql

$ sudo service mysql restart

使用root权限登陆mysql

$ sudo mysql -u root -p

服务器3创建复制用户,用你的密码替换EXAMPLE_PASSWORD

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER 'replication_user'@'%' IDENTIFIED WITH mysql_native_password BY 'EXAMPLE_PASSWORD';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='replication_user', MASTER_PASSWORD='EXAMPLE_PASSWORD' FOR CHANNEL 'group_replication_recovery';

启动组复制插件。

mysql> START GROUP_REPLICATION;

验证服务器3现在是组的成员。

mysql> SELECT MEMBER_ID, MEMBER_HOST, MEMBER_STATE FROM performance_schema.replication_group_members;

验证您的输出与此类似。你的MEMBER_ID会有所不同。

+--------------------------------------+-------------+--------------+
| MEMBER_ID                            | MEMBER_HOST | MEMBER_STATE |
+--------------------------------------+-------------+--------------+
| 11111111-40c4-11e9-92b4-7a4c400acda6 | 192.0.2.1  | ONLINE        |
| 22222222-40c4-11e9-92b4-7a4c400acda6 | 192.0.2.2  | ONLINE        |
| 33333333-40c4-11e9-92b4-7a4c400acda6 | 192.0.2.3  | ONLINE        |
+--------------------------------------+-------------+--------------+

验证服务器3 已复制测试数据库。

mysql> SHOW databases;

+--------------------+
| Database           |
+--------------------+
| test_db            |
+--------------------+

确认服务器3上存在测试表。

mysql> SHOW TABLES;

+----------------------------+
| Tables_in_test_replication |
+----------------------------+
| test_tbl                   |
+----------------------------+

上述输出确认 MySQL 组复制插件在所有三台服务器上工作。

在生产环境中,必须处理连接到失败成员的客户端,并将它们重定向到组中的 ONLINE 成员。MySQL不处理客户端故障转移,您必须管理具有连接器、负载均衡器、中间件或路由器(如 MySQL Router 8.0)的连接

您最多可以将9个组成员添加到组复制拓扑中。

OVER

您已成功在 Ubuntu 20.04 服务器上设置 MySQL 组复制。使用此复制数据库的 Web 应用程序将避免单点故障。