文章目录
- 1.分库分表的目的
- 2.分库分表的拆分策略
- 2.1.垂直拆分
- 2.2.水平拆分
- 3.Mycat水平拆分的分片规则
1.分库分表的目的
互联网中的应用程序,随着公司的发展,应用系统的使用人数、数据量都再持续增长,数据库层面就会产生一定的瓶颈。
如果一开始数据库是单机模式,当业务量增大时,就会导致IO、CPU出现瓶颈,数据量太多、数据库缓存不够,从而产生大量的磁盘IO,导致数据库的性能下降。
即使将数据库升级改造成读写分离集群,随着业务的持续正能量,核心业务表也会产生瓶颈,数据量过大,当有功能使用这张表时,效率就会很低,会出现加载过慢的现象。
为了避免、解决大表带来的性能瓶颈,就需要对数据库进行分库分表的操作了。
-
可以对业务量、数据量很大的数据库,进行分库操作,将其中的一部分表拆分到其他的数据库服务器中,程序同时连接这两个数据源,缓解单库50%的压力。
-
也可以对数据量很大的一张表进行分表操作,将该表拆分成多张表,可以按照字段拆分,也可以按照数据量拆分,大多数情况下都是按照数据量进行拆分,例如将一张4500w行的表拆分成3张表,每张表承担1500w的数据量,缓解大表的压力。
分库分表的中心思想就是将数据分散存储在多个数据库节点中,使单一数据库或者数据量很大的表得到缓解,提高数据库的性能。
2.分库分表的拆分策略
分库分表的形式主要有两种方式,分别是垂直拆分和水平拆分,对于拆分的力度,又分为分库和分表。
2.1.垂直拆分
垂直拆分分为垂直分库和垂直分表。
所谓的垂直拆分指的将一个实体中的零件拆分到另一个实体上,相当于物理层面。
1)垂直分库
垂直分库指的是将一个库中的多个表,拆分到不同的库中,这就是垂直分库。
垂直分库中以表作为单位,根据业务表的不同,拆分到多个不同的数据库中。
垂直分库后不同库中存放平台库的表都是不同的,数据也都不相同,因为分库后,每一个库中会存放一部分表,各自表存放各自的数据,互不干涉,所有库的表加起来形成完整的平台库数据,
如下图所示,期初在一个数据库中有6张表,垂直拆分后,将库中的表分给了三个单独的库,每个库中存放2张表,从而达到提升性能的目的。
2)垂直分表
垂直分表指的是将一个表拆分成多个表,按照字段为单位作为拆分依据。
垂直分表后一张表会被拆分成多张表,每张表的表结构也不同,因为是按照字段拆分的,可能1-5个字段在A1表中,5-10个字段在A2表中,每张表的数据也不可能相同,分表后的多张表之间一般通过主键、外键进行关联。
垂直分表后,多张表的数据加起来才是完整的数据。
如下图所示,tb_user表进行了垂直分表,其中id、age字段分到了tb_user表中,剩余的字段分到了tb_usersec表中。
2.2.水平拆分
水平拆分分为水平分库和水平分表。
所谓的水平拆分是从逻辑层面上进行拆分,相当与搬家,换壳不换住户。
1)水平分库
水平分库是按照一定的策略以字段作为依据,将一个库的所有表拆分到多个库中,每个库中的表结构都是相同的,只是数据量不同,用户的读写操作会被路由到某一个分库中,缓解单库的压力,水平分库后,所有库的数据量才是完整的数据量。
如下图所示,该库中有两张数据表,水平分库后,被拆分到了多个库中,但是每个库中都存放相同的表,只是数据不同,用户的读写操作会被路由到不同的分库中进行处理。
2)水平分表
水平分库是按照一定的策略以字段作为依据,将一个表的数据拆分到多张表中,缓解单表的压力,拆分出来的多张表只是名字不同,表数据都相同,用户的读写操作会被路由到其中一个分表中,拆分出来的所有表的数据量加起来才是完整的数据量。
如下图所示,tb_goods表进行了水平拆分,拆分后变成了三张表,每张表中会存放一部分数据,用户的读写操作会被路由到其中一张表中,三张表的所有数据量才是整张表的全部数据。
3.Mycat水平拆分的分片规则
Mycat水平分库分表,都是对表中的数据量进行拆分的,将一个数据库中的表数据拆分到多个数据库实例中,并不能实现将一个表在当前数据库中拆成多个表。
Mycat的分片规则都已经写好了,我们直接来调用即可,无需认为编写。
水平拆分主要是根据分片规则进行逻辑上的拆分,常用的水平拆分分片规则如下:
- 范围分片
- 根据表中的数据量大小,决定将表中的数据拆分到那些分片上,例如0~500w条数据拆分到分片1,500w-1000w数据拆分到分片2。
- 取模分片
- 根据数据量与节点数量的求模运算,根据运算结果,决定数据存储的分片,例如插入第50条数据,节点有4个,那么就是50÷4=12余2,余数2就是该条数据写入的分片ID。
- 一致性Hash分片
- 所谓一致性哈希,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置,有效的解决了分布式数据的拓容问题。
- 枚举分片
- 通过在配置文件中配置可能的枚举值, 指定数据分布到不同数据节点上, 本规则适用于按照省份、性别、状态拆分数据等业务
- 日期分片
- 根据日期时间来进行分库分表,常见的有按月分表,每个月产生一个新表。