MySQL:Mycat实现读写分离Season2:其二

Posted 漫步君

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL:Mycat实现读写分离Season2:其二相关的知识,希望对你有一定的参考价值。

Mycat是一款使用Java编写、由阿里Cobar演变而来的用于支持数据库读写分离、分表分库的分布式中间件。支持mysqlOracleDB2SQL ServerPostgreSQL等关系型数据库,同时也支持MongoDB等非关系型数据库。

I.Mycat原理

Mycat主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端。(类似nginx,也可以实现反向代理,隐藏真实IP和实现负载均衡等)

他的同类别竞争对手是Sharding-jdbc,这个我们后面再说。

 

II.基于MyCat实现读写分离的原理

读写分离,简单的说就是把对数据库的读和写的操作分开,以对应不同的数据库服务器。主数据库提供些操作、从数据库提供读操作,这样能有效减轻单台数据库压力。

主数据库进行写操作后、数据及时同步到所读的数据库,尽可能保证读、写数据库的数据一致(如MySQL的主从复制、Oracledata guardSQL Server的复制订阅等)。

MySQL:Mycat实现读写分离【Season2:其二】

安装Mycat的步骤也很简单,下载相关安装包、解压之后在bin目录使用./mycat start就可以启动了

如果在log/wrapper.log查看到successfully说明mycat插件启动成功

MySQL:Mycat实现读写分离【Season2:其二】

然后就是配置读写分离,其中有三个主要的配置文件:

server.xmlMycat的配置文件,设置账号、参数等

MySQL:Mycat实现读写分离【Season2:其二】

schema.xmlMycat对应的物理数据库和数据库表的配置

MySQL:Mycat实现读写分离【Season2:其二】

rule.xmlMycat分片(分库分表)规则,这个之后再进行说明

其中Mycat客户端连接端口号默认是:8066

更改配置后启动mycat,使用工具连接成功

MySQL:Mycat实现读写分离【Season2:其二】

这时我们分别用root账户和user账户进行连接,我们可以发现在user账户的连接中无法更改数据,只有读的权限,说明读写分离配置成功

MySQL:Mycat实现读写分离【Season2:其二】


然后我们使用SpringBoot2.0整合mycat多数据源利用动态数据源切换技术实现读写分离。

要实现读写分离,首先要搭建一个多数据源的环境,并且利用动态数据源技术实现多数据源之间的动态切换。

>多数据源:以分包的形式实现

>动态数据源:在JVM之间不断进行切换(包含多数据源)

 

Spring 2.0.1中引入了AbstractRoutingDataSource,该类充当了DataSource的路由中介,能够在运行时根据某种key值来动态切换到真正的DataSource上。

>项目中需要集成多个数据源分别为读和写的数据源,绑定不同的key

>采用AOP技术进行拦截业务逻辑层方法,判断方法的前缀是否需要写或者读的操作;

>如果方法的前缀是写的操作的时候,直接切换为写的数据源,反之切换为读的数据源(也可以自己定义注解进行封装)。

MySQL:Mycat实现读写分离【Season2:其二】

MySQL:Mycat实现读写分离【Season2:其二】

MySQL:Mycat实现读写分离【Season2:其二】

MySQL:Mycat实现读写分离【Season2:其二】

并构建常用功能类,最终实现读写分离

 

MySQL:Mycat实现读写分离【Season2:其二】


最后进行总结:

Q1MyCat 的作用

Mycat是一款使用Java编写、由阿里的Cobar演变而来的用于支持数据库的读写分离、分表分库的分布式中间件,由Java编写,实现的功能类似Nginx

Mycat主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实数据服务器,并将返回的结果做适当的处理然后返回给客户端

 

Q2:数据库如何实现读写分离

把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供些操作,从数据库提供读操作,这样能有效减轻单台数据库的压力。主数据进行写操作后通过MySQL的主从复制及时同步到所有的读数据库(从库),尽可能保证主从数据库的数据是一致的

1.使用Mycat中间件通过AOP技术实现多数据源动态切换,并通过配置不同权限用户从而实现读写分离

2.使用Sharding-jdbc中间件在配置文件中配置读写分离的JDBC连接,主从库采用主从同步保证数据一致性,然后利用Sharding-JDBC自动判断SQL语句时DML还是DQL利用AOP技术连接不同的数据源发送JDBC请求

 

Q3:动态切换数据源底层原理实现

Spring2.0.1中引入了AbstractRoutingDataSource,充当DataSource的路由中介,可以在运行时根据某种策略绑定不同的key来动态切换到真正的DataSource

1.项目中集成多个数据源,分别绑定不同的key

2.采用AOP技术拦截业务逻辑层方法,并通过判断需要切到哪个数据源,然后利用AbstractRoutingDataSource切换到真实数据源


随笔,是记忆的一种延伸

以上是关于MySQL:Mycat实现读写分离Season2:其二的主要内容,如果未能解决你的问题,请参考以下文章

MySQL(18) 通过Docker搭建Mycat实现读写分离

MyCAT实现MySQL的读写分离

Mycat 实现 MySQL 主从架构的读写分离

Mycat实现Mysql主从读写分离

mycat实现MySQL读写分离

随手记:MyCAT实现MySQL集群与读写分离