一、前言
一直对mysql的读写分离很感兴趣,但是公司的项目规模比较小,一直没有这种机会,最近自己捣鼓了一下,特此记录一下。
这里说一下简答mycat,mycat的是一款数据库中间件,功能比较强大,可以支持数据库的分库分表等等很多功能,感兴趣的的可以自行去学习,这里主要用到了最基础的读写分离的功能。
这里要特地提一下,读写分离的前提是mysql的主从复制是自己配置,mycat只负责读写分离的,并不支持主从复制的配置。我采用了比较新的GTID的方式来配置主从复制,我转载了我当时参考的一篇文章,感兴趣的可以自行尝试,链接如下:
https://blog.youkuaiyun.com/wuqingbin/article/details/79918409
另外,读写分离需要多个数据库,如果没有多台服务器的情况下,可以采用docker的方式,在一台服务器上配置多个mysql服务,我个人就是采取这种方式。但是docker我也是初学,在此就不多做介绍,很好的东西,推荐学习。
配置环境:
1、centos5.7
2、mysql 5.7.19
3、Mycat 1.6
二、mysql准备
我这里准备了两个mysql服务,同时也配置好了主从复制
mysql1(master):192.168.1.100:3308 root/123456
mysql2(slave):192.168.1.100:3309 root/123456
以为是采用docke在同一台centos上面配置的,所以ip一样
三、mycat 安装
1、到mycat的官网下载适合自己的版本,上面也有教程,简单安装还是非常简单的。这里我下载的版本是:
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
2、将文件复制到 /usr/local 目录下,解压
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
使用mv命令,将解压后的文件夹改名为Mycat
3、配置mycat环境变量
vi /etc/profile,在系统环境发量文件中增加 MYCAT_HOME=/usr/local/Mycat
执行 source /etc/profile 命介,使环境发量生效
四、mycat配置
1、 截止都第三步,mycat安装成功,但是还没有启动。我们要先配置mycat的用户。
vim /usr/local/Mycat/conf/server.xml
server.xml主要是用来配置mycat的基本信息,可以不做改变,我的server.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>
这里配置了两个用户root和user,mycat默认的数据端口是8066,大家可以采用平时连接mysql的方式来连接mycat
2、配置schema.xml ,这个文件的配置非常重要,可以说是mycat最核心的配置
vim /usr/local/Mycat/conf/schema.xml
下面是我完整的 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">
<table name="employee" primaryKey="ID" dataNode="dn1" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="d1" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.1.100:3308" user="root" password="123456">
<readHost host="hostS1" url="192.168.1.100:3309" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
从上到下解读:
1、schema标签,对应的是server.xml中的user下的schema属性
2、table标签,很好理解,就是控制的表,目前我理解的是,没控制一张表,都要在这里配置,其中dataNode属性与下面的dataNode标签对应,可以输入多个,用逗号隔开,用作分库。目前没有这个需求,所以就只写了一个
3、dataNode标签,数据节点标签,dataHost属性与下面的dataHost标签相对应,database属性,代表的是指向具体哪个数据库
4、dataHost标签,字面上表示是数据主机,这里重点说一个balance表情,设置成1,读写分离才能生效,默认为0
5、writehost标签,用来表示具体的写入数据库
6、readhost标签,用来表示具体的读数据库
这里只是大概描述,详细配置及说明的请参考mycat的权威指南,写的非常清楚。
五、mycat启动
进入/usr/local/Mycat/bin
./mycat start
可以试用ps -ef|grep mycat 来看一下mycat是否启动成功。
命令行登陆mycat
mysql -h127.0.0.1 -uroot -p123456 -P8066
六、关于测试
个人建议可以先停掉mysql的主从复制,在保证mysql1和mysql1两个数据库内employee表的表结构相同的情况下,手动修改两个表的数据,显示出差异性。然后通过mycat的链接,来进行读取和写入employee,分别观察mysql1和mysql1的数据变化,来确定读写分离是否起作用了。
不是太擅长写博客,写的比较粗略,仅作记录,有感兴趣的小伙伴可以给我留言,相互学习。