搭建MySQL读写分离
目录
一、原理与架构(读写分离如何工作)
二、为什么需要读写分离?
三、搭建步骤(基于ProxySQL v2.4)
🌟 环境拓扑
🔧 1. 安装ProxySQL(Ubuntu示例)
🔧 2. 配置后端数据库
🔧 3. 配置路由规则(核心!)
🔧 4. 应用连接配置
✅ 验证读写分离
期望输出:
四、常见问题与解决方案
五、总结与最佳实践
一、原理与架构(读写分离如何工作)
✅ 流量分发逻辑:
✅ 核心组件作用:
组件 | 功能说明 |
---|---|
ProxySQL | SQL流量识别与路由(C++开发,高性能) |
Query Rules | 基于正则的读写分离规则 |
Host Groups | 主库组(写)与从库组(读)分组管理 |
📌 智能路由原理:
解析SQL语句类型(SELECT/INSERT/UPDATE)
写操作强制路由到主库组(HG=10)
读操作负载均衡到从库组(HG=20)
支持事务内强制走主库(避免读延迟)
二、为什么需要读写分离?
痛点场景 | 读写分离解决方案 |
---|---|
80%查询+20%写入 | 读压力分散到多个从库 |
报表拖垮生产库 | OLAP查询定向到专用从库 |
主库CPU常年90%+ | 写操作独占主库资源 |
故障恢复慢 | 读流量自动剔除故障节点 |
实测收益(电商业务案例):
-
主库QPS下降68%
-
平均查询响应时间从350ms→120ms
-
服务器成本减少40%(替代垂直扩容)
三、搭建步骤(基于ProxySQL v2.4)
🌟 环境拓扑
主库: 192.168.1.100 # 写操作 (HostGroup 10)
从库1:192.168.1.101 # 读操作 (HostGroup 20)
从库2:192.168.1.102 # 读操作 (HostGroup 20)
ProxySQL:192.168.1.200 # 中间件
🔧 1. 安装ProxySQL(Ubuntu示例)
wget https://github.com/sysown/proxysql/releases/download/v2.4.0/proxysql_2.4.0-ubuntu20_amd64.deb
sudo dpkg -i proxysql_2.4.0-ubuntu20_amd64.deb
systemctl start proxysql
🔧 2. 配置后端数据库
-- 在ProxySQL管理端(6032端口)执行
INSERT INTO mysql_servers(hostgroup_id, hostname, port) VALUES
(10, '192.168.1.100', 3306), -- 主库组
(20, '192.168.1.101', 3306), -- 从库组
(20, '192.168.1.102', 3306);-- 创建监控账号(所有数据库节点执行)
CREATE USER 'monitor'@'%' IDENTIFIED BY 'MonitorP@ss';
GRANT REPLICATION CLIENT ON *.* TO 'monitor'@'%';
🔧 3. 配置路由规则(核心!)
-- 创建读写分离路由规则
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, '.*', 10, 1); -- 其他操作走主库-- 配置负载均衡算法(轮询)
UPDATE mysql_servers SET weight=1 WHERE hostgroup_id=20;-- 保存并激活配置
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
🔧 4. 应用连接配置
# 应用端连接配置(替代直连MySQL)
jdbc:mysql://192.168.1.200:6033/db_name?user=app_user&password=AppP@ss
✅ 验证读写分离
# 在ProxySQL监控端查看路由效果
SELECT hostgroup, digest_text
FROM stats_mysql_query_digest
ORDER BY last_seen DESC LIMIT 5;
期望输出:
SELECT * FROM products => hostgroup=20
UPDATE orders SET ... => hostgroup=10
四、常见问题与解决方案
故障现象 | 排查工具 | 解决方案 |
---|---|---|
读请求仍到主库 | stats_mysql_query_rules | 检查正则匹配规则顺序 |
从库延迟导致脏读 | SHOW SLAVE STATUS | 路由延迟超过500ms的从库 |
ProxySQL内存溢出 | top -p $(pidof proxysql) | 调整mysql-query_cache_size |
连接池耗尽 | stats_mysql_connection_pool | 增加mysql-max_connections |
💡 性能调优参数:
mysql-interfaces = 0.0.0.0:6033 mysql-max_connections = 2048 mysql-monitor_slave_lag_when_null = 60 # 延迟超时剔除
五、总结与最佳实践
-
路由策略进阶:
-
分库分表:通过
sharding_key
实现水平拆分 -
读写分治:将
/report/
路径的查询路由到专用分析库
-
-
高可用方案:
-
双ProxySQL节点 + Keepalived VIP
-
自动故障切换脚本
-
-
监控三板斧:
proxysql-admin --stats # 实时性能指标 Grafana + ProxySQL Exporter # 可视化监控 SELECT * FROM monitor.mysql_server_ping_log; # 节点健康
-
黄金法则:
⚠️ 永远在预发布环境测试路由规则
✅ 读写分离不是银弹,配合缓存和索引优化才是王道