基于 MySQL 8.0.40 MGR 与 ProxySQL 的高可用集群部署实践

构建高可用 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 集群的部署,实现了读写分离与故障自动转移。


🔔 请问解决你的问题了吗?请关注我,干货持续更新!欢迎留言!!!咱们“ 键上江湖 ”见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值