分库分表技术之MyCat(1)

393 阅读4分钟

「这是我参与11月更文挑战的第20天,活动详情查看:2021最后一次更文挑战

海量存储问题

如今随着互联网的发展,数据的量级也是成指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。

  • 阿里数据中心内景( 阿里、百度、腾讯这样的互联网巨头,数据量据说已经接近EB级)
  • 解决方案1: 使用NoSQL数据库,通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。
  • 解决方案2: NoSQL并不是万能的,就比如有些使用场景是绝对要有事务与安全指标的,所以还是要用关系型数据库,这时候就需要搭建MySQL数据库集群,为了提高查询性能,将一个数据库的数据分散到不同的数据库中存储,通过这种数据库拆分的方法来解决数据库的性能问题。

分库分表

什么是分库分表

简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载的效果。

  • 分库分表解决的问题
    • 分库分表的目的是为了解决由于数据量过大而导致数据库性能降低的问题,将原来单体服务的数据库进行拆分。将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。
  • 什么情况下需要分库分表
    • 单机存储容量遇到瓶颈
    • 连接数,处理能力达到上限

注意:
分库分表之前,要根据项目的实际情况确定我们的数据量是不是够大,并发量是不是够大,来决定是否分库分表。
数据量不够就不要分表,单表数据量超过1000万或100G的时候,速度就会变慢(官方测试)

分库分表的方式

分库分表包括:垂直分库、垂直分表、水平分库、水平分表 四种方式。

垂直分库

  • 数据库中不同的表对应着不同的业务,垂直切分是指按照业务的不同将表进行分类,分布到不同的数据库上面
    • 将数据库部署在不同服务器上,从而达到多个服务器共同分摊压力的效果

垂直分表

  • 将一个表按照字段分成多表,每个表存储其中一部分字段。
    • 对职位表进行垂直拆分,将职位基本信息放在一张表,将职位描述信息存放在另一张表

image.png

  • 垂直拆分带来的一些提升
    • 解决业务层面的耦合,业务清晰
    • 能对不同业务的数据进行分级管理、维护、监控、扩展等
    • 高并发场景下,垂直分库一定程度的提高访问性能
  • 垂直拆分没有彻底解决单表数据量过大的问题

水平分库

  • 将单张表的数据切分到不同的数据库中,每个数据库具有相同的库与表,只是表中数据集合不同。
  • 简单讲就是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面,例如将订单表按照id是奇数还是偶数,分别存储在不同的库中。

image.png

水平分表

  • 针对数据量巨大的单张表(比如订单表),按照规则把一张表的数据切分到多张表里面去。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈。

image.png

  • 总结
    • 垂直分表: 将一个表按照字段分成多表,每个表存储其中一部分字段。
    • 垂直分库: 根据表的业务不同,分别存放在不同的库中,这些库分别部署在不同的服务器
    • 水平分库: 把一张表的数据按照一定规则,分配到不同的数据库,每一个库只有这张表的部分数据
    • 水平分表: 把一张表的数据按照一定规则,分配到同一个数据库的多张表中,每个表只有这个表的部分数据

如何实现分库分表

当数据库进行分库分表后,数据由一个数据库分散到多个数据库中。此时系统要查询时需要切换不同的数据库进行查询,那么系统如何知道要查询的数据在哪个数据库中?当添加一条记录时要向哪个数据库中插入呢?这些问题处理起来都是非常的麻烦。

这种情况下可以使用一个数据库中间件mycat来解决相关的问题。接下来了解一下什么是mycat