09-主从复制与读写分离:MySQL走向分布式的第一步
主从复制与读写分离MySQL走向分布式的第一步作者黒漂技术佬适用读者单机MySQL扛不住了想搞主从但不知道原理和坑的同学关联场景无人售货柜多门店数据架构、智慧农业多基地数据汇总一、为什么需要主从复制单机的三道天花板单机MySQL用着用着会遇到三堵墙天花板1高可用 - 一台MySQL挂了整个业务停摆 - 售货柜1000台断网2小时订单全丢 - 需要一台备机顶上 天花板2读压力大 - 售货柜展示商品列表、查询订单状态——全是读 - 高峰期1000 QPS的读压到一台机器 - CPU打满写也跟着卡 天花板3数据隔离 - 报表分析跑大查询把生产库拖垮 - 想做备份又怕影响线上主从复制就是解决这三个问题的基础设施一主多从主库写从库读主挂了从顶上。二、主从复制原理binlog→relay log→回放2.1 三个角色角色说明主库(Master)接收写请求把变更记到binlog从库(Slave)连主库拉binlog回放到自己binlog/relay log主的binlog是变更源头从的relay log是中转2.2 复制的三个线程主库Binlog Dump Thread → 负责把binlog发送给从库 从库 IO Thread → 接收主库binlog写到本地relay log SQL Thread → 读relay log回放到从库数据文件2.3 完整流程主库 从库 写请求 → 修改数据 → 写binlog Binlog Dump Thread IO Thread ─────── binlog event ──────→ 收到event写relay log relay log落盘 SQL Thread 读relay log回放SQL → 修改从库数据详细步骤从库执行CHANGE MASTER TO ...配置主库地址START SLAVE从库IO Thread连接主库请求从某个binlog位点开始拉数据主库Binlog Dump Thread读binlog发给从库从库IO Thread把event写入relay log中继日志从库SQL Thread读relay log重放里面的SQL更新数据从库和主库数据一致这是个异步逻辑——主库写完binlog就返回客户端成功不等从库同步完。所以会有主从延迟。三、三种复制方式异步、半同步、组复制3.1 异步复制默认主库写完binlog立即返回客户端不等从库确认。主库 从库 写完binlog 返回客户端 ✓ 还在同步中 ... 同步完成优点性能好主库几乎不被从库拖累。缺点主库挂了从库可能还没同步完最新数据 → 数据丢失。# 主库配置 [mysqld] log_bin mysql-bin server_id 13.2 半同步复制主库写完binlog至少等一个从库收到binlog并写relay log确认才返回客户端成功。主库 从库 写binlog ──── binlog ────→ 收到写relay log回复ACK 收到从库ACK ✓ 返回客户端 ✓优点数据安全性高至少有一个从库收到了数据。缺点比异步慢一点多一个RTT从库全挂时主库会降级成异步或阻塞。# 主库配置 [mysqld] plugin_load rpl_semi_sync_mastersemisync_master.so rpl_semi_sync_master_enabled 1 rpl_semi_sync_master_timeout 3000 # 3秒等不到ACK降级为异步 # 从库配置 [mysqld] plugin_load rpl_semi_sync_slavesemisync_slave.so rpl_semi_sync_slave_enabled 13.3 组复制MGRMySQL Group Replication多个节点组成一个组用Paxos协议保证数据一致性。任何节点都能写写完同步到全组。MGR集群 节点1 (主) ←→ 节点2 ←→ 节点3 写请求 → Paxos共识 → 全组同步 → 返回优点真正的高可用任何单点挂了集群照常工作多主可写。缺点配置复杂写性能受共识协议拖累至少过半数节点确认。复制方式性能数据安全复杂度适用场景异步最高一般可能丢低读多写少、容忍少量丢失半同步中高中大多数生产场景MGR较低极高高强一致性要求高选型建议普通业务用半同步金融级用MGR。异步复制只用在纯读从库或测试环境。四、主从延迟原因和解决方案4.1 延迟怎么来的异步复制下从库的数据总是落后主库一段时间——这就是主从延迟。延迟的几个成因SQL Thread单线程回放主库多线程并发写从库单线程串行回放写压力大时从库追不上。MySQL 5.7有并行复制基于group commit5.6及之前是硬伤。网络延迟主从跨机房跨地域binlog传输慢。从库压力从库被大查询占用CPU/IO回放速度下降。大事务一个事务里有10万条UPDATE主库几秒写完从库要回放十几秒。4.2 怎么看延迟-- 从库执行SHOWSLAVESTATUS\G-- 关注-- Seconds_Behind_Master: 5 落后主库5秒-- Slave_IO_Running: Yes-- Slave_SQL_Running: Yes4.3 解决方案延迟优化清单 1. 开启并行复制MySQL 5.7 slave_parallel_type LOGICAL_CLOCK slave_parallel_workers 8 2. 减少大事务 把UPDATE 10万行拆成多次小批量 3. 从库SSD 大内存 回放是IO密集型硬件要跟上 4. 业务读走从库时容忍延迟 重要读扣库存前查余额走主库 普通读列表展示走从库真实踩坑用户刚下完单立刻查订单列表查不到——因为写走主库读走从库从库还在同步。这种叫读写一致性问题。解法关键查询走主库或用ShardingSphere的读写一致性策略。五、读写分离架构主库写、从库读5.1 架构图应用层 ↓ ┌───────────────┐ │ 读写分离中间件 │ └───────────────┘ ↓ 写 ↓ 读 主库 从库1 从库2 从库3 (写强一致读) (读分担)读写分离的核心思想写请求必须走主库只有主库能写读请求尽量走从库分担压力。5.2 哪些读必须走主库必须走主库的读 1. 写完立刻要读的场景保证读到自己刚写的数据 2. 涉及金额、库存的关键判断 3. 事务内的查询事务要读到最新数据 可以走从库的读 1. 商品列表、订单历史 2. 报表统计 3. 用户头像、昵称展示六、读写分离的实现方案6.1 ShardingSphere-JDBCApache ShardingSphere提供JDBC层的读写分离应用无需改代码配置一下就能用。spring:shardingsphere:datasource:names:master,slave0,slave1master:type:com.zaxxer.hikari.HikariDataSourcedriver-class-name:com.mysql.cj.jdbc.Driverjdbc-url:jdbc:mysql://master-db:3306/shopusername:rootpassword:xxxslave0:# 从库0配置jdbc-url:jdbc:mysql://slave0-db:3306/shopslave1:# 从库1配置jdbc-url:jdbc:mysql://slave1-db:3306/shoprules:readwrite-splitting:data-sources:readwrite_ds:write-data-source-name:masterread-data-source-names:slave0,slave1load-balancer-name:round_robinload-balancers:round_robin:type:ROUND_ROBIN# 轮询负载均衡ShardingSphere根据SQL类型自动路由INSERT/UPDATE/DELETE → 主库SELECT → 从库。事务内的所有SQL都走主库。// 普通查询走从库自动路由ListProductlistproductMapper.selectList(...);// 事务内走主库TransactionalpublicvoidplaceOrder(){productMapper.update(...);// 写主库productMapper.selectList();// 也在主库同事务}6.2 MyCatMyCat是独立的数据库中间件应用连接MyCatMyCat再连后端真实数据库。配置比ShardingSphere重但功能全。!-- schema.xml --schemanameshoptablenameproductdataNodedn1//schemadataHostnamehost1balance2writeType0writeHosthostmasterurlmaster-db:3306/readHosthostslave0urlslave0-db:3306/readHosthostslave1urlslave1-db:3306//dataHost方案部署方式改造成本适合ShardingSphere-JDBC应用内jar包低改配置Java应用为主MyCat独立中间件中多一层运维多语言混合环境选型原则纯Java应用优先ShardingSphere-JDBC部署简单、性能损耗低。多语言或需要独立DB代理层再考虑MyCat。七、主从切换和故障恢复7.1 主库挂了怎么办主库故障的恢复流程1. 检测监控发现主库不可达 2. 选新主从多个从库里选一个数据最新的 Seconds_Behind_Master最小 3. 提升把选中的从库提升为新主 STOP SLAVE; RESET SLAVE ALL; SET GLOBAL read_only OFF; 4. 应用切流量把应用的数据源指向新主 5. 旧主恢复作为从库重新加入集群7.2 自动切换工具手动切换太慢生产用自动化工具工具说明MHAMaster High Availability老牌方案监控自动切换Orchestrator拓扑管理故障切换Web界面MGR组复制自带故障切换无需外部工具壳厂中间件ShardingSphere可配合注册中心做自动切换# MHA Manager监控主库masterha_manager--conf/etc/mha/shop.cnf# 主库挂掉时MHA自动# 1. 选出从库中binlog最新的# 2. 把其他从库的relay log补到选中的从库# 3. 提升为新主把其他从库重新指向新主切换不是万能的数据丢失是切换时最头疼的问题。半同步复制延迟监控能大幅降低丢数据概率。八、结合无人售货柜多门店数据架构8.1 业务场景某无人售货柜运营平台覆盖200个城市、5000台柜子。数据架构需求每个门店区域有本地数据库写本地订单总部要查所有门店数据做报表单台柜子挂了不影响其他门店总部做活动时配置要下发到所有门店8.2 架构设计总部数据中心 ↑ 汇聚 ┌──────────────┼──────────────┐ 华北区 华东区 华南区 (主2从) (主2从) (主2从) ↓ ↓ ↓ 门店1-50 门店51-200 门店201-500设计要点分区域部署主从集群每个区域一套主从区域写本地数据避免跨区域网络延迟。总部只读从库区域主库通过半同步复制到总部只读节点总部查只读节点。门店数据通过门店ID分库db_shop_001~db_shop_500按门店ID取模分库。配置下发用消息队列总部配置变更发到Kafka各区域消费写到本地。8.3 读写分离在售货柜场景的具体应用// 用户查询商品列表 → 走从库读多容忍秒级延迟GetMapping(/products)publicListProductlistProducts(LongcabinetId){returnproductService.listByCabinet(cabinetId);// 自动走从库}// 用户下单扣库存 → 走主库必须强一致TransactionalpublicvoidplaceOrder(OrderRequestreq){productMapper.deductStock(req.getProductId());// 写主库orderMapper.insert(buildOrder(req));// 写主库}// 售货柜状态监控 → 走从库GetMapping(/cabinet/status)publicCabinetStatusstatus(LongcabinetId){returncabinetService.getStatus(cabinetId);// 从库}经验售货柜场景的读写比例通常10:1甚至更高查商品、查订单、查状态远多于下单读写分离的收益非常明显。从库分担了90%的读压力主库只专注写和关键读。九、总结概念一句话主从复制原理主写binlog→从拉relay log→SQL Thread回放三种复制异步快但可能丢、半同步折中、MGR强一致主从延迟从库回放慢于主库写入靠并行复制小事务缓解读写分离写走主库读走从库靠ShardingSphere/MyCat路由故障切换选最新从库→提升为主→应用切流量用MHA/Orchestrator自动化多门店架构区域分库总部汇聚从库读写分离分担读压力主从复制是MySQL从单机走向分布式的第一步。但单库容量到天花板单表5000万行变慢主从也救不了——这就需要分库分表。下一篇我们聊高可用与分库分表。

相关新闻

DeepSeek Harness 接入 Litefuse:完善 Agent 可观测与评估能力

DeepSeek Harness 接入 Litefuse:完善 Agent 可观测与评估能力

DeepSeek 发布官方 Agent —— DeepSeek Harness 后,很快引起了业界广泛关注,GitHub Star 短短几天便超过 15 万。 Litefuse 第一时间开发了 DeepSeek Harness 插件 dsh-litefuse-plugin,为 DeepSeek Harness 提供 Agent 可观测能力。接入后…

2026/8/18 22:18:26 阅读更多 →
Three.js太阳系3D可视化实战:从零构建行星轨道动画与交互场景

Three.js太阳系3D可视化实战:从零构建行星轨道动画与交互场景

最近在做一个数据可视化大屏项目,需要展示太阳系行星的运行轨迹,尝试了多种方案后,最终选择了 Three.js。不得不说,用它来构建3D宇宙场景,效果确实震撼。但过程中也踩了不少坑,比如模型加载一片黑、坐标转换…

2026/8/18 22:18:26 阅读更多 →
正式评优线上投票如何落地?工具选型与风控实战参考

正式评优线上投票如何落地?工具选型与风控实战参考

又到年中评优季。不少企业的HR和行政又开始头疼:传统“领导拍板”容易引发公平性质疑,纸质投票统计耗时费力,微信群接龙则分分钟被刷票攻陷。线上投票系统成了刚需,但选什么工具、怎么防刷,是两道绕不过的坎。 今天这…

2026/8/18 22:18:25 阅读更多 →

最新新闻

FreeRTOS任务机制详解:从创建、调度到实战优化

FreeRTOS任务机制详解:从创建、调度到实战优化

1. 项目概述:从裸机思维到RTOS任务观的转变 刚接触FreeRTOS时,很多从单片机裸机开发转过来的朋友,包括我自己,都会有一个困惑:我写的 main 函数里那个 while(1) 大循环,不就是我的“任务”吗&#xff1…

2026/8/18 23:38:18 阅读更多 →
嵌入式Android开发学习路径:从C语言到AOSP定制的全栈指南

嵌入式Android开发学习路径:从C语言到AOSP定制的全栈指南

1. 从迷茫到清晰:一个嵌入式Android开发者的学习心路 如果你是一名电子、计算机或相关专业的学生,或者是一名希望从传统嵌入式或应用开发转向这个交叉领域的工程师,当你第一次听到“嵌入式Android开发”这个词时,内心可能充满了困…

2026/8/18 23:38:18 阅读更多 →
WinSCP“拒绝访问”错误:从权限原理到实战排查的完整指南

WinSCP“拒绝访问”错误:从权限原理到实战排查的完整指南

1. 问题概述与核心场景定位 如果你用过WinSCP,大概率遇到过那个让人血压飙升的红色弹窗:“拒绝访问”。这可能是运维、开发、数据分析师日常工作中最高频的“小麻烦”之一。它不像系统崩溃那样惊天动地,却像鞋里的一粒沙子,在你急…

2026/8/18 23:38:18 阅读更多 →
大语言模型如何从聊天记录推断用户性格:技术原理与实践指南

大语言模型如何从聊天记录推断用户性格:技术原理与实践指南

1. 项目概述:从聊天记录窥探用户性格,大语言模型能做到吗? “Can LLMs Infer Conversational Agent Users Personality Traits from Chat History?” 这个标题,乍一看像是一个纯粹的学术研究问题,但它背后指向的&…

2026/8/18 23:38:18 阅读更多 →
深入Spring IoC容器:Bean生命周期、循环依赖与AOP代理机制全解析

深入Spring IoC容器:Bean生命周期、循环依赖与AOP代理机制全解析

1. 项目概述:为什么我们需要深入Spring的“进阶篇”? 如果你已经用Spring Boot写过几个增删改查的项目,觉得注解一加、依赖一配就能跑起来,感觉Spring不过如此,那这篇文章就是为你准备的。我见过太多开发者停留在“会用…

2026/8/18 23:38:18 阅读更多 →
openEuler安装源配置全攻略:从原理到实战,解决软件包管理难题

openEuler安装源配置全攻略:从原理到实战,解决软件包管理难题

1. 从一次失败的软件安装说起:为什么安装源是欧拉系统的“生命线”前几天,我在一台新装的openEuler 22.03 LTS服务器上部署一个中间件,习惯性地敲下yum install命令,结果终端无情地抛回一堆“无法找到软件包”的错误。那一刻我才意…

2026/8/18 23:37:18 阅读更多 →

日新闻

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF

告别逐帧截图:用 extract-video-ppt 快速提取视频中的 PPT 并一键导出 PDF 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 如果你还停留在"看网课 不停暂停 截图 …

2026/8/18 0:00:57 阅读更多 →
思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查

思源宋体TTF一站式上手:7个字重免费商用,从下载到上线的完整走查 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 你是不是也经历过这种时刻:设计稿里…

2026/8/18 0:00:58 阅读更多 →
华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate

华硕笔记本控制权回收指南:GHelper 如何用一个 10MB 文件替代 Armoury Crate 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, …

2026/8/18 0:00:59 阅读更多 →

周新闻

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

基于阿里云与通义千问(Qwen)构建AI应用:从模型调用到生产部署的完整实践指南

如果你是一名开发者,最近可能已经感受到了AI大模型正在从“玩具”变成“生产力工具”的强烈信号。从代码补全到智能Agent,从本地部署到云端API,我们正处在一个技术栈快速重构的节点。然而,面对层出不穷的模型、框架和工具&#xf…

2026/8/18 9:15:35 阅读更多 →
工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/18 9:06:28 阅读更多 →
【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

2026/8/18 9:04:56 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/17 18:54:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/17 18:55:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/17 18:55:55 阅读更多 →