开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(一):MyCat-入门-原理介绍】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/755/detail/13250
MyCat-入门-原理介绍
MyCat 原理介绍
在 mycat 的原理当中有非常重要的一个动词叫”拦截”,他拦截了用户发送过来的SQL 语句,首先对 SQL 语句做一些特定的分析,如分析、路由分析、读写分析分析、缓存分析等,然后将此 SQL 语句发往后端的真实数据库,并将返回的结果做适当处理,最终再返回给用户,如图所示:
应用程序 application 发送一条 SQL 语句,它直接操作的是 mycat。注意现在如果使用 mycat,应用程序在操作的时候它操作的是 mycat, 将这个 SQL 语句发送给mycat 之后,mycat 要对这个 SQL 语句进行一系列复杂的处理,其中包含对于SQL 语句的解析,分片的解析,路由的解析,读写分离的解析,以及对于数据的一些解析。
解析完这条 SQL 语句之后,最终来决定当前执行的操作,到底要去查到哪几个数据节点当中来查找数据。已上图为例:实际上是对一张表进行了分片操作,就是user 表分成了三片,dn1,dn2 和 dn3 这三个数据节点。
那么也就是说 user 这张表的数据分散存储在了三个数据节点当中,那么它所使用的分片规则,叫做字符串枚举分片,字符串枚举分片指的是按照某一个特定字段的字符串的值来进行分片。
如果值是 0,那么数据将会存储在第一个节点上,如果 status 值是 1,数据将会存储在第二个节点上,status 值为 2,数据将会存储在第三个节点上。当然 status 取值也就为 0,1,2,只有这三种情况。
再去执行 select from user where status=0 这条 SQL 语句的时候,mycat 会拦截SQL 语句,然后对 SQL 语句进行解析,查询的是哪张表?是根据哪个字段来进行查询的?字段的值是什么?解析完毕之后就得到,当前这个请求要去查询的是第一个数据节点,因为第一个数据节点,它的 status 值是 0,假如用户发送的 SQL 语句不再是 0,而是 0,1。
这个时候经过 mycat 的 SQL 语句的解析,这一次查询要到 dn1 和 dn2 两个节点当中进行查询,它就会分别到两个节点当中进行查询,然后再将查询的结果进行合并,进行排序等相关处理,最终返回给应用程序。
所以在这幅图当中,应用程序在进行编写的时候只需要操作 mycat 就可以了。至于这条 SQL 语句到底要操作底层的哪些数据库的节点,不需要关心,这是 mycat 要做的事情。
那么这就是 mycat 的原理。对于 mycat 的原理,重点理解一下这一幅图。