当前位置: 首页 > news >正文

搭建MySQL读写分离

目录

一、原理与架构(读写分离如何工作)

二、为什么需要读写分离?

三、搭建步骤(基于ProxySQL v2.4)

🌟 环境拓扑

🔧 1. 安装ProxySQL(Ubuntu示例)

🔧 2. 配置后端数据库

🔧 3. 配置路由规则(核心!)

🔧 4. 应用连接配置

✅ 验证读写分离

期望输出:

四、常见问题与解决方案

五、总结与最佳实践


一、原理与架构(读写分离如何工作)

✅ 流量分发逻辑

✅ 核心组件作用

组件功能说明
ProxySQLSQL流量识别与路由(C++开发,高性能)
Query Rules基于正则的读写分离规则
Host Groups主库组(写)与从库组(读)分组管理

📌 智能路由原理

  1. 解析SQL语句类型(SELECT/INSERT/UPDATE)

  2. 写操作强制路由到主库组(HG=10)

  3. 读操作负载均衡到从库组(HG=20)

  4. 支持事务内强制走主库(避免读延迟)


二、为什么需要读写分离?

痛点场景读写分离解决方案
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  # 延迟超时剔除

五、总结与最佳实践

  1. 路由策略进阶

    • 分库分表:通过sharding_key实现水平拆分

    • 读写分治:将/report/路径的查询路由到专用分析库

  2. 高可用方案

    • 双ProxySQL节点 + Keepalived VIP

    • 自动故障切换脚本

  3. 监控三板斧

    proxysql-admin --stats    # 实时性能指标
    Grafana + ProxySQL Exporter # 可视化监控
    SELECT * FROM monitor.mysql_server_ping_log; # 节点健康

  4. 黄金法则

    ⚠️ 永远在预发布环境测试路由规则
    ✅ 读写分离不是银弹,配合缓存和索引优化才是王道


文章转载自:
http://briarwood.gbfuy28.cn
http://agro.gbfuy28.cn
http://biting.gbfuy28.cn
http://aeg.gbfuy28.cn
http://acrr.gbfuy28.cn
http://bradawl.gbfuy28.cn
http://atmological.gbfuy28.cn
http://beaverette.gbfuy28.cn
http://actinograph.gbfuy28.cn
http://blewits.gbfuy28.cn
http://chrysler.gbfuy28.cn
http://boiloff.gbfuy28.cn
http://bridgebuilder.gbfuy28.cn
http://cantonal.gbfuy28.cn
http://baume.gbfuy28.cn
http://carmaker.gbfuy28.cn
http://chant.gbfuy28.cn
http://aeroplanist.gbfuy28.cn
http://baseman.gbfuy28.cn
http://catamite.gbfuy28.cn
http://chrysographed.gbfuy28.cn
http://chorten.gbfuy28.cn
http://alundum.gbfuy28.cn
http://arras.gbfuy28.cn
http://catilinarian.gbfuy28.cn
http://causation.gbfuy28.cn
http://banket.gbfuy28.cn
http://bintree.gbfuy28.cn
http://bludgeon.gbfuy28.cn
http://chiropractor.gbfuy28.cn
http://www.dtcms.com/a/276255.html

相关文章:

  • LiteFlow源码
  • Mamba架构的模型 (内容由deepseek辅助汇总)
  • 手把手教你 Aancond 的下载与 YOLOV13 部署(环境的创建及配置下载)以及使用方法,连草履虫都能学会的目标检测实验!
  • net.createServer详解
  • Python后端项目之:我为什么使用pdm+uv
  • 模拟注意力:少量参数放大 Attention 表征能力
  • hiredis: 一个轻量级、高性能的 C 语言 Redis 客户端库
  • 深入解析C#接口实现的两种核心技术:派生继承 vs 显式实现
  • Java 21 虚拟线程
  • 浏览器宏任务的最小延时:揭开setTimeout 4ms的神话
  • java中的main方法
  • window7,windows10,windows11种系统之间实现打印机共享
  • 创客匠人:从定位逻辑看创始人 IP 如何驱动 IP 变现
  • CompareFace使用
  • Kimi K2万亿参数开源模型原理介绍
  • 【读书笔记】《C++ Software Design》第二章:The Art of Building Abstractions
  • Ruby如何采集直播数据源地址
  • OpenEuler操作系统中检测插入的USB设备并自动挂载
  • 【数据结构】反射、枚举 和 lambda表达式
  • Golang 面向对象(封装、继承、多态)
  • 【C语言】指针进阶:指针和数组
  • 手把手教你用YOLOv10打造智能垃圾检测系统
  • 第七章应用题
  • Geant4 安装---Ubuntu
  • 一篇博客学习Lua_安装使用+语法详解
  • Lua ADB 接口文档
  • RMSNorm实现
  • 2.单例模式
  • Vim的magic模式
  • blender uv小技巧