mycat是一个数据库中间件,也可以理解为是数据库代理。在架构体系中是位于数据库和应用层之间的一个组件,并且对于应用层是透明的,即数据库感受不到mycat的存在,认为是直接连接的mysql数据库,见下图:
MyCAT原理
MyCAT主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端。
mycat的三大功能:分表、读写分离、主从切换;
实现方式:在mycat的配置文件schem.xml配置writehost 跟readhost, server.xml配置数据库的账户信息,rule.xml用于分库分表的规则。
为什么要用mycat:
主要配合作用于对于系统业务的扩展。例如为了快速开发一个电商小项目,前期就是一个单工程,应用层直接到数据库。当我们的登录注册用户量上来之后,我们可以开始对数据库进行一个读写分离的配置,将读的压力全部分发到slave承担。这时候就能解决很大一部分的压力。
当然仅仅只有一个读写分离,还是不行的。我们后续可能要针对系统应用层进行一个横向拓展跟纵向的拆分,拆分为订单中心,会员中心,注册中心... 那么此时我们的数据库也相应的拆分成单独部署的几个独立数据库提供给相应的数据持久化,然后将这些数据源配置在mycat当中,对于应用层面来说是透明的,应用层不用再去理会我到底连接的是哪个数据库,mycat通过自身的配置可以完成这个任务。
再到后面我们订单表越来越庞大,到达了单表几千万甚至一个亿,这个时候我们考虑用mycat进行单表的一个拆分,拆分的规则有很多种,可以按月拆分,取模拆分。当我们进行访问订单表的时候,mycat会根据我们的分片规则解析sql自动的路由派发到相应的子表上去,从而减轻单表几千万的压力。