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

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 初始化设置

配置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 = OFF # 关闭单主机模式,即多主模式
group_replication_enforce_update_everywhere_checks = ON # 控制数据一致性检查,多主模式时要开启
group_replication_recovery_get_public_key=ON # 确保从节点连接到主节点时能够获取所需的公钥,避免了认证错误
性能优化配置(可选)
innodb_buffer_pool_size = 1G
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1

把配置文件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"

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"

重启所有节点mysql
systemctl restart mysqld && systemctl status mysqld
查看端口
netstat -ntulp | grep 3306*

如果启动有问题可通过日志排查: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;

可以看到第一台加入的组成员是主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;

验证MGR集群
任意节点验证:查看集群/组成员
SELECT * FROM performance_schema.replication_group_members;

可以看到3个节点组成MGR组复制集群,3个都在线(ONLINE),3个节点都为主(PRIMARY)
MGR多主模式下每个节点都可以读写
如果组内所有服务器都关闭了,需要重新引导组
测试数据同步复制
在主节点n184(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;

在主节点n185(Secondary)上查询数据
SELECT * FROM test_db.test_table;

在主节点n185(PRIMARY)上创建库
CREATE DATABASE test_db2;
在主节点n186(PRIMARY)上创建库
CREATE DATABASE test_db3;
在任意节点查看数据库:

查看事务GTID
三个节点必须一致
SELECT @@GLOBAL.gtid_executed;

默认以自定义的group_replication_group_name UUID为组事务GTID
MGR高可用测试
模拟Primary故障
在主mysql上停止MySQL服务
systemctl stop mysqld
在任意从节点检查新Primary选举
SELECT * FROM performance_schema.replication_group_members;

还剩2个主节点
恢复原Primary节点
systemctl start mysqld
重新加入集群
重新配置与组复制集群的同步复制通道
STOP GROUP_REPLICATION; (如果是服务刚启动则可选 默认不会自动加入组复制集群)
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;

再次查看事务GTID
三个节点需一致,则数据一致
SELECT @@GLOBAL.gtid_executed;

故障排查
命令区别:
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
- 在主节点上导出数据(包含GTID信息)
mysqldump -u root -p --all-databases --single-transaction --source-data=2 > full_backup.sql - 在故障节点上导入数据
mysql -u root -p < full_backup.sql - 启动组复制
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支持 (略)
评论 (0)