1.分库分表的目的

互联网中的应用程序,随着公司的发展,应用系统的使用人数、数据量都再持续增长,数据库层面就会产生一定的瓶颈。

如果一开始数据库是单机模式,当业务量增大时,就会导致IO、CPU出现瓶颈,数据量太多、数据库缓存不够,从而产生大量的磁盘IO,导致数据库的性能下降。

即使将数据库升级改造成读写分离集群,随着业务的持续正能量,核心业务表也会产生瓶颈,数据量过大,当有功能使用这张表时,效率就会很低,会出现加载过慢的现象。

为了避免、解决大表带来的性能瓶颈,就需要对数据库进行分库分表的操作了。

  • 可以对业务量、数据量很大的数据库,进行分库操作,将其中的一部分表拆分到其他的数据库服务器中,程序同时连接这两个数据源,缓解单库50%的压力。

  • 也可以对数据量很大的一张表进行分表操作,将该表拆分成多张表,可以按照字段拆分,也可以按照数据量拆分,大多数情况下都是按照数据量进行拆分,例如将一张4500w行的表拆分成3张表,每张表承担1500w的数据量,缓解大表的压力。

分库分表的中心思想就是将数据分散存储在多个数据库节点中,使单一数据库或者数据量很大的表得到缓解,提高数据库的性能。

2.分库分表的拆分策略

分库分表的形式主要有两种方式,分别是垂直拆分和水平拆分,对于拆分的力度,又分为分库和分表。

2.1.垂直拆分

垂直拆分分为垂直分库和垂直分表。

所谓的垂直拆分指的将一个实体中的零件拆分到另一个实体上,相当于物理层面。

1)垂直分库

垂直分库指的是将一个库中的多个表,拆分到不同的库中,这就是垂直分库。

垂直分库中以表作为单位,根据业务表的不同,拆分到多个不同的数据库中。

垂直分库后不同库中存放平台库的表都是不同的,数据也都不相同,因为分库后,每一个库中会存放一部分表,各自表存放各自的数据,互不干涉,所有库的表加起来形成完整的平台库数据,

第104讲:数据库分库分表的意义与实现策略(MyCat)-LMLPHP

2)垂直分表

垂直分表指的是将一个表拆分成多个表,按照字段为单位作为拆分依据。

垂直分表后一张表会被拆分成多张表,每张表的表结构也不同,因为是按照字段拆分的,可能1-5个字段在A1表中,5-10个字段在A2表中,每张表的数据也不可能相同,分表后的多张表之间一般通过主键、外键进行关联。

垂直分表后,多张表的数据加起来才是完整的数据。

第104讲:数据库分库分表的意义与实现策略(MyCat)-LMLPHP

2.2.水平拆分

水平拆分分为水平分库和水平分表。

所谓的水平拆分是从逻辑层面上进行拆分,相当与搬家,换壳不换住户。

1)水平分库

水平分库是按照一定的策略以字段作为依据,将一个库的所有表拆分到多个库中,每个库中的表结构都是相同的,只是数据量不同,用户的读写操作会被路由到某一个分库中,缓解单库的压力,水平分库后,所有库的数据量才是完整的数据量。

第104讲:数据库分库分表的意义与实现策略(MyCat)-LMLPHP

2)水平分表

水平分库是按照一定的策略以字段作为依据,将一个表的数据拆分到多张表中,缓解单表的压力,拆分出来的多张表只是名字不同,表数据都相同,用户的读写操作会被路由到其中一个分表中,拆分出来的所有表的数据量加起来才是完整的数据量。

第104讲:数据库分库分表的意义与实现策略(MyCat)-LMLPHP

3.Mycat水平拆分的分片规则

Mycat水平分库分表,都是对表中的数据量进行拆分的,将一个数据库中的表数据拆分到多个数据库实例中,并不能实现将一个表在当前数据库中拆成多个表。

Mycat的分片规则都已经写好了,我们直接来调用即可,无需认为编写。

水平拆分主要是根据分片规则进行逻辑上的拆分,常用的水平拆分分片规则如下:

  • 范围分片
    • 根据表中的数据量大小,决定将表中的数据拆分到那些分片上,例如0~500w条数据拆分到分片1,500w-1000w数据拆分到分片2。
  • 取模分片
    • 根据数据量与节点数量的求模运算,根据运算结果,决定数据存储的分片,例如插入第50条数据,节点有4个,那么就是50÷4=12余2,余数2就是该条数据写入的分片ID。
  • 一致性Hash分片
    • 所谓一致性哈希,相同的哈希因子计算值总是被划分到相同的分区表中,不会因为分区节点的增加而改变原来数据的分区位置,有效的解决了分布式数据的拓容问题。
  • 枚举分片
    • 通过在配置文件中配置可能的枚举值, 指定数据分布到不同数据节点上, 本规则适用于按照省份、性别、状态拆分数据等业务
  • 日期分片
    • 根据日期时间来进行分库分表,常见的有按月分表,每个月产生一个新表。
03-04 19:14