Mycat和分库分表

mycat是一种非常流行的分布式数据库中间插件,mycat的作用为满足数据库的大量存储,提高了查询性能,从架构的角度来理解就是前端用户可以把mycat看作是一个数据库的代理,核心功能是分库分表,即将一个大表水平分割为n个小表。

mycat的原理是拦截了用户发送过来的sql语句,首先对sql语句做一些特定的分析,如分片分析,路由分析,读写分离分析,缓存分析,然后将此sql发送到后端真实的数据库,主要的配置文件是rule.xml, schema.xml和server.xml。

数据库的分片是指通过某种特定的条件,将我们存放在一个数据库中数据分散到不同的数据库中,有两种切片方式,一种是水平切分,一种是垂直切片,水平切片是指将同一个表中的数据切分到不同的数据库中,垂直拆分比较简单,按业务角度拆分成多个库,即原来库里的不同分别放到不同的库中。

分库分表的方案:hash取模和range范围方案;分库分表方案最主要的就是路由算法,把路由的key按照指定的算法进行路由存放。

1、Hash取模算法

在设计系统之前,可以估计一下大概这几年的订单量,如4000万。每张表可以容纳1000万,我们可以设计4张表进行存储。具体的实现过程如下图所示:

Mycat和分库分表

  • 优点

订单数据可以可以均匀分布,不会有热点问题。

  •  缺点

将来的数据迁移和扩容,会比较困难。

2、range范围方案

这种方案就是以范围对数据进行拆分,具体实现过程如下图所示,非常好理解。

Mycat和分库分表

  • 优点

有利于将来的扩容,不需要进行数据的迁移

  • 缺点

有热点问题,如果要查询一个范围内的数据,只会集中在一张表中。

 

3、总结

上面的两种方案有他们各自的优点与缺点,能不能结合他们的优点,做出分库分表最好的方案呢?即不需要迁移数据,又能解决数据热点的问题呢?