微服务手册:分库分表从分析到实践,不再停留只会说分库分表

互联网应用架构:专注编程教学,架构,JAVA,Python,微服务,机器学习等领域,欢迎关注,一起学习。

前言

现在网络的访问量激增,数据的量能也激增,在进行DB层面设计的时候,很多时候都要考虑分库分表,但是笔者发现一个问题,就是很多人一遇到这种问题就直接分库分表,不考虑现实的环境应该怎样?或者不考虑现在的项目应该怎么去设计,是否需要分库,是否需要分表。业务的增量如何?如何做到根据业务做后续拓展,今天我们来聊一下针对mysql的几种分库分表方案。

性能分析

俗话说,知己知彼,方能百战不殆。要想解决问题,那就必须知道我们的问题所在,及尽可能预测后面要发生的问题。在一个系统中,针对不同的业务,设计不同的方案,例如并发问题,例如存量问题,总结起来有以下三种问题。

1、网络IO问题

互联网的世界什么东西最常见,就是高并发,并发一高很多你见不到的问题就来了,其中请求的数据太多导致宽带不够,这就是网络IO问题。

2、磁盘IO问题

现在很多时候,我们在进行数据库查询的时候经常要做缓存,但是缓存也不能万能的,有时候热点数据很多,缓存已经放不下导致几乎全部走数据库查询,这样子在高并发请求下的每一次请求都会消耗大量的磁盘IO,从而查询速度会降低下来,现在的直接IO或者零拷贝也只能缓解,并不能最终解决问题。

3、计算性能问题

在普通的应用程序中一般都是CPU计算,虽然速度很快但是架不住大量的查询,例如单表数据很大,单表字段太多,没有合适的索引,SQL查询需要优化等,从而导致CPU的计算效率很低,导致CPU出现性能瓶颈。

针对以上三种问题,我们来讲讲不同的分库分表方案

分库分表不同实现

1、垂直分库

1.1.原理

按照业务定义不同,把不同的表放入到不同的库里面

1.2.切入点

以业务为导向,例如订单系统,库存系统

1.3.结果

每个数据库的业务范围不一样,因此每个库里面的表结构不一样

每个数据库里面的数据并不一样

1.4.场景

现在经常做的微服务系统,很多时候都是一个服务一个数据库

1.5.优点

面对一些高并发,高存量的时候,每个数据库都可以独立服务化存在,从而实现服务化的集群部署

1.6.缺点

由于把全量数据分散到各个数据库中去,在面对一些复杂的业务场景的时候会出现数据聚合问题,需要把各个数据库里面的数据聚合在一起,这需要根据不同的需求设计不同的实现方案。

2、垂直分表

2.1.原理

根据特定的业务场景寻找热点数据,并根据热点数据做表切分

2.2.切入点

主从表的设计思想

2.3.结果

存在实际意义的主从表之分,主表与从表之间一般采用主键进行数据关联

2.4.场景

这里主要应对一些复杂的业务场景,并发量不大但是计算比较大的情况,存在一定情况的数据冗余,查询数据的由于缓存数据的减少从而增加了磁盘的IO请求,例如缓存了主表的基础数据,但是从表需要查询。

2.5.优点

抽离出共性或者可以作为热点的数据,降低磁盘IO的瓶颈

2.6.缺点

由于一个表被拆分成两个,导致进行关联查询的时候容易增加CPU的计算负担,特别是在写SQL的时候采用join,是比较考验CPU的计算能力,因此针对这方面,笔者建议在代码层面进行数据的聚合。

3、水平分库

3.1.原理

按照一定的策略入hash或者range等,把数据分散放到不同的数据库上。

3.2.切入点

根据规则(技术算法层面或者业务规则)数据分散放到不同的数据库

3.3.结果

每个数据库结构一样,但是每个数据库的数据是不一样的

每个数据库并没有任何的交集,他们只存储部分数据

3.4.场景

数据量比较大,并发量比较小的时候

3.5.优点

数据分散来,从而来减少每个数据库的压力

3.6.缺点

当数据库多了的时候,在进行计算跟数据读取的时候,磁盘IO,网络IO,CPU计算都会成倍增长,这点上需要非常注意做适当操作,不可以随意切分。

4、水平分表

4.1.原理

按照一定的策略入hash或者range等,把数据分散放到不同的表上

4.2.切入点

以每个表的某些字段为切分点,例如订单日期等,每三个月一个表

4.3.结果

每个表的结构一样

每个表的数据不一样

4.4.场景

当某一个表增量比较大,可以按照指定的字段作为切分点来做,例如订单,例如历史记录都可以做

4.5.优点

查询特定业务范围的数据,表数据减少了从而增加来查询效率

4.6.缺点

分表后数据分散在不同的表中,联合查询会增加磁盘的IO以及CPU的计算,尽可能放弃join并在代码上实现数据聚合操作

分库分表中间件

Mycat

Sharding-sphere

选型原则:建议社区的热度优先,笔者以前用sharding-sphere,现在喜欢用mycat,文档及社区热度较好。

总结

不是所有的应用都适合分库分表或者需要分库分表,进行分库分表的时候代表着你引入了更加复杂的问题,是垂直还是水平,分几个库,分几个表都需要做增量预测,从而达到一个平衡态。

--END--

作者:@互联网应用架构

原创作品,抄袭必究

如需要源码或转发,请关注后私信我

部分图片或代码来源网络,如侵权请联系删除,谢谢!

你可能感兴趣的:(微服务手册:分库分表从分析到实践,不再停留只会说分库分表)