Mycat实现Mysql数据库读写分离

一、概述

输入图片说明

Mycat在应用中的作用描述如下图:

输入图片说明

其中Mysql master为主库负责读写,Mysql slave为从库负责读。通过这样的方式可以让程序员只需要关心业务代码的编写,而不用担心后端数据库集群的负载均衡,读写分离,分库分表的数据分片逻辑的编写,只要直接连接Mycat就可以了。

环境:

我们需要三台服务器,在此我用VirtutualBox开启三个虚拟机,信息如下:

10.10.11.167 :安装Mycat
10.10.11.142:master主库,负责读写
10.10.11.163:slave从库,负责读
*:系统均为centos7

二、Mysql安装

Centos安装Mysql

三、Mysql配置主从同步

1、修改主库配置my.cnf:

[mysqld]
server-id=1    #唯一标识
log_bin=mysql-bin   #日志文件
binlog-do-db=test   #需要同步的库
binlog-ignore-db=mysql  #不需要同步的库

2、在主数据库上创建同步账号

GRANT REPLICATION SLAVE,FILE ON *.* TO 'root'@'10.10.11.163' IDENTIFIED BY '123456';

验证配置是否成功:

mysql> show master status;

成功如图所示,如果出现Empty set (0.00 sec)证明上一步配置有问题,返回仔细检查一下。 输入图片说明

此处需要记住File和Posittion,后面配置从库会用到。

3、修改从库My.cnf:

[mysqld]
server-id=2    #唯一标识
log_bin=mysql-bin   #日志文件
binlog-do-db=test   #需要同步的库
binlog-ignore-db=mysql  #不需要同步的库

基本跟主库配置相同,注意server-id唯一

这里可以看到,在MySQL5.6之后的版本中没有指定master-host,user和password,因为如果你在MySQL5.6和之后的版本中配置从库的时候,设置到了上边的内容,即指定了master-host、master-user等信息的话,重启MySQL的时候就会报错。

修改完/etc/my.cnf 文件之后,重启一下MySQL

mysql> stop slave;  #关闭Slave
mysql> change master to master_host='10.10.11.142',master_user='root',master_password='123456',master_log_file='mysql-bin.000003', master_log_pos=120;

mysql> start slave;  #开启Slave

在这里指定Master的信息,master_log_file是在配置Master的时候的File选项, master_log_pos是在配置Master的Position 选项,这里要进行对应。

然后可以通过mysql> show slave status; 查看配置的信息:

4、测试 在主库中新增数据库表,然后观察从库变化

四、Mycat配置

Mycat下载地址

下载之后解压即可,启动命令:mycat/bin/mycat start,端口默认为8066

1、配置JDK并设置Mycat环境变量

Mycat是用java编写的,所以需要jre运行环境

export MYCAT_HOME=/sorin/java/mycat
export PATH=$PATH:$MYCAT_HOME/bin

刷新配置文件使生效:source /etc/profile

2、修改mycat配置文件

进入mycat目录下conf文件,此处我们需要更改两个配置文件,schema.xml和server.xml

server.xml配置如下:

<!-- 注意这里的TESTDB 不一定是你数据库上的真实库名.可以任意指定.只要和接下来的schema.xml的配置文件中的库名统一即可 -->
	<user name="root">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</property>
	</user>
	<user name="user">
		<property name="password">user</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">true</property>
	</user>

schema.xml配置如下:

<mycat:schema xmlns:mycat="http://io.mycat/">
	<!-- 定义MyCat的逻辑库 --> 
	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="pcxNode"></schema>
	<!-- 定义MyCat的数据节点 -->  
    <dataNode name="pcxNode" dataHost="dtHost" database="test" />  
  
      
    <!-- 定义数据主机dtHost,连接到MySQL读写分离集群 ,schema中的每一个dataHost中的host属性值必须唯一-->  
    <!-- dataHost实际上配置就是后台的数据库集群,一个datahost代表一个数据库集群 -->  
    <!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->  
    <!-- writeType="0",所有写操作发送到配置的第一个writeHost,这里就是我们的hostmaster,第一个挂了切到还生存的第二个writeHost-->  
    <dataHost name="dtHost" maxCon="500" minCon="20" balance="1"  
        writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">  
        <!--心跳检测 -->  
        <heartbeat>show slave status</heartbeat>  
          
        <!--配置后台数据库的IP地址和端口号,还有账号密码 -->  
        <writeHost host="hostMaster" url="10.10.11.142:3306" user="root" password="123456">
			<!-- can have multi read hosts -->
			<readHost host="hostSlave" url="10.10.11.163:3306" user="root" password="123456" />
		</writeHost>
    </dataHost> 
</mycat:schema>

dataHost里面属性的具体含义自行百度吧,这里只涉及读写分离

五、测试

如果一切顺利,此时可以用mysql客户端链接mycat服务了

测试是否读写分离,停掉从库同步服务mysql>stop slave; 此时通过mycat新增数据,如果主库能查询到而mycat和从库查询不到,证明成功!

最后按照惯例,来几张成功的结果:)

通过mycat新增一条数据,在master主库上面是可以查询到:

输入图片说明

通过slave从库查询不到刚才新增的数据,因为已经关闭了主从同步:

输入图片说明

通过mycat查询,如果查询的结果和slave的结果一致证明走的从库查询,成功:

输入图片说明

日志信息如下:

输入图片说明

*:mycat并不是一个数据库,但是它伪装成一个数据库,也就是虚拟数据库,在我们的应用程序里面连接mycat服务即可,而不用去动态管理数据源。

*:mycat很强大,有很多其他的功能,后续再学习,学无止境....

猜你喜欢

转载自my.oschina.net/u/2489726/blog/1528833