专业的编程技术博客社区

网站首页 > 博客文章 正文

《从零开始学架构》读书笔记(二):存储高性能

baijin 2024-08-26 10:26:07 博客文章 6 ℃ 0 评论

关系数据库

读写分离

一主一从,一主多从,主负责读写,从只负责读

问题:主从延迟

解决:

  • 写后读主
  • 读从失败后读主
  • 关键业务都在主上,非关键业务读写分离

分库

按业务模块将数据拆分到不同的库

问题:join、事务、成本

  • 程序写逻辑查多个库后进行join
  • 引入分布式事务(MySQL XA),会降低性能,或者放弃事务
  • 分库后,无法利用数据库自己的join和事务,业务逻辑也需要额外写很多,增加工作量

分表

垂直分表

将表中不常用的列分出去,用主键关联多个表,提升单表性能,不过会增加查询次数。

水平分表

适合单表上千万条数据时使用,比垂直分表更复杂,需要增加路由算法。

常见路由算法:范围路由、Hash路由、配置路由

join操作:需要程序多次join

count:对多个表进行count,建议转换为记录数表,更合理

order by:程序查多个表汇总排序

实现方案

代码封装

抽象出一个数据访问层专用于实现读写分离或者分库分表

实现简单,但不同语言不通用

中间件

MySQL Router,支持多种变成语言,支持标准SQL协议,业务无感知,但中间件的实现很复杂

NoSQL:Not Only SQL

KV存储:解决关系数据库无法存储数据结构的问题,以Redis为代表。

文档数据库:解决关系数据库强schema约束问题,以MongoDB为代表。

列式数据库:解决关系数据库大数据场景下I/O问题,以HBase、ClickHouse为代表。

全文搜索引擎:解决关系数据库的全文索引性能问题,以Elasticsearch为代表。

缓存

适用于读多写少,一次读取,多次使用的场景,能极大提升访问速度。

缓存穿透:查询的数据不存在,每次访问数据库

  1. 缓存空值
  2. 加布隆过滤器缓解

缓存雪崩:大量缓存同时失效或者过期

  1. 加更新锁,单线程更新
  2. 后台更新,业务线程和更新线程分离

缓存热点:热点数据访问压力大

对热点数据缓存多份,访问时分布式随机访问

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表