Mysql数据库MGR组复制部署(单主)

admin
2025-06-30 / 0 评论 / 21 阅读 / 正在检测是否收录...


Mysql数据库MGR组同步部署非常容易,主要是一些组复制的配置要清晰,本文以常用的单主模式进行部署。


规划


Rockylinux9.4 n184 mysql8.4(3306) 10.2.16.184 Primary(主)
Rockylinux9.4 n185 mysql8.4(3306) 10.2.16.185 Secondary(从)
Rockylinux9.4 n186 mysql8.4(3306) 10.2.16.186 Secondary(从)


系统初始化配置(所有节点)


关闭防火墙和SELinux

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


设置主机名和hosts文件

hostnamectl set-hostname n184 # 各节点设置对应主机名
cat >> /etc/hosts << EOF
10.2.16.184 n184
10.2.16.185 n185
10.2.16.186 n186
EOF


配置系统参数

cat > /etc/sysctl.d/mysql.conf << EOF
vm.swappiness = 10
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 15
EOF

sysctl -p /etc/sysctl.d/mysql.conf


安装Mysql 8 (Community Server)(所有节点)


添加YUM仓库

https://dev.mysql.com/downloads/repo/yum/ 查看对应版本

wget https://dev.mysql.com/get/mysql84-community-release-el9-1.noarch.rpm mysql 8.4.x 版本

wget https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm mysql 8.0.x 版本

rpm -ivh mysql84-community-release-el9-1.noarch.rpm / rpm -ivh mysql80-community-release-el9-1.noarch.rpm


安装Mysql 8.4

dnf install -y mysql-community-server


image1.png


mysql8.4启动与初始化

systemctl start mysqld && systemctl status mysqld

systemctl enable mysqld

grep 'temporary password' /var/log/mysqld.log 获取log中mysql密码

/usr/bin/mysql_secure_installation mysql 初始化设置


image2.png


配置Mysql组复制


主mysql n184 配置文件

vim /etc/my.cnf

[mysqld] 配置部分,原有配置不变,末尾增加配置

基础配置

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY" # 组复制数据必须存储在InnoDB存储引擎中,关闭其他存储引擎
plugin_dir = /usr/lib64/mysql/plugin # mysql插件目录 (默认已设置可选)
plugin_load_add = group_replication.so # 加载组复制模块,可通过插件目录查看
server_id = 1 # 每个节点唯一(1-3)
log_bin = binlog # 开启二进制日志记录
gtid_mode = ON # 开启binlog的GTID模式(MGR强制要求)
enforce_gtid_consistency = ON # 只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
log_replica_updates = ON # 级联复制(代替旧版本log_slave_updates)
binlog_checksum = NONE # 关闭binlog校验(MGR强制要求)

组复制配置

group_replication_group_name = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # 复制组名称,必须是有效的UUID,所有节点必须相同
group_replication_start_on_boot = OFF # 关闭mysql自动启动组复制
group_replication_local_address = "n184:33061" # 当前节点复制使用对应主机/IP和端口(自定义端口尽量一致)
group_replication_group_seeds = "n184:33061,n185:33061,n186:33061" # 组复制所有成员主机/ip与端口
group_replication_bootstrap_group = OFF # 需要手动引导配置
group_replication_single_primary_mode = ON # 开启单主机模式
group_replication_enforce_update_everywhere_checks = OFF # 控制数据一致性检查,多主模式时要开启
group_replication_recovery_get_public_key=ON # 确保从节点连接到主节点时能够获取所需的公钥,避免了认证错误

性能优化配置(可选)

innodb_buffer_pool_size = 1G
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1


image3.png


把配置文件scp到所有从节点

只修改server_id、group_replication_local_address两处配置


从mysql n185 配置

scp /etc/my.cnf root@10.2.16.185:/etc/my.cnf

vim /etc/my.cnf

server_id = 2

group_replication_local_address = "n185:33061"


image4.png


从mysql n186 配置

scp /etc/my.cnf root@10.2.16.186:/etc/my.cnf

vim /etc/my.cnf

server_id = 3

group_replication_local_address = "n186:33061"


image5.png


重启所有节点mysql

systemctl restart mysqld && systemctl status mysqld


查看端口

netstat -ntulp | grep 3306*

image6.png


如果启动有问题可通过日志排查:tail -n /var/log/mysqld.log


建立单独的组同步账户(所有节点)


mysql -u root -p

进入各自mysql

SET SQL_LOG_BIN=0;

CREATE USER rpl_user@'%' IDENTIFIED BY 'As@123#456!';

GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';

GRANT CONNECTION_ADMIN ON *.* TO rpl_user@'%';

GRANT BACKUP_ADMIN ON *.* TO rpl_user@'%';

GRANT GROUP_REPLICATION_STREAM ON *.* TO rpl_user@'%';

FLUSH PRIVILEGES;

SET SQL_LOG_BIN=1;


说明:数据库初始化后没有写入过数据那么GTID是空的,但创建用户是写入操作,默认会生成事务GTID和binlog数据

每个节点均需要写入操作就会生成各自的GUID和binlog数据,后面加入集群时会报错:GTID不一致 无法加入组集群

这里必须先SET SQL_LOG_BIN=0; 关闭binglog则不会生成事务GTID和binlog数据,创建用户后再SET SQL_LOG_BIN=1; 开启


创建复制用户后,必须向服务器提供用户凭据,以便用于分布式恢复

8.4版本命令:

CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user',SOURCE_PASSWORD='As@123#456!' FOR CHANNEL 'group_replication_recovery';

8.0版本命令

CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="As@123#456!",FOR CHANNEL 'group_replication_recovery';


初始化MGR集群


检查组复制插件:

mysql> SHOW PLUGINS;

group_replication状态为:ACTIVE


引导集群(第一个主mysql节点)

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


验证/查看集群/组成员

SELECT * FROM performance_schema.replication_group_members;

image7.png


可以看到第一台加入的组成员是主mysql节点n184,默认第一台是PRIMARY主节点


其他所有节点加入组(所有从节点)

建立与集群的复制凭证,上面如果已经建立则忽略、每次加入组集群必须建立凭证

注意:只保留内存中 重启服务或者服务器都需要重新建立

8.4版本命令:

CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user',SOURCE_PASSWORD='As@123#456!' FOR CHANNEL 'group_replication_recovery';

8.0版本命令

CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="As@123#456!",FOR CHANNEL 'group_replication_recovery';


开启/加入组

START GROUP_REPLICATION;


image8.png


验证MGR集群


任意节点验证:查看集群/组成员

SELECT * FROM performance_schema.replication_group_members;

image9.png


可以看到3个节点组成MGR组复制集群,3个都在线(ONLINE) 1主 2从

MGR单主模式下只有一个主成员负责读写,其他成员都是只读

如果组内所有服务器都关闭了,需要重新引导组


测试数据同步复制

在主节点(PRIMARY)上创建表

CREATE DATABASE test_db;
USE test_db;
CREATE TABLE test_table (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO test_table VALUES (1, 'MGR Test');

主/从节点查询表和二进制日志

SHOW BINLOG EVENTS;

image10.png


在从节点(Secondary)上查询数据

SELECT * FROM test_db.test_table;

image11.png


查看事务GTID

三个节点必须一致

SELECT @@GLOBAL.gtid_executed;

image12.png


默认以自定义的group_replication_group_name UUID为组事务GTID


MGR高可用测试


模拟Primary故障

在主mysql上停止MySQL服务

systemctl stop mysqld


在任意从节点检查新Primary选举

SELECT * FROM performance_schema.replication_group_members;

image13.png


原从节点n185 变为主节点


新主上测试写入新数据

create database db1;
create table db1.table1(id int key,name varchar(20));
insert into db1.table1 values(1,'zhangsan');


第三个节点查看数据

select * from db1.table1;

image14.png


恢复原Primary节点

systemctl start mysqld


重新加入集群

由于主Primary节点已经变成n185,本节点就变成了从节点并且重启了服务,因此需要配置与主节点的同步复制通道

STOP GROUP_REPLICATION; (如果是服务刚启动则可选 默认不会自动加入组复制集群)

CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user',SOURCE_PASSWORD='As@123#456!' FOR CHANNEL 'group_replication_recovery';

START GROUP_REPLICATION;

image15.png


验证集群恢复

SELECT * FROM performance_schema.replication_group_members;

image16.png


再次查看事务GTID

三个节点需一致,则数据一致

SELECT @@GLOBAL.gtid_executed;

image17.png


故障排查


命令区别:

MASTER/SLAVE (8.0.32及以下)

SOURCE/REPLICA (新命令)


节点加入集群故障(GTID不一致)

ERROR 3092 (HY000): The server is not configured properly to be an active member of the group. Please see more details on error log.

排查日志:

tail -n 100 /var/log/mysqld.log | grep "This member has more executed transactions than those present in the group"

出现:

[Repl] Plugin group_replication reported: 'This member has more executed transactions than those present in the group. Local transactions: 7359e3ef-523e-11f0-a128-bc24115033df:1-3 > Group transactions: 26e390a0-523d-11f0-aa9a-bc2411e65453:1-3'

判断:节点的 GTID 与集群不一致

自身:7359e3ef-523e-11f0-a128-bc24115033df:1-3 集群:26e390a0-523d-11f0-aa9a-bc2411e65453:1-3

解决:

8.0版本及以下在故障节点执行

STOP GROUP_REPLICATION; # 停止组复制
RESET MASTER; # 重置binlog信息
SET GLOBAL gtid_purged = ''; # 清除GTID历史
SELECT @@GLOBAL.gtid_executed; # 在任一在线节点获取GTID(主节点)
SET GLOBAL gtid_purged = '26e390a0-523d-11f0-aa9a-bc2411e65453:1-3'; #重新设置GTID值
START GROUP_REPLICATION;


高版本或不能直接设置GTID值,需要使用mysqldump重置GTID

  1. 在主节点上导出数据(包含GTID信息)
    mysqldump -u root -p --all-databases --single-transaction --source-data=2 > full_backup.sql
  2. 在故障节点上导入数据
    mysql -u root -p < full_backup.sql
  3. 启动组复制
    START GROUP_REPLICATION;

如果还是不行就重新安装节点,保持GTID为空,然后正常加入组复制集群,会自动同步数据


节点加入集群故障(复制用户认证权限问题)

报错:Slave I/O for channel 'group_replication_recovery': error connecting to master 'repl@172.17.139.77:3306' - retry-time: 60 retries: 1 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061

由于caching_sha2_password 是 MySQL 8.0.4 引入的一个新的身份验证插件,caching_sha2_password 对密码安全性要求更高,要求用户认证过程中在网络传输的密码是加密的,所以导致的这个问题的出现

解决:

数据库配置文件设置:group_replication_recovery_get_public_key=ON

可以确保从节点在连接到主节点时能够获取所需的公钥,从而允许安全连接并成功进行身份验证

避免了连接错误和身份验证问题

或者也可以为组复制通道启用SSL支持 (略)


单主多主切换


单主 ——> 多主


停止组复制(3个节点都执行)

mysql -u root -p

进入各数据库

stop group_replication;

是否启用单主模式,默认ON,OFF代表多主

set global group_replication_single_primary_mode=OFF;

开启条件检查,因为多主的约束更为严格,不符合要求的直接拒绝

set global group_replication_enforce_update_everywhere_checks=ON;


重新配置原主节点:

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

重新配置原从节点:

CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user',SOURCE_PASSWORD='As@123#456!' FOR CHANNEL 'group_replication_recovery';

START GROUP_REPLICATION;

查看组复制成员信息:

SELECT * FROM performance_schema.replication_group_members;





0

评论 (0)

取消