背景
随着业务的扩张,流量的增加,数据库的压力耶随之增加。单库单表就无法支撑庞大的业务请求。这时候,就可以考虑对数据库进行扩展。本文简单讲述通用的数据库扩展策略。
分库分表
垂直拆分
依据业务纬度进行垂直拆分。如:用户库存储用户相关的表、商品库存储商品相关的表等。
再者,一种场景是对单张宽表进行拆分,将热点列(长度较短,访问频率较高)放在一种表中叫做主表;将冷数据(字段较长,访问频率较低)的放在扩展表中。
特点:
- 每个库(表)的结构都不一样。
- 一般来说,每个库(表)的属性至少有一列交集,一般是主键。
- 所有库(表)的并集是全量数据。
优点: 降低数据量大小,提升数据库性能。
缺点:
- 单库的jion查询问题。
- 排序分页问题。
- 自增id问题。
- 分布式事物问题。
- 热点数据问题。
水平切分
水平切分是依据某列,按照某一规则(取模或hash等算法)将一个库(表)的数据分解到多个库(表)中。
特点:
- 每个库(表)的结构都一样。
- 每个库(表)的数据都不一样,没有交集。
- 所有库(表)的并集是全量数据。
优点: 降低数据量大小,提升数据库性能。
缺点:
- 单库的jion查询问题。
- 排序分页问题。
- 自增id问题。
- 分布式事物问题。
读写分离
分库分表解决了数据量的问题。然而,随着数据量的增加,像商品表的会出现读多写少的问题。这样,就出现读写分离的做法。
如上图: 1个写库,2个读库。服务A和服务B走从库A,服务D和服务E走从库B,服务C在从库A和从库B间做轮询。
特点: 针对读多写少的业务场景。
优点:
- 可以很好地把各个业务隔离开来。不会因为一个业务把数据库拖死而导致所有的业务都死掉。
- 可以很好地分担数据库的读负载,毕竟读操作是最耗数据库 CPU 的操作。
缺点: 数据库同步不实时问题,需要强一致性的读写操作还是需要落在写库上。
以上简单介绍了数据库扩展常用方法。同时也相应的抛出了几个问题,如何解决?后续章节会逐个介绍,也欢迎留言评论,一起交流。
动动小手指,您的关注,是给予我最大的支持。