ProxySQL实现MySQL MGR读写分离配置实战
2026/8/9 21:36:07 网站建设 项目流程

1. 项目概述

在数据库架构设计中,读写分离是提升系统性能的经典方案。今天要分享的是基于ProxySQL中间件实现MySQL MGR集群的读写分离代理配置。这套方案在我们电商平台的订单系统中稳定运行了两年多,成功将数据库查询性能提升了3倍以上。

ProxySQL作为高性能MySQL代理,能够智能路由SQL请求到不同的数据库节点。而MySQL Group Replication(MGR)则提供了高可用的数据同步机制。两者的结合既保证了数据一致性,又实现了负载均衡。下面我就从实际配置角度,详细解析这个方案的实现过程。

2. 环境准备与架构设计

2.1 基础环境要求

在开始配置前,需要准备好以下环境:

  • 至少3个节点的MySQL MGR集群(推荐5.7.17以上版本)
  • 安装ProxySQL的服务器(建议2核4G配置)
  • 所有节点间网络延迟低于5ms
  • 操作系统建议使用CentOS 7.6+

重要提示:MGR集群必须已经完成初始化并正常运行,可以通过SELECT * FROM performance_schema.replication_group_members;命令验证集群状态。

2.2 架构拓扑设计

我们采用的典型部署架构如下:

应用层 → ProxySQL → [MGR主节点] → [MGR从节点1] ↘ [MGR从节点2]

这种架构下:

  • 所有写操作自动路由到MGR主节点
  • 读操作均匀分配到各个从节点
  • ProxySQL会实时监测节点状态,自动剔除故障节点

3. ProxySQL核心配置详解

3.1 安装与初始化

首先在代理服务器安装ProxySQL:

# CentOS系统 yum install -y proxysql mysql-client systemctl start proxysql systemctl enable proxysql

初始化管理界面连接:

mysql -u admin -padmin -h 127.0.0.1 -P 6032 --prompt='ProxySQL> '

3.2 后端服务器配置

在ProxySQL中添加MGR集群节点:

INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,'mgr-node1',3306), (20,'mgr-node2',3306), (20,'mgr-node3',3306);

这里将hostgroup_id设为:

  • 10:写组(主节点)
  • 20:读组(从节点)

3.3 监控账户配置

创建监控账号并设置检查参数:

UPDATE global_variables SET variable_value='monitor' WHERE variable_name='mysql-monitor_username'; UPDATE global_variables SET variable_value='monitor_password' WHERE variable_name='mysql-monitor_password'; LOAD MYSQL VARIABLES TO RUNTIME; SAVE MYSQL VARIABLES TO DISK;

3.4 读写分离规则配置

定义路由规则实现读写分离:

INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*FOR UPDATE',10,1), (2,1,'^SELECT',20,1), (3,1,'^INSERT',10,1), (4,1,'^UPDATE',10,1), (5,1,'^DELETE',10,1); LOAD MYSQL QUERY RULES TO RUNTIME; SAVE MYSQL QUERY RULES TO DISK;

4. MGR集群适配配置

4.1 节点权重设置

根据服务器配置设置不同的读权重:

UPDATE mysql_servers SET weight=100 WHERE hostname='mgr-node2'; UPDATE mysql_servers SET weight=80 WHERE hostname='mgr-node3';

4.2 故障转移配置

设置自动故障检测参数:

UPDATE global_variables SET variable_value='2000' WHERE variable_name='mysql-monitor_connect_timeout'; UPDATE global_variables SET variable_value='3000' WHERE variable_name='mysql-monitor_read_only_timeout'; LOAD MYSQL VARIABLES TO RUNTIME; SAVE MYSQL VARIABLES TO DISK;

5. 性能优化实战技巧

5.1 连接池配置建议

根据业务特点调整连接池:

UPDATE mysql_servers SET max_connections=300 WHERE hostgroup_id=10; UPDATE mysql_servers SET max_connections=500 WHERE hostgroup_id=20;

5.2 查询缓存优化

启用查询缓存并设置合理大小:

UPDATE global_variables SET variable_value='true' WHERE variable_name='mysql-query_cache_enabled'; UPDATE global_variables SET variable_value='256M' WHERE variable_name='mysql-query_cache_size';

6. 常见问题排查指南

6.1 连接失败问题

检查项:

  1. 网络连通性:telnet mgr-node1 3306
  2. 账号权限:确保proxy用户有足够权限
  3. 防火墙设置:开放3306和6032端口

6.2 读写分离失效

诊断步骤:

SELECT * FROM stats_mysql_query_digest ORDER BY sum_time DESC LIMIT 10;

查看SQL实际路由情况,检查规则是否生效。

6.3 性能瓶颈分析

关键监控指标:

SELECT * FROM stats_mysql_connection_pool; SELECT * FROM stats_mysql_global;

重点关注连接复用率和查询延迟。

7. 生产环境维护建议

  1. 定期检查ProxySQL日志:
tail -f /var/lib/proxysql/proxysql.log
  1. 配置监控告警,重点关注:
  • 节点健康状态
  • 连接池使用率
  • 查询响应时间
  1. 每季度进行一次配置审计:
SAVE MYSQL CONFIG TO FILE '/tmp/proxysql_config_audit.sql';

这套配置在我们生产环境中日均处理2000万+查询请求,平均延迟控制在15ms以内。最关键的是要定期根据业务增长调整连接池和缓存参数。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询