小白白话技术之MYSQL分库分表的那点事

这是一篇关于MYSQL分库分表的一些思路白话介绍篇,希望直白的语言有助于你更容易理解MYSQL的分库分表的思路和应用。

分库分表听着挺复杂的个事情,为什么要分库分表,怎么分库分表,分库分表会遇到什么问题,怎么克服这些问题就是这里要讨论的。

首先,我们假设有个应用系统需要存储访问数据到MYSQL,如果数据量、流量都很小,在不考虑容灾的情况下,将应用的表放到一个数据库实例中,也就是我们说的单表单库就够用了。

如果业务发展的好,数据量和流量有所增加,分析认为数据库出现瓶颈,这时我们可以通过换更好的硬件来提高数据库的性能和容量,比如增加CPU、内存等等手段。这样不需要改动应用。

如果业务发展太好了,数据量和流量增加很大,已经超过了升级硬件可以解决的极限,那么就要换个思路了。首先,要明确要解决什么问题,一、降低单机的负载,二、提升整体负载的能力,三、提供扩容伸缩的能力。这时候就可以考虑分库分表了,但是还是要结合具体情况采取不同的策略。

情况一、写的压力不大,读的压力特别大,这种情况就适合把读写进行分离,Mysql的主从模式,刚好可以把读分布到从库上。

情况二、数据库中多个业务表导致数据库的压力大,可以把不相关的业务表拆分到不同的数据库,降低了单个数据库的压力,提升了整体的负载能力,显然这是一个分库策略。

情况三、数据库中单个表的压力大,比如数据量大、写的压力大,这时就要考虑分表了,分表一般是指水平分表,就是把一个业务表水平拆分成若干子表,当然拆分要有规则,也就是拆分算法。首先水平拆分不一定非得把表拆分到不同的数据库中,这个需要结合具体业务情况,这里我们讨论分表并分库的情况。

首先要解决怎么分,需要明确分的策略,也就是分的算法,具体操作先明确用来分库分表的维度,然后应用分库分表算法,常见的算法有取模、哈性、取值范围、建立映射关系表等,通过俩个步骤分库分表显然带来了容量和负载上的扩充。但是也给应用带来复杂性。具体遇到的问题有,一、排序,二、聚合运算包括一些函数,三、分页处理,四、跨库JOIN,五、递增字段序列处理,六、非分表字段查询,七、事务。下面在说下每种情况的处理方式:

一、             排序,这种可以考虑对所有表进行扫描,然后做聚合,也可以做一个对应的全局表并映射到各分表。

二、             聚合运算,可以先单独子表进行聚合运算,然后应用层进行进一步聚合运算或合并,也可以直接在应用层处理。

三、             分页处理,这种可以考虑对所有表进行扫描,然后做聚合,也可以做一个对应的全局表并映射到各分表。

四、             跨库JOIN,可以通过数据异构来实现,也就是说同时用多个维度进行拆分,按照需要进行查询。

五、             递增字段序列处理,可以考虑各自独立递增,也可以采用全局集中管理递增的方式,或预分配的方式。

六、             非分表字段的查询,可以考虑数据异构的方式。

七、             事务,采用分布式事务的方式。

 

有了思路,我们怎么实现呢?

一种是利用分库分表中间件,但这种有学习成本,还有一种是利用应用层自己实现,比如直接利用JD BC实现或者利用一些开源框架比如sharding-jdbc。

         最后增加一个问题,就是MYSQL的双写是解决什么问题的呢?

posted @ 2020-03-03 18:26  小白成长手札  阅读(278)  评论(0编辑  收藏  举报