为什么要进行分库分表
目前应用系统的最大瓶颈出现在数据库,主要是基于数据库的逻辑存储结构,和磁盘的物理特性决定了随机读取效率低下,无法靠简单磁盘阵列的扩展或者分布式文件系统,来提升性能。
数据库瓶颈
不管是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分片,这样落在每一个分片的数据是基本平均的,每一个数据库关联不同的分片,而且数据库也可以关联不同分组的分片,这样就可以保证每个数据库的流量平均,并且扩容只需要新增一个组就可以了。