MySQL:Mycat实现读写分离Season2:其二
Posted 漫步君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL:Mycat实现读写分离Season2:其二相关的知识,希望对你有一定的参考价值。
Mycat是一款使用Java编写、由阿里Cobar演变而来的用于支持数据库读写分离、分表分库的分布式中间件。支持mysql、Oracle、DB2、SQL Server、PostgreSQL等关系型数据库,同时也支持MongoDB等非关系型数据库。
I.Mycat原理
Mycat主要是通过对SQL的拦截,然后经过一定规则的分片解析、路由分析、读写分离分析、缓存分析等,然后将SQL发给后端真实的数据块,并将返回的结果做适当处理返回给客户端。(类似nginx,也可以实现反向代理,隐藏真实IP和实现负载均衡等)
他的同类别竞争对手是Sharding-jdbc,这个我们后面再说。
II.基于MyCat实现读写分离的原理
读写分离,简单的说就是把对数据库的读和写的操作分开,以对应不同的数据库服务器。主数据库提供些操作、从数据库提供读操作,这样能有效减轻单台数据库压力。
主数据库进行写操作后、数据及时同步到所读的数据库,尽可能保证读、写数据库的数据一致(如MySQL的主从复制、Oracle的data guard、SQL Server的复制订阅等)。
安装Mycat的步骤也很简单,下载相关安装包、解压之后在bin目录使用./mycat start就可以启动了
如果在log/wrapper.log查看到successfully说明mycat插件启动成功
然后就是配置读写分离,其中有三个主要的配置文件:
server.xml:Mycat的配置文件,设置账号、参数等
schema.xml:Mycat对应的物理数据库和数据库表的配置
rule.xml:Mycat分片(分库分表)规则,这个之后再进行说明
其中Mycat客户端连接端口号默认是:8066
更改配置后启动mycat,使用工具连接成功
这时我们分别用root账户和user账户进行连接,我们可以发现在user账户的连接中无法更改数据,只有读的权限,说明读写分离配置成功
然后我们使用SpringBoot2.0整合mycat多数据源利用动态数据源切换技术实现读写分离。
要实现读写分离,首先要搭建一个多数据源的环境,并且利用动态数据源技术实现多数据源之间的动态切换。
>多数据源:以分包的形式实现
>动态数据源:在JVM之间不断进行切换(包含多数据源)
在Spring 2.0.1中引入了AbstractRoutingDataSource,该类充当了DataSource的路由中介,能够在运行时根据某种key值来动态切换到真正的DataSource上。
>项目中需要集成多个数据源分别为读和写的数据源,绑定不同的key;
>采用AOP技术进行拦截业务逻辑层方法,判断方法的前缀是否需要写或者读的操作;
>如果方法的前缀是写的操作的时候,直接切换为写的数据源,反之切换为读的数据源(也可以自己定义注解进行封装)。
并构建常用功能类,最终实现读写分离
最后进行总结:
Q1:MyCat 的作用
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:其二的主要内容,如果未能解决你的问题,请参考以下文章