1.基本概念
读写分离:依靠数据复制备份到从库,增加了抵抗大量并发读请求的能力,同时冗余备份保证了数据不丢失。
随着数据量的增加,诞生的问题:
- 单表数据量超过千万,导致查询性能低
- 单机数据量增大
- 数据库怎么做到故障隔离
- 数据库怎么应对更大的写请求
解决以上问题(性能+读写文图)的核心思路,将数据进行分片,分摊压力
坑:
查询时不使用分区键
大量连表查询
依照某种策略将数据尽量平均的分配到多个数据节点或者多个表中,每个节点保存部分数据,可以减少存储量,提升并发读写量
2.如何对数据库做垂直拆分
核心思想:专库专用,目的是为了实现故障隔离
按照业务类型进行拆分,将业务耦合度较高的表拆分到单独的库中
只能暂时环节存储容量的瓶颈
3.如何对数据库做水平拆分
核心思想:将单一数据表按照某种规则拆分到多个数据库和数据表中
拆分规则:按照某个字段hash后进行拆分+按照某一字段区间进行拆分
查询方式由直接查询 转换为 先确定存储位置,再查询
3.1hash拆分
实现:将某一个字段按照hash值进行计算,在对hash值进行取余
适用:适用于实体表(一对一查询,不会范围查询)
3.2区间拆分
实现:按照字段取消进行拆分(通常适用时间字段)
适用:适合按照拆分维度进行范围查询
4.解决分库分表的问题
问题:引入了分库分表键(分区键),分库分表依据的字段
每次查询必须带上分区键,否则需要遍历所有的库和表
解决思路:建立查询数据与分区键的映射关系
问题:连表查询变得困难
解决:通过业务代码进行处理(count可以记为缓存)
5.小计
虽然分库分表会引入新的问题,但是真正的突破的单机的限制
分库分表=纵向拆分+横向拆分
实现=查询带上分区键+总数单独存储
分库分表原则:
- 没有性能瓶颈不做分库分表
- 做就需要一步到位,避免多次扩容
- 在特定场景下,通过NOSQL代替MySQL