随着应用的访问量并发量的增加,应用读写分离是很有必要的。当然应用要实现读写分离,首先数据库层要先做到主从配置。
应用实现读写分离至少有两种方法:
应用本身通过代码实现,例如基于动态数据源、AOP的原理来实现写操作时用主数据库,读操作时用从数据库。
通过中间件的方式实现,例如通过Mycat,即中间件会分析对应的SQL,写操作时会连接主数据库,读操作时连接从数据库。
本篇文章是介绍通过Mycat中间件的方式实现读写分离。
一、Mycat简介
Mycat是一款开源的数据库中间件,其官网为http://www.mycat.io/,其中官方对它介绍为:
Mycat 是一个强大的数据库中间件,不仅仅可以用作读写分离、以及分表分库、容灾备份,
而且可以用于多租户应用开发、云平台基础设施、让你的架构具备很强的适应性和灵活性,借助于即将发布的Mycat 智能优化模块,系统的数据访问瓶颈和热点一目了然,根据这些统计分析数据,你可以自动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个应用的代码一行也不用改变。
Mycat的实现原理为:
Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL 语句,首先对SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
二、部署环境规划
应用是直接连接Mycat,然后Mycat管理了1个主数据库和1个从数据库,架构如下:
其中每个组件对应服务器地址为:
Mycat:192.168.100.70:8066
mysql主库:192.168.100.70:3306
mysql从库:192.168.100.71:3306
三、mysql的安装
注意为mysql添加用户(从库最好用只读用户),以使可远程访问,添加用户脚本为:
创建用户:create user 'developer'@'%' identified by '123456';
主库赋权:grant all privileges on edu_admin.* to 'developer'@'%' ;
从库赋权:grant select on edu_admin.* to 'developer'@'%';
添加用户后还需要刷新权限:flush privileges;
四、mysql的主从配置
六、Mycat的安装
Mycat的安装非常简单,只需解压即可。
1. 下载:wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
2. 解压: tar -xzvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
3、复制解压后的文件夹到/usr/local/下,目录结构如下:
[root@localhost mycat]# clear
[root@localhost mycat]# pwd
/usr/local/mycat
[root@localhost mycat]# ll
total 16
drwxr-xr-x. 2 root root 4096 Aug 15 09:35 bin
drwxr-xr-x. 2 root root 6 Aug 15 09:35 catlet
drwxr-xr-x. 4 root root 4096 Aug 15 09:35 conf
drwxr-xr-x. 2 root root 4096 Aug 15 09:35 lib
drwxr-xr-x. 2 root root 6 Aug 15 09:35 logs
-rwxr-xr-x. 1 root root 219 Aug 15 09:35 version.txt
[root@localhost mycat]#
七、Mycat的配置
1. mycat的访问用户配置
修改/usr/local/mycat/conf/server.xml添加用户root,密码为123456,只保留一个user标签,如下:
<user name="root">
<property name="password">123456</property>
<property name="schemas">edu_admin</property>
</user>
2.schema配置
修改/usr/local/mycat/conf/schema.xml文件。其内容如下:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/" >
<schema name="edu_admin" checkSQLschema="false" sqlMaxLimit="100" dataNode="dataNode1"> </schema>
<dataNode name="dataNode1" dataHost="localhost1" database="edu_admin" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="192.168.100.70:3306" user="developer" password="123456">
<readHost host="hostS1" url="192.168.100.71:3306" user="developer" password="123456"></readHost>
</writeHost>
</dataHost>
</mycat:schema>
八、启动Mycat
启动:/usr/local/mycat/bin/mycat start
连接mycat: mysql -h 192.168.100.70 -P 8066 -uroot -p123456
Mycat启动成功后,会开放两个端口,即数据端口8066,管理端口9066
连接管理端口的命令同连接mysql:mysql -h 192.168.100.70 -P 9066 -uroot -p123456
九、读写分离的测试
连接Mycat,在命令行中操作insert语句及select语句,通过查看mycat的日志(mycat的日志目录为/usr/local/mycat/logs。日志级别可通文件/usr/local/mycat/conf/log4j2.xml调整)可以看到其连接到实际数据加的信息。