构建高可用 MySQL 8.0.40 集群:MGR + ProxySQL 实战指南
一、部署架构图
流量路径:应用 → ProxySQL(DNS 解析 ProxySQL IP) → MySQLMGR 集群
二、环境准备
1.系统要求
- **操作系统: **CentOS 7.x
- 服务器配置
- 3 台节点(建议最小配置:4 核 CPU/8GB 内存/100GB 磁盘)
- 网络互通(关闭防火墙或开放端口:3306, 33081, 6032, 6033
- 节点规划
节点1: 192.168.1.1 (Primary)
节点2: 192.168.1.2 (Secondary)
节点3: 192.168.1.3 (Secondary)
2.软件下载&安装前准备
# MySQL安装包去官网下载,proxysql从github上下载
# 注意:安装前确认无残留MariaDB:
rpm -qa | grep mariadb && yum remove mariadb-libs -y
三、MySQL 安装与服务启动(所有节点)
1.安装 MySQL
解压并安装
tar -xvf mysql-8.0.40.tar
yum install ./mysql-community-*.rpm -y
2.关键配置文件 (/etc/my.cnf)
所有节点需修改以下参数(示例为节点 1 配置):
- 三个节点 server_id 唯一,要求均不相同,
- report_host、loose_group_replication_local_address 是每个节点的 IP,
- 其它信息可使用提供的默认配置,不用修改。
my.cnf
[mysqld]
# 基础配置
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
pid-file = /var/run/mysqld/mysqld.pid
# 日志配置,启用慢查询
log-error = /var/log/mysqld.log
slow_query_log_file = /var/log/mysql-slow.log
slow_query_log = 1
# 慢查询时间,单位秒
long_query_time = 3
# 每台服务器唯一ID(31/32/33)
server_id=31
#配置物理内存的60%
innodb_buffer_pool_size = 8G
# binglog默认保留时间,单位秒
binglog_expire_logs_seconds = 432000
#最大连接数
max_connections = 4000
#binlog配置
log_bin = mysql-bin
sync_binlog = 5
gtid_mode = ON
enforce_gtid_consistency = ON
log_replica_updates = ON
relay_log_purge = 1
#开启独立表空间
innodb_file_per_table = ON
#隔离级别配置
transaction_isolation = READ-COMMITTED
#跳过DNS解析
skip_name_resolve = ON
#表名忽略大小写
lower_case_table_names = 1
#默认密码认证方式
default_authentication_plugin = mysql_native_password
replica_parallel_workers = 16
#刷盘配置
innodb_flush_log_at_trx_commit = 2
# redo log大小配置
innodb_redo_log_capacity = 2048M
symbolic-links = 0
#日志使用系统时区
log_timestamps = SYSTEM
# MGR专用配置
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
plugin_load_add='group_replication.so'
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
# 网络配置(按节点修改)
report_host="192.168.1.1"
loose_group_replication_local_address="192.168.1.1:33081"
loose_group_replication_group_seeds="192.168.1.1:33081,192.168.1.2:33081,192.168.1.3:33081"
# 包含MGR子配置
!include /etc/my.cnf.d/mgr.cnf
mgr.cnf
[mysqld]
#禁止非innodb的存储引擎
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 启用插件
plugin_load_add = 'group_replication.so'
plugin_load_add = 'mysql_clone.so'
loose_group_replication_group_name = "11dbbead-c9n2-5088-8tyy-89000e9c98c7"
loose_group_replication_start_on_boot = off
loose_group_replication_bootstrap_group = off
3.启动服务
# 启动服务
systemctl enable mysqld
systemctl start mysqld
4.初始化密码
# 查看临时密码
grep 'temporary password' /var/log/mysqld.log
# 登录修改密码
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Aksy@2024';
FLUSH PRIVILEGES;
四、MySQL MGR 集群配置
1.配置复制账户(所有节点执行)
SET SQL_LOG_BIN=0;
CREATE USER 'rpl_user'@'%' IDENTIFIED WITH mysql_native_password BY 'Aksy@2025';
GRANT REPLICATION SLAVE, CONNECTION_ADMIN, BACKUP_ADMIN, GROUP_REPLICATION_STREAM ON *.* TO 'rpl_user'@'%';
SET SQL_LOG_BIN=1;
2.启动 MGR 集群
- 引导节点(节点 1 执行):
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='Aksy@2025' FOR CHANNEL 'group_replication_recovery';
RESET MASTER; -- 新节点清空binlog
START GROUP_REPLICATION;
3.验证集群状态
SELECT * FROM performance_schema.replication_group_members;
预期输出:
+---------------------------+--------------------------------------+----------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+----------------+-------------+--------------+
| group_replication_applier | 66193f33-1b3a-11f0-baa4-fa163e4eaea8 | 192.168.1.1 | 3306 | ONLINE |
| group_replication_applier | 731980cf-1b3a-11f0-b53c-fa163e72584a | 192.168.1.2 | 3306 | ONLINE |
| group_replication_applier | 7836c66d-1b3a-11f0-a03e-fa163e720e55 | 192.168.1.3 | 3306 | ONLINE |
+---------------------------+--------------------------------------+----------------+-------------+--------------+
4.数据同步测试(节点 1 执行)
-- 在主节点创建数据
CREATE DATABASE test;
USE test;
CREATE TABLE t1(c1 INT PRIMARY KEY);
INSERT INTO t1 VALUES (RAND()*10240);
-- 在从节点验证
SELECT * FROM test.t1;
五、ProxySQL 安装与配置
1.安装 ProxySQL
yum install ./proxysql-2.7.3-1-centos7.x86_64.rpm -y
systemctl enable proxysql
systemctl start proxysql
2.初始化配置
mysql -uadmin -padmin -h127.0.0.1 -P6032
-- 修改管理员密码
UPDATE global_variables SET variable_value='admin:Aksy#2025@'
WHERE variable_name='admin-admin_credentials';
LOAD ADMIN VARIABLES TO RUNTIME;
SAVE ADMIN VARIABLES TO DISK;
3.添加 MySQL 节点
将所有 MGR 节点添加到 mysql_servers 表中,并分配到同一个读组(例如 hostgroup_id=2):
将节点都分到读组 2、写组 1,程序会自动检测,所以这里可以都配置为 2.
INSERT INTO mysql_servers(hostgroup_id, hostname, port, comment)
VALUES
(2, '192.168.1.1', 3306, 'MGR Primary'),
(2, '192.168.1.2', 3306, 'MGR Secondary'),
(2, '192.168.1.3', 3306, 'MGR Secondary');
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
4.配置 MGR 主机组
INSERT INTO mysql_group_replication_hostgroups (
writer_hostgroup, backup_writer_hostgroup, reader_hostgroup, offline_hostgroup,
active, max_writers, writer_is_also_reader, max_transactions_behind
) VALUES (
1, 4, 2, 3, -- 主机组ID
1, 1, 0, 1000 -- 策略参数
);
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
- writer_hostgroup=1:主节点所在的组。
- reader_hostgroup=2:从节点所在的组。
- max_writers=1:最多允许一个写节点。
- writer_is_also_reader=1:允许写节点同时作为读节点。
5.创建业务连接使用的用户
- MySQL 端创建用户:
创建一个写用户,一个读用户,一个 proxysql 监控使用的用户。
-- 写用户
CREATE USER 'write_user'@'%' IDENTIFIED BY 'write_Aksy@2026';
GRANT ALL ON *.* TO 'write_user'@'%';
-- 读用户
CREATE USER 'read_user'@'%' IDENTIFIED BY 'read_Aksy@2026';
GRANT SELECT ON *.* TO 'read_user'@'%';
-- 监控用户
CREATE USER 'monitor'@'%' IDENTIFIED BY 'Aksy@2025';
GRANT REPLICATION CLIENT, SELECT ON *.* TO 'monitor'@'%';
- ProxySQL 关联用户:
用户路由关联
INSERT INTO mysql_users(username, password, default_hostgroup, transaction_persistent, active)
VALUES
('write_user', 'write_Msxf@2026', 1, 1, 1),
('read_user', 'read_Msxf@2026', 2, 1, 1);
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
- 配置 proxysql 的监控 MySQL 用户
UPDATE global_variables SET variable_value='monitor'
WHERE variable_name='mysql-monitor_username';
UPDATE global_variables SET variable_value='Aksy@2025'
WHERE variable_name='mysql-monitor_password';
LOAD MYSQL USERS TO RUNTIME;
SAVE MYSQL USERS TO DISK;
六、验证与测试
1.检查 ProxySQL 路由
-- 查看运行时服务器状态
SELECT hostgroup_id, hostname, status FROM runtime_mysql_servers;
-- 预期输出(主节点自动分配至hostgroup 1):
+--------------+----------------+--------+
| hostgroup_id | hostname | status |
+--------------+----------------+--------+
| 1 | 192.168.1.1 | ONLINE |
| 2 | 192.168.1.2 | ONLINE |
| 2 | 192.168.1.3 | ONLINE |
+--------------+----------------+--------+
2.业务测试
# 写操作测试:
mysql -u write_user -pwrite_Aksy@2026 -h 192.168.1.1 -P 6033 -e "INSERT INTO test.t1 VALUES (RAND()*10000);"
# 读操作测试:
mysql -u read_user -pread_Aksy@2026 -h 192.168.1.1 -P 6033 -e "SELECT * FROM test.t1;"
确认查询成功,并且流量被路由到从节点。
3.故障转移验证
停止主节点 MySQL 服务:
systemctl stop mysqld
30 秒内 ProxySQL 自动提升新主节点:
SELECT hostgroup_id, hostname FROM runtime_mysql_servers WHERE status='ONLINE' AND hostgroup_id=1;
七、常见问题解决
1.ProxySQL 连接超时(ERROR 9001)
原因: 监控用户权限不足或网络不通
解决:
-- 检查监控用户权限
SHOW GRANTS FOR monitor@'%';
-- 测试监控连通性
mysql -umonitor -pAksy@2025 -h192.168.1.1 -e "SELECT 1"
2.MGR 节点无法加入集群
原因: server_id 冲突或防火墙阻止
解决:
# 检查端口连通性
telnet 192.168.1.1 33081
# 验证GTID一致性
SELECT @@gtid_mode, @@enforce_gtid_consistency;
3.数据不同步
排查步骤:
-- 检查复制延迟
SELECT * FROM performance_schema.replication_group_member_stats\G
-- 查看错误日志
tail -f /var/log/mysqld.log | grep 'replication'
4.修改 proxysql.cnf 配置文件后未生效
配置加载规则
ProxySQL 仅在以下情况读取 /etc/proxysql.cnf:
- 首次启动(或磁盘数据库文件 proxysql.db 不存在时);
- 使用 --initial 参数强制初始化。
- 其他时间修改该文件不会生效。
八、关键注意事项
1.生产环境密码需符合复杂度要求(示例密码仅用于测试)
2.RESET MASTER 仅在新节点加入时使用,生产环境慎用
3.ProxySQL 配置更新后必须执行 LOAD … TO RUNTIME 和 SAVE … TO DISK
通过本指南,您已完成高可用 MySQL 集群的部署,实现了读写分离与故障自动转移。