在一台虚拟机上搭建MGR 9.0集群

20天前 27.4k 0

一、MGR简介

MGR是“MySQL Group Replication”的简称,它是MySQL官方推出的基于组复制的高可用集群架构。MGR基于分布式Paxos协议,实现组复制,保证数据一致性。内置故障检测和自动选主功能,只要半数以上节点正常,就可继续正常工作。 它具有以下特点和要求:

  • MGR由奇数个节点共同组成一个数据库集群(至少3个节点,最多9个节点)
  • 各节点配置尽量保持一致,因为和 PXC一样,也会有“木桶短板效应”。
  • 事务的提交必须经过半数以上节点确认方可提交。
  • 支持单主模式和多主模式。官方推荐使用单主模式。
  • 仅支持InnoDB引擎
  • 需要开启GTID
  • 表要有显式主键
  • 不建议使用外键

以下是3节点MGR的拓扑结构示意图:

在一台虚拟机上搭建MGR 9.0集群-1

对于正常部署3节点的MGR集群,需要三台主机。但由于我本机资源有限,而且只是用于测试,因此准备在一台虚拟机上搭建3节点的MGR集群。

以下搭建过程,参照了官方文档(https://dev.mysql.com/doc/refman/9.0/en/group-replication.html)的指导说明。

二、准备一台虚拟机

1、创建一台VMware虚机

(1)运行 VMware Workstation 新建虚拟机:

在一台虚拟机上搭建MGR 9.0集群-2

(2)选择在虚拟机中要安装的操作系统:

在一台虚拟机上搭建MGR 9.0集群-3

(3)分配虚拟机资源:

虚拟机分配2G内存即可。

在一台虚拟机上搭建MGR 9.0集群-4

2、在虚机中安装Rocky Linux

(1)下载最新的Rocky Linux 9.4 ISO文件

下载地址:https://rockylinux.org/download

在一台虚拟机上搭建MGR 9.0集群-5

(2)挂载Rocky-9.4-x86_64-dvd.iso到虚机并安装

(3)启动安装了 Rocky Linux 的虚机

在一台虚拟机上搭建MGR 9.0集群-6

三、在虚机上安装3节点MGR集群

1、关闭防火和SELinux

systemctl stop firewalld
systemctl disable firewalld
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

2、设置主机名解析

编辑/etc/hosts文件,加入以下内容:

192.168.20.94 rocky94

3、安装依赖包

yum install -y libaio

4、创建mysql用户

groupadd mysql
useradd -r -g mysql -s /bin/false mysql

5、下载mysql 9.0 安装包

下载地址:https://dev.mysql.com/downloads/mysql/

在一台虚拟机上搭建MGR 9.0集群-7

可以看到 mysql 9.0 的“Mini版”安装包非常小巧,只有58.5M,还不到60MB。

6、上传安装包到虚拟机,并解压

tar -xvf mysql-9.0.0-linux-glibc2.17-x86_64-minimal.tar.xz -C /opt/
cd /opt
mv mysql-9.0.0-linux-glibc2.17-x86_64-minimal mgr
cd mgr
mkdir mysql-files
chown mysql:mysql mysql-files
chmod 750 mysql-files

7、设置系统环境变量

export PATH=/opt/mgr/bin:$PATH

8、创建数据目录

mkdir -p /data/mgr/db{1,2,3}
chown -R mysql:mysql /data/mgr

9、配置MGR各节点参数

(1)/etc/my.3321.cnf

[mysqld]
server_id=3321
port=3321
report_port=3321
report_host=rocky94
socket=/tmp/mysql.3321.sock
mysqlx_socket=/tmp/mysqlx.33210.sock
mysqlx_port=33210
datadir=/data/mgr/db1
basedir=/opt/mgr
user=mysql
log_error=error.log
pid-file=mysqld.pid
#log-error=/var/log/mysqld.log
#pid-file=/var/run/mysqld/mysqld.pid
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
default_storage_engine=InnoDB
gtid_mode=ON
enforce_gtid_consistency=ON
plugin_load_add='group_replication.so'
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "rocky94:33061"
loose-group_replication_group_seeds= "rocky94:33061,rocky94:33062,rocky94:33063"
loose-group_replication_bootstrap_group=off

(2)/etc/my.3322.cnf

[mysqld]
server_id=3322
port=3322
report_port=3322
report_host=rocky94
socket=/tmp/mysql.3322.sock
mysqlx_socket=/tmp/mysqlx.33220.sock
mysqlx_port=33220
datadir=/data/mgr/db2
basedir=/opt/mgr
user=mysql
log_error=error.log
pid-file=mysqld.pid
#log-error=/var/log/mysqld.log
#pid-file=/var/run/mysqld/mysqld.pid
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
default_storage_engine=InnoDB
gtid_mode=ON
enforce_gtid_consistency=ON
plugin_load_add='group_replication.so'
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "rocky94:33062"
loose-group_replication_group_seeds= "rocky94:33061,rocky94:33062,rocky94:33063"
loose-group_replication_bootstrap_group=off

(3)/etc/my.3323.cnf

[mysqld]
server_id=3323
port=3323
report_port=3323
report_host=rocky94
socket=/tmp/mysql.3323.sock
mysqlx_socket=/tmp/mysqlx.33230.sock
mysqlx_port=33230
datadir=/data/mgr/db3
basedir=/opt/mgr
user=mysql
log_error=error.log
pid-file=mysqld.pid
#log-error=/var/log/mysqld.log
#pid-file=/var/run/mysqld/mysqld.pid
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
default_storage_engine=InnoDB
gtid_mode=ON
enforce_gtid_consistency=ON
plugin_load_add='group_replication.so'
loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "rocky94:33063"
loose-group_replication_group_seeds= "rocky94:33061,rocky94:33062,rocky94:33063"
loose-group_replication_bootstrap_group=off

10、初始化MGR各节点实例

mysqld --defaults-file=/etc/my.3321.cnf --initialize
mysqld --defaults-file=/etc/my.3322.cnf --initialize
mysqld --defaults-file=/etc/my.3323.cnf --initialize

11、启动MGR各节点实例

mysqld_safe --defaults-file=/etc/my.3321.cnf &
mysqld_safe --defaults-file=/etc/my.3322.cnf &
mysqld_safe --defaults-file=/etc/my.3323.cnf &

12、修改mysql的root密码(以节点1为例)

(1)查看初始密码

grep "A temporary password" /data/mgr/db1/error.log

(2)登录mysql

mysql -uroot -p -S/tmp/mysql.3321.sock

此时报错,截图如下:

在一台虚拟机上搭建MGR 9.0集群-8

解决方法:

ln -s /usr/lib64/libncurses.so.6.2 /usr/lib64/libncurses.so.5
ln -s /usr/lib64/libtinfo.so.6.2 /usr/lib64/libtinfo.so.5

(3)修改密码

mysql> alter user root@'localhost' identified by 'root_password';
mysql> flush privileges;

13、创建复制用户

mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'rel_password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%';
mysql> GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';
mysql> GRANT GROUP_REPLICATION_STREAM ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;

14、启动第一个节点的服务实例

mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='rel_password' \
FOR CHANNEL 'group_replication_recovery';
mysql> SET GLOBAL group_replication_bootstrap_group=ON;
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
mysql> SELECT * FROM performance_schema.replication_group_members;

启动第一个节点后,查询结果截图如下:

在一台虚拟机上搭建MGR 9.0集群-9

15、启动第二个节点的服务实例

mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='rel_password' \
FOR CHANNEL 'group_replication_recovery';
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members;

启动第二个节点后,查询结果截图如下:

在一台虚拟机上搭建MGR 9.0集群-10

16、启动第三个节点的服务实例

mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='rel_password' \
FOR CHANNEL 'group_replication_recovery';
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members;

启动第三个节点后,查询结果截图如下:

在一台虚拟机上搭建MGR 9.0集群-11

至此,可以看到由三个节点组成的MGR集群,已经正常运行了。其中有一主库(PRIMARY)和两从库(SECONDARY)。

17、MGR主库和从库的只读属性

MGR集群,会根据各节点的角色(主库还是从库),自动设置其只读属性,通过以下查询可得以验证:

(由于是在同一台虚拟机上,MGR的各个节点的服务端口不同,因此通过端口来加以区分)

在一台虚拟机上搭建MGR 9.0集群-12

(1)查看主库的只读属性

在一台虚拟机上搭建MGR 9.0集群-13

可以看到,主库的只读属性是关闭的,即主库是可以读写的。

(2)查看两个从库的只读属性

在一台虚拟机上搭建MGR 9.0集群-14

在一台虚拟机上搭建MGR 9.0集群-15

可以看到,从库都是只读的,即只能执行读操作,不允许写操作。因此确保从库不会被误写入数据,避免因从库误写而导致主从不一致的情况发生。

三、MGR主从同步的测试

1、在主库上建库、建表、添加表数据

在一台虚拟机上搭建MGR 9.0集群-16

2、在从库上验证

在一台虚拟机上搭建MGR 9.0集群-17

在一台虚拟机上搭建MGR 9.0集群-18

可以看到,在主库上创建的库、创建的表,以及添加的表数据,都已经同步到各个从库上。

四、MGR更改主库

1、命令格式

对于刚搭建的MGR集群,第一个节点是主库,但也可以将指定的节点设置为新的主库(原来的主库,则成为从库),以下是更改主库的命令格式如下:

SELECT group_replication_set_as_primary(member_uuid);

2、命令演示

以下是MGR集群各节点的初始情况:

在一台虚拟机上搭建MGR 9.0集群-19

可以看到,端口为3321的节点为主库。现在要将端口为3323的节点设置为新的主库,则执行如下命令:

在一台虚拟机上搭建MGR 9.0集群-20

再次查看MGR集群各节点的情况如下:

在一台虚拟机上搭建MGR 9.0集群-21

可以看到,端口为3323的节点已经成为主库。

五、切换单主和多主模式

1、单主模式切换为多主模式的命令

默认情况下,MGR是一主多从的单主模式,但也可以切换为多主模式,命令如下:

SELECT group_replication_switch_to_multi_primary_mode();

以下是命令执行结果截图:

在一台虚拟机上搭建MGR 9.0集群-22

2、多主模式切换为单主模式的命令

SELECT group_replication_switch_to_single_primary_mode([member_uuid]);

以上命令中的member_uuid参数是可选的,如果不加此参数,则由系统自动选一个节点为主库;如果加上此参数,则将对应的节点设置为主库。

以下是命令执行结果的截图:

在一台虚拟机上搭建MGR 9.0集群-23

可以看到MGR集群已经由多主模式,又切换回单主模式。由于切换命令中,并未指定主库的member_uuid,所以主库就由系统自动选定。

至此,完成了在一台虚拟机上,搭建3节点MGR 9.0 集群,并进行了简单的测试。感兴趣的小伙伴,可以一起搭建、一起玩耍:)

相关文章

PostgreSQL系数据库使用COPY导数时如何实现增量及重复数据更新导入
oracle 自动撤销
oracle NLS_LANGUAGE
Oracle NetSuite 客户说 | 借数字化之力“轻装”出海,让中国品牌全球热卖
脚本:自动生成精准的Oracle AWR报告
担心异构数据库迁移踩“坑”?听听大咖们怎么说

发布评论