惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
Vercel News
Vercel News
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
J
Java Code Geeks
M
MIT News - Artificial intelligence
Microsoft Azure Blog
Microsoft Azure Blog
B
Blog RSS Feed
MongoDB | Blog
MongoDB | Blog
G
Google Developers Blog
Engineering at Meta
Engineering at Meta
量子位
S
SegmentFault 最新的问题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
A
About on SuperTechFans
P
Proofpoint News Feed
Last Week in AI
Last Week in AI
Recent Announcements
Recent Announcements
腾讯CDC
I
InfoQ
F
Fortinet All Blogs
Hugging Face - Blog
Hugging Face - Blog
Blog — PlanetScale
Blog — PlanetScale
H
Help Net Security
爱范儿
爱范儿

博客园 - 程序员李铁牛

赛事报名系统开发:角色与权限体系设计 赛事系统报名接龙高并发技术细节处理浅析 档案数字化研发手记:PDF合并内存溢出踩坑 纸质档案数字化管理系统研发手记:法院诉讼档案单套制落地案例复盘——从纸质卷宗到电子卷宗 档案数字化管理系统开发手记:人事档案专项审核与数字化的系统支撑——"凡提必审"下的技术要点 档案数字化研发手记:我们的技术栈选择——档案系统前后端选型理由(含一次"炫技"的教训) 社群团购系统开发分享——工程化(下):资金支付测试策略——资金模块 100% 覆盖,其他 60% 就够 社群团购系统类快团团源码开发——工程化(上):一套让 5 人小团队不出事故的开发规范 社群团购类快团团系统开发——RBAC 权限设计源码分析:当一个微信号有 4 种身份时怎么办 社群团购系统类快团团模式开发——微信小程序登录:code2Session 之后还有 5 件事要做 数字档案管理系统化研发手记:医院病历档案数字化——合规、病案首页 OCR 与调阅提速 数字档案系统研发手记:批量扫描任务调度——TWAIN/SANE 采集驱动的封装实践 档案数字化系统研发源码手记:置信度过滤——把 97% 识别率变成真正可交付的成果 档案数字化开发实例手记:盖章遮挡文字识别恢复 景区运营预约系统开发:景区会员体系怎么搭?3级会员模型+积分玩法 景区门票预约系统全渠道平台库存数据同步技术处理方式 系统宕机了怎么办?景区票务系统应急预案模板 景区门票预约系统开发:接入AI预测客流设计思路分析 景区预约系统开发总结:门票分时预约设计原理和落地方法 设备运维管理系统开发实战:用规则引擎实现可配置的设备告警策略自研轻量引擎 vs Drools 落地对比 设备维修保养系统预测性维护不用深度学习?设备健康度评分的务实实现方案 档案数字化管理系统研发手记:档案权限模型——全宗-门类-案卷-文件四级控制的设计与实践 档案管理信息化系统研发手记:数字水印方案对比——可见水印 vs 盲水印(档案借阅防泄露) 景区票务系统开发实例分析:上云还是本地部署?6个维度判断 档案数字化系统源码研发手记:老旧档案去污点——中值滤波与 inpainting 效果对比 一物一码防伪溯源系统开发全栈源码串联一次扫码的完整链路追踪代码走读 景区门票预约系统票务系统的6个核心模块 景区上线门票预约系统的5个常见翻车点 景区门票预约系统之人脸识别 vs 身份证核验 vs 扫码入园,哪种最适合你? 景区门票预约系统开发深度解析之定价策略功能设计
数据库高并发与高可用架构方案
程序员李铁牛 · 2025-12-11 · via 博客园 - 程序员李铁牛

一、高可用方案(HA, High Availability)

  • ​​缓存高可用​​:通过双写和双读主备,或利用缓存集群的数据同步与故障自动转移机制实现。
  • ​​数据库高可用​​:
    • ​​读高可用​​:通过读写分离(如MHA)及分库冗余实现。
    • ​​写高可用​​:通过主从双备,结合keepalived与虚拟IP实现自动故障转移。

二、高并发方案

根据业务读写特点选择架构:

  • 读多写少、读并发高:采用主从分离。
  • 写并发高:采用水平分库。
  • 读写并发均高:先进行水平分库,再为每个分库部署主从集群。此外,可使用缓存缓解读并发压力。

2.1 读写分离、主从复制与分组架构

三者指同一架构模型,即主从复制(AB复制):将主库数据复制到一个或多个从库,主库负责写,从库负责读,通常为一主多从。在高可用场景中常简称为MHA。

2.1.1 优势

  • 支持更大读并发与吞吐量,提升读性能;写库独立,提升写性能。
  • 读写库分离,减少锁冲突,优化写性能。
  • 通过从库冗余实现“读高可用”。
  • 易于扩展,增加从库可显著提升读性能。

2.1.2 MySQL主从复制过程(异步)

  1. Master开启binlog,记录数据变更。
  2. Slave的IO线程向Master请求指定binlog及position之后的内容。
  3. Master的IO线程返回对应binlog内容及position。
  4. Slave将binlog写入relay-log,并创建master.info文件记录连接信息。
  5. Slave的SQL线程监控relay-log,解析并执行SQL,实现数据同步。

2.2 分库分表

2.2.1 水平切分(分片架构)

  • ​​目标​​:线性提升写性能,降低单库数据量,解决数据量大导致的写瓶颈。
  • ​​常见方案​​:
    • ​​范围法​​:
      • 优点:保持数据顺序;精准控制数据量;易于扩展。
      • 缺点:负载可能不均衡(如新用户更活跃)。
    • ​​哈希法​​:
      • 优点:数据与请求分布均衡。
      • 缺点:扩展时需数据迁移;一致性哈希可缓解此问题。
    • ​​哈希+范围混合分片​​:折中方案,均衡数据与请求分布。

2.2.2 垂直切分

  • ​​垂直分表​​:将低频或大字段拆分到扩展表,提升内存命中率与IO性能。
  • ​​垂直分库​​:按业务拆分库,降低单库数据量,需结合业务可行性。

2.3 读写分离与分库分表结合

结合两者以进一步提升性能,但架构复杂度较高。

三、常见问题与解决方案

3.1 读写分离与水平分库的区别

  • ​​数据量​​:主从分离各节点存全量数据;水平分库各节点存部分数据(1/n)。
  • ​​目标​​:主从分离扩展读性能;水平分库扩展写性能。
  • ​​场景​​:读多写少用主从;写多用分库;读写均高则先分库再主从。

3.2 主从分离的问题

  • 写节点单点风险,需通过主从双备+keepalived+虚拟IP实现高可用。

3.3 数据库架构选型

  • 初期:单库。
  • 读压力大:分组(主从)。
  • 数据量大:分片(水平分库)。
  • 属性访问频次高:垂直拆分。

3.4 水平切分:分库 vs. 分表

  • ​​优先分库​​:避免磁盘IO竞争;易于扩展与迁移。

3.5 瞬时高并发处理

  • 通过MQ消息队列削峰填谷。

3.6 分库后的业务接入与数据访问

  • 通过代理切换数据源,业务层无感知。
  • 数据访问层需处理分片路由与数据聚合,可引入数据库中间件简化。

3.7 非Partition Key查询处理

  • ​​全库扫描​​:效率低,但可并发优化。
  • ​​索引法​​:建立映射表或缓存(如用户名映射主键)。
  • ​​基因法​​:通过非Key属性生成分片位(如用户名生成分片基因)。
  • ​​直接生成主键​​:风险为ID冲突,需确保均匀分布。

3.8 多非Partition Key查询

  • 对不可修改字段使用基因法,其他用索引法。

3.9 Partition Key批量查询

  • 法一:访问所有库,合并结果。
  • 法二:按路由规则只访问相关分片。

3.10 跨库分页与模糊查询

  • 跨库分页为业界难题,有多种方案。
  • 模糊查询或范围查询可借助ES等搜索引擎。

3.11 分库数据量与唯一主键

  • 数据量建议:无复杂查询时5千万–1亿条;有复杂查询时1千万–2千万条。
  • 唯一主键通过分布式ID生成器实现。

3.12 主从架构中的多主多从

  • 建议一主多从;若写瓶颈,可水平分库,每分片部署主从。
  • 多主多从需确保数据全量同步,避免数据不一致。

3.13 缓存的作用

  • 缓存高频、低频变数据,降低数据库压力,提升响应速度。

3.14 主从切换数据丢失与避免

  • ​​丢数据风险​​:
    • 主库未完全同步时宕机。
    • 脑裂导致老主库仍接收写入。
  • ​​恢复​​:通过备份的binlog人工恢复。
  • ​​避免​​:
    • 使用双主热备+keepalived。
    • 切换前设置主库只读。

3.15 单库重启与连接管理

  • 重启通过redo log恢复数据,不丢数据。
  • 切换时可配置是否断开连接,如MHA可通过脚本控制。

3.16 分库分表依据

  • 单表数据量大导致SQL延迟高:分表。
  • 实例QPS达到上限、锁冲突严重:分库。

3.17 主从Binlog同步方式

  • 备库指定起始binlog位置后,主库主动推送新日志(基于长连接)。