10-MySQL高可用与分库分表:海量数据解决方案
MySQL高可用与分库分表海量数据解决方案作者黒漂技术佬适用读者单机数据量过千万变慢、想搞分库分表但没头绪的同学关联场景无人售货柜全国订单库、智慧农业多年历史数据一、单机MySQL的瓶颈什么时候该上分布式单机MySQL不是不行而是有天花板。三道天花板天花板1数据量 - 单表超过5000万行索引再好查询也开始变慢 - B树层级从3层涨到4层多一次磁盘IO - 售货柜订单每天100万行一年3.65亿行 → 单表炸了 天花板2并发量 - 单机QPS理论5万实际2-3万就开始排队 - 秒杀/双11场景瞬时10万QPS → 单机扛不住 天花板3可用性 - 一台机器挂了就停服 - 不论是硬件故障还是机房断电都是单点遇到这三道墙就要从两个方向解决高可用解决单点故障 分库分表解决容量和并发。二、高可用方案让MySQL不挂、挂了能切2.1 MHAMaster High Availability老牌主从切换方案。MHA Manager监控主库主库挂掉时自动选一个从库提升为主。MHA架构 MHA Manager独立监控节点 ↓ 监控 主库 ←→ 从库1 / 从库2 / 从库3 主库挂了 1. MHA选binlog最新的从库从库2 2. 把从库1、从库3的relay log补到从库2 3. 从库2提升为新主 4. 从库1、3重新指向新主优点成熟稳定社区资料多。缺点Manager是单点切换有秒级数据丢失可能异步复制。2.2 MGRMySQL Group ReplicationMySQL官方组复制多个节点用Paxos变体协议同步数据自带故障检测和切换。MGR集群 节点1 ←→ 节点2 ←→ 节点3 Paxos共识 3节点挂1个还能用过半数2/3 5节点挂2个还能用过半数3/5优点强一致写要过半数节点确认自带切换无外部组件。缺点写性能受共识协议拖累跨机房延迟敏感。2.3 Orchestrator开源的MySQL拓扑管理和故障切换工具提供Web界面可视化操作。Orchestrator能做 - 实时显示主从拓扑 - 拖拽手动切换主库 - 故障自动切换可配置策略 - 拓扑重构从库改挂到别的节点方案强一致性切换速度复杂度适合MHA弱异步30秒级中老项目兼容MGR强Paxos秒级中高强一致场景Orchestrator弱异步秒级中需要可视化管理选型建议新项目首选MGR官方支持强一致无外部依赖。老系统维护选MHA或Orchestrator。金融级强一致还得配合半同步或MGR。三、分库分表策略垂直 vs 水平分库分表有两大方向垂直拆分按业务/字段拆和水平拆分按数据行拆。3.1 垂直分库按业务拆把一个库里不同业务模块的表拆到不同库。拆分前单库shop shop.user 用户表 shop.product 商品表 shop.orders 订单表 shop.payment 支付表 shop.cabinet 售货柜表 拆分后按业务分库 user_db → user, address product_db → product, sku order_db → orders, order_item pay_db → payment, refund cabinet_db → cabinet, device好处业务隔离一个库挂了不影响其他业务按业务分配资源。坏处跨库JOIN做不了要用接口调用或冗余字段。3.2 垂直分表按字段拆把一张表的字段拆成多张表按热度分。拆分前product表字段太多 product_id, name, price, stock, weight, description(大字段), image_url(大字段), create_time 拆分后 product热数据 product_id, name, price, stock, weight, create_time product_detail冷数据大字段 product_id, description, image_url好处热表行变小一页能放更多行查询效率高。坏处查详情要JOIN两张表。3.3 水平分表按行拆把一张表的数据按某种规则分散到多张表。这是真正解决单表数据量爆炸的招数。分表策略1按ID取模orders表拆成8张orders_0 ~ orders_7 插入订单ID1001 1001 % 8 1 → 写入 orders_1 查询订单ID1001 1001 % 8 1 → 从 orders_1 查分表策略2按范围分表orders按时间范围分表 orders_2024_01 → 1月订单 orders_2024_02 → 2月订单 ... orders_2024_12 → 12月订单 查1月订单 → 直接查 orders_2024_01 跨月查询 → UNION ALL 多张表策略优点缺点适合取模数据均匀分布扩容要重新分布数据ID明确、查询点查多范围扩容简单加新表容易热点最新表压力大时间序列数据工程经验售货柜订单天然适合按时间范围分表按月分表因为订单查询绝大多数是按时间范围筛选。按取模分表适合用户ID点查场景。四、分库分表带来的四大难题分库分表不是免费的午餐带来一堆新问题。4.1 跨库JOIN做不了分库后 orders 在 order_db user 在 user_db product 在 product_db 查询订单列表用户名商品名 原本一条JOIN SQL搞定 现在跨库JOIN不了 → 要应用层组装解法应用层组装分别查三个库在内存里拼装。冗余字段订单表冗余存user_name和product_name避免关联查询。宽表/数据湖把需要JOIN的数据同步到ES或数仓做宽表查询。4.2 分布式事务下单涉及 order_db.orders → 插订单 product_db.product → 扣库存 pay_db.payment → 创建支付单 三个库在不同MySQL实例本地事务管不了 → 要分布式事务解法2PC两阶段提交协调者统一提交性能差。TCCTry-Confirm-Cancel业务层补偿复杂但性能好。Seata AT模式自动生成补偿SQL开发友好。本地消息表MQ最终一致性最常用。4.3 全局ID单库时用自增ID分库后每个库各自自增会重复。解法方案1UUID 优点不重复 缺点无序、索引碎片、查询慢 方案2Snowflake雪花算法 64位 时间戳(41位) 机器ID(10位) 序列号(12位) 优点有序、全局唯一、高性能 缺点依赖机器时钟 方案3数据库号段 预分配一段ID给应用用完再申请 优点简单可靠 缺点扩容要小心4.4 分页查询变难原分页SELECT * FROM orders LIMIT 10000, 20 分表后8张表 每张表都 LIMIT 10000, 20 → 拿到8×20160条 应用层排序后取第10001~10020条 → 第1页没问题第10000页要拉8×10020条排序慢到爆炸解法限制最大翻页数、用游标分页last_id方式、走搜索引擎。五、ShardingSphere分库分表实战5.1 准备工作假设要分8库×4表存售货柜订单。先规划分库规则cabinet_id % 8 → 分到8个库 分表规则order_id % 4 → 分到4张表5.2 配置spring:shardingsphere:datasource:names:ds0,ds1,ds2,ds3,ds4,ds5,ds6,ds7ds0:type:com.zaxxer.hikari.HikariDataSourcejdbc-url:jdbc:mysql://db0:3306/order_db_0username:rootpassword:xxx# ... ds1~ds7 类似rules:sharding:tables:orders:actual-data-nodes:ds${0..7}.orders_${0..3}database-strategy:standard:sharding-column:cabinet_idsharding-algorithm-name:cabinet-modtable-strategy:standard:sharding-column:order_idsharding-algorithm-name:order-modsharding-algorithms:cabinet-mod:type:MODprops:sharding-count:8order-mod:type:MODprops:sharding-count:4key-generators:# 全局IDsnowflake:type:SNOWFLAKE5.3 代码使用// 应用代码完全无感知分库分表ServicepublicclassOrderService{AutowiredprivateOrderMapperorderMapper;publicvoidcreateOrder(Orderorder){// order_id用雪花算法生成配置里指定// ShardingSphere根据cabinet_id路由到对应库// 根据order_id路由到对应表orderMapper.insert(order);}publicOrdergetById(LongcabinetId,LongorderId){// 必须带cabinet_id否则广播到8库32表查 → 性能差returnorderMapper.selectByCabinetAndOrder(cabinetId,orderId);}}关键点分库分表后查询尽量带上分片键cabinet_id。不带分片键的查询会广播到所有分片性能急剧下降。5.4 分片键选择分片键选错了分库分表基本失败。售货柜订单表分片键选择 候选1order_id → 查询时如果只按order_id查会广播 候选2cabinet_id → 大多数查询都带cabinet_id按门店查订单好 候选3user_id → 跨门店用户消费分析看场景 最优解用cabinet_id做分片键 → 售货柜维度查询占90%都能精准路由分片键选择原则选业务查询最常带的字段。售货柜场景门店维度查询最多选cabinet_id。六、分库分表后的数据迁移方案6.1 迁移挑战老的单库表有几亿行数据怎么平滑迁移到分库分表还不能停服。迁移难点 1. 几亿行数据迁移可能要几小时 2. 迁移期间还在写新数据怎么保证不丢 3. 迁移后要校验数据一致性 4. 切换时业务不能中断6.2 双写迁移方案推荐步骤1建分库分表新结构老库不动步骤2应用层双写TransactionalpublicvoidcreateOrder(Orderorder){// 写老库oldOrderMapper.insert(order);// 同时写新分库分表newShardingOrderMapper.insert(order);}步骤3数据全量同步用DataX或自研脚本把老库存量数据同步到新分库分表按分片规则路由。步骤4增量同步补偿用Canal监听老库binlog把增量变更同步到新库。或继续靠双写。步骤5读切流量灰度灰度策略 1. 10%读流量切到新库观察数据一致性 2. 50%读流量切到新库 3. 100%读流量切到新库 4. 下线老库双写 5. 老库归档步骤6清理双写新库稳定后去掉老库双写代码老库归档或下线。迁移期间最难的是数据校验。用自研脚本抽样比对或用DataX的校验功能。任何不一致要停下来排查不能强行切换。七、总结概念一句话高可用方案MHA老、MGR新强一致、Orchestrator可视化垂直分库按业务拆库解耦但跨库JOIN难垂直分表按字段热度拆表热表变小、查询快水平分表按ID取模或范围拆解决单表数据量四大难题跨库JOIN、分布式事务、全局ID、分页ShardingSphereJDBC层透明分库分表应用无感数据迁移双写全量同步灰度切流量分库分表是MySQL走向大规模的必经路但代价不小——一旦分了复杂度永久上升。先用单机主从撑撑不住再分。下一篇聊性能调优把单机压榨到极限。

相关新闻

告别VNC!原生浏览器Obsidian,网页直开、插件照跑

告别VNC!原生浏览器Obsidian,网页直开、插件照跑

引言熊猫一直用的都是Obsidian作为编辑器,翻了下仓库,目前刚好攒到 1000 篇,这东西也算陪着熊猫一路走过来了。体验过不少编辑器,Obsidian依旧是熊猫用得最顺手的那一个,数据放在本地,插件自己挑&#xff0…

2026/8/18 21:24:53 阅读更多 →
FreeRTOS内存管理深度解析:五种堆分配方案与嵌入式系统稳定性优化

FreeRTOS内存管理深度解析:五种堆分配方案与嵌入式系统稳定性优化

1. 项目概述:为什么FreeRTOS的内存管理值得深究? 如果你在嵌入式领域摸爬滚打了一段时间,尤其是用过STM32、ESP32这类MCU,那你对FreeRTOS这个名字肯定不陌生。它几乎是实时操作系统(RTOS)的代名词&#xff…

2026/8/18 21:24:53 阅读更多 →
173.企业级开发范式:ABAP 类开发 + 批量取数 + ALV 可视化落地

173.企业级开发范式:ABAP 类开发 + 批量取数 + ALV 可视化落地

摘要 SAP系统作为企业资源计划领域的标杆,其底层开发语言ABAP是连接业务需求与技术实现的桥梁。本文从ABAP语言基础语法出发,深入剖析SAP数据字典对象、Open SQL操作、内表处理等核心机制,通过一个完整的采购订单查询程序实例,展示从数据建模到报表输出的全流程开发方法。…

2026/8/18 21:24:53 阅读更多 →

最新新闻

物联网实战:从STM32+ESP8266到云平台,详解三层架构与开发避坑指南

物联网实战:从STM32+ESP8266到云平台,详解三层架构与开发避坑指南

1. 项目概述:从“万物互联”到“万物智联”的演进 “物联网”这个词,现在听起来可能有点“老生常谈”了,从智能家居的温湿度计,到工厂里轰鸣的机器上闪烁的传感器,再到你手腕上记录心率的智能手表,它早已渗…

2026/8/18 22:55:51 阅读更多 →
Tmux自动保存日志:pipe-pane方案实现与优化指南

Tmux自动保存日志:pipe-pane方案实现与优化指南

1. 项目概述:为什么我们需要自动保存Tmux日志?如果你和我一样,长期在Linux服务器上使用Tmux进行开发、运维或者跑一些耗时很长的任务,那你一定遇到过这个痛点:一个重要的Tmux会话(session)运行了…

2026/8/18 22:55:51 阅读更多 →
并查集:从动态连通性问题到路径压缩与按秩合并的优化实践

并查集:从动态连通性问题到路径压缩与按秩合并的优化实践

1. 项目概述:从“找老大”到高效连通性管理 如果你写过一些算法题,或者处理过一些需要动态维护元素分组关系的场景,大概率会听说过“并查集”这个名字。我第一次接触它是在解决一个“朋友圈”问题的时候,题目大意是给定一群人和他…

2026/8/18 22:55:51 阅读更多 →
JavaMail/Jakarta Mail企业级邮件处理实战:从协议原理到生产环境最佳实践

JavaMail/Jakarta Mail企业级邮件处理实战:从协议原理到生产环境最佳实践

1. 项目概述:为什么JavaMail依然是企业级邮件处理的基石在当今这个即时通讯满天飞的时代,电子邮件作为一项古老而稳定的协议,依然是企业内外正式沟通、系统通知、用户注册验证的绝对主力。你可能觉得发邮件很简单,不就是点个“发送…

2026/8/18 22:55:51 阅读更多 →
代码评审:从团队协作到质量保障的工程实践

代码评审:从团队协作到质量保障的工程实践

1. 从“个人英雄”到“团队工程”:为什么我们需要代码评审 在软件开发的早期,一个天才程序员单枪匹马写出改变世界的代码,是很多人的浪漫想象。但现实是,现代软件系统早已不是个人作品,而是由数十、数百甚至上千名工程…

2026/8/18 22:55:51 阅读更多 →
Axure原型设计入门:从核心认知到高效实践指南

Axure原型设计入门:从核心认知到高效实践指南

1. 从“画图工具”到“产品思维”:我理解的Axure是什么 如果你刚接触产品设计或者交互设计,大概率会听到一个名字:Axure。很多新手的第一反应是:“哦,那个画原型的工具。” 这个理解对,但也不全对。在我用了…

2026/8/18 22:54:51 阅读更多 →

日新闻

告别逐帧截图:用 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 阅读更多 →