环境准备
三台4G4核虚拟机,搭建ubuntu24.03系统。
ip分别为:
mysql-master 192.168.133.128
mysql-slave1 192.168.133.130
mysql-slave2 192.168.133.131
永久关闭防火墙
root@warton:/www/mysql# ufw disable
防火墙在系统启动时自动禁用
配置hostname hosts
# 依次设置三台服务器
# 先设置服务器hostname
root@warton:~# vim /etc/hostname
# 修改为
mysql-master
root@warton:~# hostname mysql-master
root@warton:~# hostname
mysql-master
#设置服务器的hosts记录文件
root@warton:~# vim /etc/hosts
# 修改127.0.0.1 的host名称
127.0.0.1 mysql-master
# 添加如下信息
192.168.133.128 mysql-master
192.168.133.130 mysql-slave1
192.168.133.131 mysql-slave2
下载mysql8.0.36并安装(三台都要执行安装)
分别在三台服务器上下载mysql,存储在/www/mysql-8.0.36目录下,并解压
root@warton:~# mkdir -p /www/tools
root@warton:~# cd /www/tools/
root@warton:/www/tools# wget https://cdn.mysql.com/Downloads/MySQL-8.0/mysql-server_8.0.36-1ubuntu24.04_amd64.deb
root@warton:/www/tools# mkdir mysql-8.0.36
root@warton:/www/tools# tar -xvf mysql-server_8.0.36-1ubuntu23.10_amd64.deb-bundle.tar -C mysql-8.0.36/
root@warton:/www/tools# cd mysql-8.0.36/
解压出来的deb文件,逐一安装
# 1. 安装基础依赖(按顺序)
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-common_8.0.36-1ubuntu23.10_amd64.deb
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-community-client-plugins_8.0.36-1ubuntu23.10_amd64.deb
# 2. 安装客户端库
root@warton:/www/tools/mysql-8.0.36# dpkg -i libmysqlclient21_8.0.36-1ubuntu23.10_amd64.deb
root@warton:/www/tools/mysql-8.0.36# dpkg -i libmysqlclient-dev_8.0.36-1ubuntu23.10_amd64.deb
# 3. 安装客户端核心组件
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-community-client-core_8.0.36-1ubuntu23.10_amd64.deb
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-community-client_8.0.36-1ubuntu23.10_amd64.deb
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-client_8.0.36-1ubuntu23.10_amd64.deb
# 4. 安装服务端核心组件
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-community-server-core_8.0.36-1ubuntu23.10_amd64.deb
正在选中未选择的软件包 mysql-community-server-core。
(正在读取数据库 ... 系统当前共安装有 158163 个文件和目录。)
准备解压 mysql-community-server-core_8.0.36-1ubuntu23.10_amd64.deb ...
正在解压 mysql-community-server-core (8.0.36-1ubuntu23.10) ...
dpkg: 依赖关系问题使得 mysql-community-server-core 的配置工作不能继续:
mysql-community-server-core 依赖于 libaio1 (>= 0.3.93);然而:
未安装软件包 libaio1。
mysql-community-server-core 依赖于 libmecab2 (>= 0.996);然而:
未安装软件包 libmecab2。
dpkg: 处理软件包 mysql-community-server-core (--install)时出错:
依赖关系问题 - 仍未被配置
正在处理用于 libc-bin (2.39-0ubuntu8.6) 的触发器 ...
正在处理用于 man-db (2.12.0-4build2) 的触发器 ...
在处理时有错误发生:
mysql-community-server-core
root@warton:/www/tools/mysql-8.0.36#
# 5.报错解决
root@warton:/www/tools/mysql-8.0.36# apt --fix-broken install
root@warton:/www/tools/mysql-8.0.36# apt install libmecab2
root@warton:/www/tools/mysql-8.0.36# curl -O http://launchpadlibrarian.net/646633572/libaio1_0.3.113-4_amd64.deb
root@warton:/www/tools/mysql-8.0.36# dpkg -i libaio1_0.3.113-4_amd64.deb
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-community-server-core_8.0.36-1ubuntu23.10_amd64.deb
# 6.继续安装
# 注意,这一步需要设置root用户的密码,建议设置符合安全策略的密码,方便后续操作
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-community-server_8.0.36-1ubuntu23.10_amd64.deb
root@warton:/www/tools/mysql-8.0.36# dpkg -i mysql-server_8.0.36-1ubuntu23.10_amd64.deb
修改数据库相关目录到指定地址(三台都执行)
# 先关闭服务
root@warton:/www/tools/mysql-8.0.36# service mysql stop
# 创建相关数据目录
root@warton:/www/tools/mysql-8.0.36# mkdir -p /www/mysql/{data,logs,tmp,binlogs}
root@warton:/www/tools/mysql-8.0.36# cd /www/mysql/
# 迁移数据目录
root@warton:/www/mysql# cp -rf /var/lib/mysql/* /www/mysql/data
# 修改用户组
root@warton:/www/mysql# chown -R mysql:mysql /www/mysql
# 更新 AppArmor 配置(关键步骤)
root@warton:/www/mysql# vim /etc/apparmor.d/usr.sbin.mysqld
# 在末尾添加
/www/mysql/ r,
/www/mysql/** rwk,
/www/mysql/data/ r,
/www/mysql/data/** rwk,
/www/mysql/logs/ rw,
/www/mysql/tmp/ rw,
root@warton:/www/mysql# systemctl reload apparmor
修改数据库的配置文件(三台都执行)
# 编辑mysql配置文件
root@warton:/www/mysql# vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 添加如下内容
[mysqld]
datadir = /www/mysql/data
log-error = /www/mysql/logs/error.log
socket = /www/mysql/mysql.sock
tmpdir = /www/mysql/tmp
pid-file = /www/mysql/mysql.pid
log_bin = /www/mysql/binlogs/binlog
# ========================
# 内存优化配置 (2核4G专属)
# ========================
# 缓冲池配置(占物理内存50%-60%)
innodb_buffer_pool_size = 1280M
innodb_buffer_pool_instances = 2 # 匹配CPU核心数
# 连接与线程优化
max_connections = 80 # 避免内存耗尽
thread_cache_size = 16
table_open_cache = 1024
table_definition_cache = 512
# InnoDB引擎优化
innodb_log_file_size = 128M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_thread_concurrency= 0 # 自动优化
# 临时表与排序优化
tmp_table_size = 64M
max_heap_table_size = 64M
sort_buffer_size = 2M
join_buffer_size = 2M
read_buffer_size = 128K
read_rnd_buffer_size = 256K
# ========================
# 安全与维护配置
# ========================
skip_name_resolve = ON
log_slow_extra = ON
long_query_time = 2
log_queries_not_using_indexes = OFF
max_allowed_packet = 64M
transaction_isolation = READ-COMMITTED
[client]
socket=/www/mysql/mysql.sock
启动mysql 服务进行验证(三台都执行)
root@warton:/www/mysql# service mysql start
root@warton:/www/mysql# service mysql status
● mysql.service - MySQL Community Server
Loaded: loaded (/usr/lib/systemd/system/mysql.service; enabled; preset: enabled)
Active: active (running) since Tue 2026-01-13 15:24:55 CST; 13s ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 4272 ExecStartPre=/usr/share/mysql-8.0/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 4311 (mysqld)
Status: "Server is operational"
Tasks: 39 (limit: 4572)
Memory: 389.8M (peak: 404.3M)
CPU: 4.421s
CGroup: /system.slice/mysql.service
└─4311 /usr/sbin/mysqld
1月 13 15:24:52 warton systemd[1]: Starting mysql.service - MySQL Community Server...
1月 13 15:24:55 warton systemd[1]: Started mysql.service - MySQL Community Server.
至此,三台服务器的mysql已经全部安装完毕。
增加MGR相关配置(三台都需要配置)
root@warton:/www/mysql# service mysql stop
root@warton:/www/mysql# vim /etc/mysql/mysql.conf.d/mysqld.cnf
# 在[mysqld]下增加
# ========================
# MGR 集群核心配置
# ========================
# 服务器编号,这个要唯一,我选择用ip尾数
server_id = 128
# 开启binlog的GTID模式
gtid_mode = ON
# 开启后MySQL只允许能够保障事务安全,并且能够被日志记录的SQL语句被执行
enforce_gtid_consistency = ON
# 关闭binlog校验
binlog_checksum = NONE
# 确保从库执行的中继日志(relay log)操作被记录到自身的二进制日志(binlog)中
log_slave_updates = ON
# 设置binlog记录模式为"行级模式",即记录数据行的变更细节(而非SQL语句)。
binlog_format = ROW
# 定义用于事务期间哈希写入提取的算法,组复制模式下必须设置为XXHASH64。
transaction_write_set_extraction = XXHASH64
# MGR专用配置
loose-group_replication_group_name = "161ec121-861b-4f61-b6ed-c969087cc1be" # 这个要全部一致,可以使用uuidgen在服务器中执行获取
loose-group_replication_start_on_boot = OFF
# 在组复制恢复阶段,自动从主节点获取公钥,用于加密连接认证。
loose-group_replication_recovery_get_public_key = ON
# 确定组复制恢复时是否应该应用SSL,通常设置为"开",但默认设置为"关"。
loose-group_replication_recovery_use_ssl = ON
# 指定当前节点用于组内通信的地址和端口,需确保与其他节点的group_seeds配置互通,且端口未被占用
loose-group_replication_local_address = "192.168.133.128:33061"
# 定义集群"种子节点"列表,新节点加入集群时,通过种子节点发现集群成员并建立连接。建议包含所有节点以提高容错性
loose-group_replication_group_seeds = "192.168.133.128:33061,192.168.133.130:33061,192.168.133.131:33061"
loose-group_replication_bootstrap_group = OFF
# 启动服务
root@warton:/www/mysql# service mysql start
root@warton:/www/mysql# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.36 MySQL Community Server - GPL
Copyright (c) 2000, 2024, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
创建mysql相关必要账户(三台都要执行)
# 直接复制以下代码进入数据库后直接运行
#创建rp1_user账户,此账户用于实现主从数据同步
CREATE USER 'rpl_user'@'%' IDENTIFIED BY '@Password1122!';
#赋予主从同步权限
GRANT REPLICATION SLAVE ON *.* TO 'rpl_user'@'%';
#创建一个远程连接用户,这个用户用在Navcate、JDBC登录的时候,直接用root登录不好
create user 'warton'@'%' identified by '@Password1122!';
#为warton用户赋予所有数据库资源的访问权限,熟悉grant的小伙伴可以自己调整
grant all privileges on *.* to 'warton'@'%';
#让刚才的修改生效
FLUSH PRIVILEGES;
#大坑3:
#删除已产生的Binlog
#一定要RESET MASTER,它会删除刚才已产生的Binlog
#因为刚才Binglog包含创建用户这种高权限操作,用于主从同步的rpl_user账户是没有权限执行的
#这就会导致RelayLog重放无法正确执行,导致从属服务器卡死在"RECEVING"状态
#利用RESET MASTER删除这些无法执行的binlog,就没问题了
RESET MASTER;
#安装Group Replication插件
INSTALL PLUGIN group_replication SONAME 'group_replication.so';
主节点执行
SET GLOBAL group_replication_bootstrap_group=ON;
START GROUP_REPLICATION;
SET GLOBAL group_replication_bootstrap_group=OFF;
从节点执行
CHANGE MASTER TO MASTER_USER="rpl_user", MASTER_PASSWORD="@Password1122!" FOR CHANNEL 'group_replication_recovery';
start group_replication;
校验MGR的members的通信情况
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 83806307-f112-11f0-822a-000c29b13668 | mysql-master | 3306 | ONLINE | PRIMARY | 8.0.36 | XCom |
| group_replication_applier | 85ed9069-f112-11f0-96d9-000c29f10b53 | mysql-slave1 | 3306 | ONLINE | SECONDARY | 8.0.36 | XCom |
| group_replication_applier | 8868042b-f112-11f0-a2f2-000c293bd06c | mysql-slave2 | 3306 | ONLINE | SECONDARY | 8.0.36 | XCom |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.00 sec)
报错解决
mysql> select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | 83806307-f112-11f0-822a-000c29b13668 | warton | 3306 | ONLINE | PRIMARY | 8.0.36 | XCom |
| group_replication_applier | 85ed9069-f112-11f0-96d9-000c29f10b53 | warton | 3306 | RECOVERING | SECONDARY | 8.0.36 | XCom |
| group_replication_applier | 8868042b-f112-11f0-a2f2-000c293bd06c | warton | 3306 | RECOVERING | SECONDARY | 8.0.36 | XCom |
+---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+----------------------------+
# 当有hostname、hosts文件未配置时发生的各种报错如上面情况,三个节点都往warton节点通信
# 还有直接点primary显示的是ONLINE,其余从节点显示RECEVING,判断通信异常
# 可以通过如下命令重新配置
解决情况1
# 这里用来在从节点上执行,实现重新配置用于同步的账号信息
mysql> STOP GROUP_REPLICATION;
Query OK, 0 rows affected (3.08 sec)
mysql> RESET SLAVE ALL;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> CHANGE REPLICATION SOURCE TO SOURCE_USER='rpl_user', SOURCE_PASSWORD='@Password1122!' FOR CHANNEL 'group_replication_recovery';
Query OK, 0 rows affected, 2 warnings (0.01 sec)
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (5.68 sec)
# 当从服务器遇到异常问题时,需要关闭重启
mysql> STOP GROUP_REPLICATION;
Query OK, 0 rows affected (3.08 sec)
# 后续等解决问题之后再重新开启
mysql> START GROUP_REPLICATION;
Query OK, 0 rows affected (4.12 sec)