分库分表(简述)

为什么要进行分库分表

目前应用系统的最大瓶颈出现在数据库,主要是基于数据库的逻辑存储结构,和磁盘的物理特性决定了随机读取效率低下,无法靠简单磁盘阵列的扩展或者分布式文件系统,来提升性能。

 

数据库瓶颈

不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值。在业务Service来看就是,可用数据库连接少甚至无连接可用。接下来就可以想象了吧〈并发量、吞吐量、崩溃)。
IO瓶颈
        由于关系型数据库的存储结构,不适用于分布式文件系统,往往会出现磁盘读IO瓶颈,热点数据太多,
数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度==>分库和垂直分表。
        网络IO瓶颈,请求的数据太多,网络带宽不够==>分库。
CPU瓶颈
        SQL问题,如SQL中包含join, group by,order by,非索引字段条件查询等,增加CPU运算的操作==>SQL优化,建立合适的索引,在业务Service层进行业务计算。
        单表数据量太大,查询时扫描的行太多,SQL效率低,CPU率先出现瓶颈==>水平分表。

分库分表

垂直分片

概念:以表为依据,按照业务归属不同,将数据拆分到不同的分片中。

特点∶
1、每个库(表)的结构都不一样
2、每个库(表)的数据都(至少有一列)一样
3、每个库(表)的并集是全部数据
优点∶
1、拆分后业务清晰(专库专用按业务拆分)
2、数据维护简羊、按业务不同业务放到不同机器上

缺点:
1、如果单表的数据量大、读写压力大
2、受某种业务来决定、或者被限制。也就是说一个业务往往会影响到数据库的瓶颈(性能问题)
3、部分业务无法关联
join、只能通过java程序接口去调用,提供了开发复朵度。(商品、订单信息、会罚信息)
 

垂直分库
   系统绝对并发量上来了,并且可以抽象出单独的业务模块。
   到这一步,基本上就可以服务化了。例如,随着业务的发展一些公用的配置表、字典表等越来越多,这时可以将这些表拆到单独的库中,甚至可以服务化。再有,随着业务的发展孵化出了一套业务模式,这时可以将相关的表拆到单独的库中,甚至可以服务化。我们在微服务拆分的时候,其实已经完成了数据库的垂直拆分
 

 

垂直分表

   系统绝对并发量并没有上来,表的记录并不多,但是字段多,并且热点数据和非热点数据在一起,单行数据所需的存储空间较大。以至于数据库缓存的数据行减少,查询时会去读磁盘数据产生大量的随机读I0,产生IO瓶颈。
   可以用列表页和详情页来帮助理解。垂直分表的拆分原则是将热点数据(可能会冗余经常一起查询的数据)放在一起作为主表,非热点数据放在一起作为扩展表。这样更多的热点数据就能被缓存下来,进而减少了随机读I0。拆了之后,要想获得全部数据就需要关联两个表来取数据。但记住,千万别用join,因为join不仅会增加CPU负担并且会讲两个表耦合在一起(必须在一个数据库实例上)。关联数据,应该在业务Service层做文章,分别获取主表和扩展表数据然后用关联字段关联得到全部数据。
 

水平分片

概念:以字段为依据,按照一定策略(hash、range等),将数据拆分到多个分片中。分片多了,io和cpu的压力自然可以成倍缓解。

水平∶
    水平(横向)分库
    1、每个库(表)的结构都一样

    2、每个库(表)的数据都不一样

    3、每个库(表)的并集是全量数据
优点∶

   1、单库(表)的数据保持在一定的量(减少),有助于性能提高

    2、提高了系统的稳定性和负载能力

    3、拆分的表的结构相同、程序改造较少

缺点∶
    1、数据的扩容很有难度红护量大

    2、拆分规则很难抽象出来

    3、分片事务的一致性的问题部分业务无法关朕join、只能通过java程序接口去调用

 

 

水平分库:

系统绝对并发量上来了,分表难以根本上解决问题,并且还没有明显的业务归属来垂直分库。

 


 

水平分表:

系统绝对并发量并没有上来,变更不频繁,只是单表的数据量太多,存在冷热数据,影响了SQL效率,加重了CPU负担,以至于成为瓶颈。

 

常见分片策略

1、基于范围分片
时间︰按照年、月、日去切分。例如order_2020、order_202005、order_20200501。

地域:按照省或市去切分。例如order_beijing、order_shanghai、order_chengduo

大小:从0到1000000一个表。例如1000001-2000000放一个表,每100万放一个表

优点︰新的数据可以落在新的存储节点上,如果集群扩容,数据无需迁移。

缺点:数据热点分布不均,数据冷热不均匀,导致节点负荷不均。

 

2、Hash取模分片
整型的Key可直接对设备数量取模,其他类型的字段可以先计算Key的哈希值,然后再对设备数量取模。假设有n台设备,编号为0 ~ n-1,通过Hash(Key) % n就可以确定数据所在的设备编号。该模式也称为离散分片。

优点︰实现简单,数据分配比较均匀,不容易出现冷热不均,负荷不均的情况。
缺点︰扩容时会产生大量的数据迁移,比如从n台设备扩容到n+1,绝大部分数据需要重新分配和迁移。(有优化方案)


3、一致性Hash+虚拟节点
通过一致性Hash+虚拟节点可以在保证数据冷热均匀的基础上,大大减少数据迁移的工作量

 

4、分组法
Hash分片是可以解决数据均匀的问题,范围法`可以解决数据迁移问题,那我们可以不可以两者相结合呢?利用这两者的特性呢?
考虑在hash分片的基础,加上一个Group的概念,组内遵循hash分片,组与组之间,采用范围法

因为组内采用了hash分片,这样落在每一个分片的数据是基本平均的,每一个数据库关联不同的分片,而且数据库也可以关联不同分组的分片,这样就可以保证每个数据库的流量平均,并且扩容只需要新增一个组就可以了。
 


 

 

 

 


版权声明:本文为qq_41919738原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。