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

MySQL读写分离

一、读写分离的核心概念与价值

1.读写分离的定义

读写分离(Read/Write Splitting) 是一种数据库架构设计策略,通过将数据库的写操作(INSERT、UPDATE、DELETE) 与读操作(SELECT) 分别路由到不同的数据库节点,以提升系统的并发处理能力、降低单点负载压力,并增强数据服务的可用性。其核心思想是:

  • 写操作:仅由主库(Master)处理,确保数据强一致性。
  • 读操作:分发到多个从库(Slave),利用多节点并行处理提升查询效率。

2.读写分离的应用场景

  1. 高并发读场景:如电商平台的商品浏览、社交媒体的内容加载等,读请求占比通常通过80%。
  2. 数据实时性要求较低的场景:如报表生成、数据分析等,允许短暂的主从延迟。
  3. 容灾与备份要求:从库可作为主库的实时备份,主库故障时可快速切换。

3.读写分离的核心价值

  • 性能提升:通过多从库分担读压力,主库可专注于写操作,避免资源争用。
  • 高可用性:主从架构支持故障转移,降低服务中断风险。
  • 扩展性增强:从库可水平扩展,适应业务增长需求。

二、读写分离的实现原理与技术选型

1.读写分离的底层依赖:主从复制

读写分离的实现依赖于MySQL读写分离(Master-Slave Replication),其核心流程如下:

1.主库(Master):

  • 所有事务操作记录到二进制日志(Binlog)。
  • 通过log-bin参数启用binlog,并设置格式(Statement/Row/Mixed)。

2.从库(Slave):

  • I/O线程:连接主库,拉取Binlog并写入中继日志(Relay Log)。
  • SQL线程:解析Relay Log,在从库重发SQL操作,实现数据同步。

关键限制:

  • 主从复制为异步或半同步模式,可能存在毫秒级延迟。
  • 从库的SQL线程单线程执行,复杂事务可能导致同步延迟。

2.读写分离的实现方式对比

(1)基于程序代码的读写分离

  • 原理:在应用层代码中根据SQL类型(SELECT/非SELECT)动态选择数据源。
  • 优点:
    • 性能高:无中间件开销,直接连接数据库。
    • 灵活性:可根据业务逻辑定制路由规则(如分库分表)
  • 缺点:
    • 侵入性强:需修改代码,增加开发与维护成本。
    • 难以适配复杂架构:如多语言微服务场景需重复开发。

典型框架:

  • Spring AOP:通过切面编程动态切换数据源。
  • ShardingSphere-JDBC:透明化读写分离,支持复杂分片策略。

(2)基于中间件代理的读写分离

  • 原理:在应用与数据库之间部署代理层,由中间件自动解析SQL并路由请求。
  • 优点:
    • 对应用透明:无需修改代码,仅需调整连接配置。
    • 统一管理:支持负载均衡、故障转移、SQL审计等功能。
  • 缺点:
    • ​​​​​​​性能损耗:中间件可能成为瓶颈,需优化网络与资源分配。
    • 运维复杂度:需维护中间件的高可用性。

典型工具:

  • MyCAT:开源分布式数据库中间件,支持MySQL协议与多数据库后端。
  • Amoeba:轻量级代理,适合简单读写分离场景。
  • ProxySQL:高性能SQL代理,支持动态路由与查询缓存。

3.技术选型建议

场景推荐方案理由
单体应用代码层实现(如Spring AOP)

开发成本低,性能最优。

微服务架构中间件代理(如MyCAT)避免多语言重复开发。统一管理数据源。
高并发与高可用ProxySQL+主从集群支持动态负载与故障自动切换。

三、MyCAT中间件与配置实战

1.MyCAT的核心功能

  • 读写分离:自动路由写请求到主库,读请求到从库。
  • 分库分表:支持水平分片,解决单表数据量过大的问题。
  • 多数据库支持:兼容MySQL、Oracle、PostgreSQL等。
  • 负载均衡:提供轮询、权重、一致性哈希等策略。

2.MyCAT架构解析

  • 前端协议:模拟MySQL协议,应用无需修改代码。
  • 后端连接:通过JDBC或原生协议连接数据库。
  • 核心组件:
    • ​​​​​​​Schema:逻辑数据库,映射物理数据库集群。
    • DataNode:物理分片节点,对应实际数据库实例。
    • Rule:分片规则,定义数据分布策略。

3.MyCAT读写分离配置全流程

环境准备

  • 服务器规划:
角色IP地址说明
MyCTA代理192.168.10.104允许MyCAT2中间件
MySQL主库192.168.10.101处理写操作
MySQL从库1192.168.10.102处理读操作
MySQL从库2192.168.10.103处理读操作
  • 依赖安装:
# 安装JDK(MyCAT依赖Java环境)
dnf install jdk-8u171-linux-x64.rpm

步骤1:部署MyCAT

1.解压安装包:

unzip mycat2-install-template-1.20.zip -d /usr/local/
mv /usr/local/mycat2-install-template-1.20 /usr/local/mycat

2.配置环境变量:

echo 'export PATH=$PATH:/usr/local/mycat/bin' >> /etc/profile
source /etc/profile

3.添加依赖库:

cp mycat2-1.21-release-jar-with-dependencies.jar /usr/local/mycat/lib/
cp mysql-connector-java-8.0.18.jar /usr/local/mycat/lib/

步骤2:配置数据源

1.创建MyCAT用户(需在主库上执行):

CREATE USER 'mycat'@'%' IDENTIFIED BY 'pwd123';
GRANT ALL PRIVILEGES ON *.* TO 'mycat'@'%';
ALTER USER 'mycat'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd123';
FLUSH PRIVILEGES;

2.定义数据源(通过MyCAT管理界面):

/*+ mycat:createDataSource{"name":"master","url":"jdbc:mysql://192.168.10.101:3306/?useSSL=false&characterEncoding=UTF-8","user":"mycat","password":"pwd123","instanceType":"WRITE"
} */;/*+ mycat:createDataSource{"name":"slave1","url":"jdbc:mysql://192.168.10.102:3306/?useSSL=false&characterEncoding=UTF-8","user":"mycat","password":"pwd123","instanceType":"READ"
} */;

步骤3:定义集群与负载均衡

1.创建集群:

/*! mycat:createCluster{"name":"cls01","masters":["master"],"replicas":["slave1","slave2"]
} */;

2.配置负载均衡策略:

  • 修改server.json,设置defaultLoadBalance 为BalanceRoundRobin(轮询)

  • {"loadBalance": {"defaultLoadBalance": "BalanceRoundRobin","loadBalances": []}
    }

    3.重启MyCAT服务:

mycat restart

步骤4:验证读写分离

1.创建测试库表:

CREATE DATABASE test;
USE test;
CREATE TABLE zang (id INT, name VARCHAR(10), address VARCHAR(20));

2.写入主库:

INSERT INTO zang VALUES (1, 'zhang', 'this_is_master');

3.从库插入测试数据(停止主从复制后):

-- 在Slave1执行
INSERT INTO zang VALUES (2, 'zhang', 'this_is_slave1');-- 在Slave2执行
INSERT INTO zang VALUES (3, 'zhang', 'this_is_slave2');

4.查询验证:

SELECT * FROM zang;  -- 多次执行,结果应轮询显示Slave1和Slave2的数据

四、读写分离的优化与故障处理

1.性能优化策略

  • 从库扩展:增加从库数量,提升读吞吐量。
  • 缓存层引入:如Redis缓存热点数据,减少数据库查询压力。
  • SQL优化:避免全表扫描,合理使用索引。

2.常见问题与解决方案

问题现象原因分析解决方案
读请求未分发到从库中间件配置错误

检查数据源定义与集群状态。

主从延迟导致脏读同步延迟过高启用半同步复制或调整业务容忍度
中间件单点故障代理层未做高可用部署MyCAT集群,结合Keepalived

五、总结与展望

读写分离是构建高性能、高可用数据库架构的核心技术之一。通过合理选择实现方式(代码层或中间件)、精细配置数据路由策略,并结合主从复制与负载均衡,可显著提升系统的并发处理能力与容灾水平。未来,随着云原生与分布式数据库的普及,读写分离将进一步与容器化、自动化运维结合,为企业级应用提供更强大的数据服务支撑。

http://www.xdnf.cn/news/465247.html

相关文章:

  • 深入解析C++模板:从基础到高级应用
  • LeetCode 热题 100 437. 路径总和 III
  • 运维职业发展思维导图
  • 建筑兔零基础人工智能自学记录92|类脑智能与脑机接口-7
  • vue3搭建脚手架前的前置知识
  • 【Unity】给出两个旋转角度,判断是应该左转还是右转
  • QT设置MySQL驱动
  • 已解决(亲测有效!):安装部署Docker Deskpot之后启动出现Docker Engine Stopped!
  • 11 web 自动化之 DDT 数据驱动详解
  • 文件目录与检索综合练习题
  • 面试 Linux 运维相关问题
  • 基于SpringBoot的家政服务系统设计与实现(源码+文档+部署讲解)
  • 20、鸿蒙学习——OAID、AAID、ODID
  • openEuler24.03 LTS下安装MySQL8.0.42
  • 气动排渣煤粉炉专用V型球阀——法兰连接耐磨阀门生产厂家解析-耀圣
  • 详解 Zephyr RTOS:架构、功能与开发指南
  • Function Calling
  • 106. 从中序与后序遍历序列构造二叉树
  • 【206】VS2022 C++ 实现无符号32位整数和IP地址字符串互相转换
  • element-ui的el-cascader增加全选按钮实现(附源码)
  • DB-GPT扩展自定义app配置说明
  • 【网络编程】九、详解 HTTPS 加密原理
  • 鸿蒙 ArkUI - ArkTS 组件 官方 UI组件 合集
  • AEO认证的好处 ,如何快速获取AEO认证?
  • Java应用OOM排查:面试通关“三部曲”心法
  • android display 笔记(十四)VAU 和GSP 分别代表什么
  • fpga系列 HDL : Microchip FPGA开发软件 Libero Soc 安装 license申请
  • 企业级Javaweb开发常用注解
  • macOS中5000端口被控制中心占用问题
  • 洛谷P4907题解