详解:通过MyCAT数据库中间件实现MySQL5.5的读写分离

详解:通过MyCAT数据库中间件实现MySQL5.5的读写分离

3330发表于2017-06-18

一、数据库中间件

读写分离是比较常用的数据库架构,尤其是对于访问量比较大的系统。可能你生产系统就一个写库Master一个读库Salve,你会在程序中手动指定一些业务辑采用读库来降低对写库的访问压力。程序端实现是最简单的方式,但是有个弊端是数据库与业务代码耦合比较大,数据库的变动也会涉及到相关代码的变动,比如:如果我数据库的地址发生改变了或者加了一台读库,那么我们的程序端也要进行相应的修改。如果数据库不小心挂掉了,则同时也意味着程序的不可用,而这对很多应用来说,并不能接受。除此之外,开发工程师要对要明确知道两个库的存在,而且要对两库的作用比较熟悉。


你可能会想有没有一种比较好的方案,对于开发工程师来说读写分离的数据库隐藏在后端,他们不用关心哪些是读库,哪些是写库。他们开发程序的时候和原来采用一个库是一样开发,这样就能够起到多个读写数据库对于应用Application是透明,这样就大大的降低了程序对于后端数据库的耦合,提高的系统的扩展和维护性。


这时候就有了数据库中间件就有用武之地了。


引入MySQL中间件能很好的对程序端和数据库进行解耦,这样程序端只需关注数据库中间件的地址,而无需知晓底层数据库是如何提供服务。


Mycat数据库分库分表中间件是国内最活跃的、性能最好的开源数据库中间件!

Mycat官网:http://www.mycat.org.cn/

Mycat开源项目地址:https://github.com/MyCATApache/Mycat-download

Mycat下载地址:http://dl.mycat.io/1.6-RELEASE/


今天我就通过MyCAT数据库中间件实现MySQL5.5的读写分离。

前一篇文章:VMware虚拟机Ubuntu14上搭建mysql5.5主从master&slave(超详细)

有详情介绍Mysql怎么实现主从数据库,一台写库,一台备库,备库的数据自动从主库同步过来。

我们接着上一篇文章的环境继续。


VMware8.0.3 build-703057
Ubuntu:14.04 Server
mysql: 5.5.52-0ubuntu0.14.04.1

虚拟机主机:

192.168.26.128(master)

192.168.26.129(slave)

192.168.1.129(Mycat-server-1.6 Windows版本)



一、下载Mycat-server编译好的版本

这里Mycat是在Windows上运行,所以要下载Windows版本,本例下载版本是

Mycat-server-1.6-RELEASE-20161012170031-win

下载解压到D盘根目录

二、配置Mycat

找到conf目录下面的schema.xml更改数据源相关的信息,最终的效果如下:

<?xml version="1.0"?> 
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
 <mycat:schema xmlns:mycat="http://io.mycat/"> 
	 <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> 
	 </schema> 
	 <dataNode name="dn1" dataHost="localhost1" database="lanhusoft" /> 
	 <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" slaveThreshold="100"> 
		<heartbeat>select user()</heartbeat> 
		<!--<writeHost host="hostM1" url="192.168.26.128:3306" user="root" password="root" />--> 
		<!--<readHost host="hostS1" url="192.168.26.128:3306" user="root" password="root" /> --> 
		<!-- can have multi write hosts --> 
		<writeHost host="hostM1" url="192.168.26.128:3306" user="root" password="root">
			<readHost host="hostS1" url="192.168.26.129:3306" user="root" password="root" weight="1" /> 
		</writeHost>	
	</dataHost> 
 </mycat:schema>

上面配置了一个逻辑库TESTDB,对应数据结点是dn1,因为Mycat是一个分布式数据库管理系统,所以都是采用结点的形式,dn1对应只有一个数据主机localhost1,数据库名字为lanhusoft,里面又配置了一写库192.168.26.128,一个读库192.168.26.129。

更多schema.xml结点及参数详细配置请参考官网文档。

其它文件不用改,保证192.168.26.128和192.168.26.129的两台数据库能正常连,这个时候我们进入cmd切换到Mycat的bin目录,运行startup_nowrap.bat文件。

三、测试并验证读写分离

如果不出意外,启动成功就可以通过Navicat连接Mycat定义的数据库集群了。

运行startup_nowrap.bat显示有如下提示就表示Mycat启动成功:

MyCAT Server startup successfully. see logs in logs/mycat.log

连接地址:

192.168.1.129

端口:8066

用户名和密码是conf目录下面的server.xml下定义的,如下图:


可以看到定义了两个用户root和user都有访问schema.xml里面定义的逻辑库TESTDB的权限,不过user只能读。

我们就使用root这个用户来连navicat,和连接普通数据库是一样的只不过端口是8066,连接进去后我们选中TESTDB新建一个查询插入两条数据。


INSERT into userinfo values(3,'master128','www.lanhusoft.com',now()) INSERT into userinfo values(3,'master128_2','www.lanhusoft.com',now())



我们直接连接Slave(129)数据库查看一下通过Mycat插入的数据在从库的同步情况。


可以看到数据已经成功的同步过来了。这我看到读写的效果,我们单独在这个Slave从库写入一条数据让两个库数据不一样。


mysql> INSERT into userinfo values(2,'slave129','www.lanhusoft.com',now()); Query OK, 1 row affected (0.01 sec)执行完结查询一下数据:



接下来我们在之前用Navicat连接的Mycat查询一下表userinfo数据。

可以看到Mycat查询的数据和从库的数据一模一样。

最后我们直接连接Master(128)数据库查看一下表userinfo数据。

可以看到上面是没有我们在Slave单独插入的数据的。

这就证明了我们配置Mycat读写分离是生效了,写走主库128,读走从库129。

===========================

ps:

在试验的过程中遇到过连接Mycat不上的情况,查看日志出现下面错误:


can't connect to mysql server ,errmsg:Host '192.168.26.1' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'


原因:

同一个ip在短时间内产生太多(超过mysql数据库max_connection_errors的最大值)中断的数据库连接而导致的阻塞

解决方法:

1、提高允许的max_connection_errors数量:

  ① 进入Mysql数据库查看max_connection_errors: show variables like '%max_connection_errors%';

    ② 修改max_connection_errors的数量为1000: set global max_connect_errors = 1000;

  ③ 查看是否修改成功:show variables like '%max_connection_errors%';

2、使用mysqladmin flush-hosts 命令清理一下hosts文件(不知道mysqladmin在哪个目录下可以使用命令查找:whereis mysqladmin);

  ① 在查找到的目录下使用命令修改:/usr/bin/mysqladmin flush-hosts -h192.168.1.1 -P3308 -uroot -prootpwd;

  备注:

    其中端口号,用户名,密码都可以根据需要来添加和修改;

    配置有master/slave主从数据库的要把主库和从库都修改一遍的(我就吃了这个亏明明很容易的几条命令结果折腾了大半天);

    第二步也可以在数据库中进行,命令如下:flush hosts;



小编蓝狐