一、概述
Mycat在应用中的作用描述如下图:
其中Mysql master为主库负责读写,Mysql slave为从库负责读。通过这样的方式可以让程序员只需要关心业务代码的编写,而不用担心后端数据库集群的负载均衡,读写分离,分库分表的数据分片逻辑的编写,只要直接连接Mycat就可以了。
环境:
我们需要三台服务器,在此我用VirtutualBox开启三个虚拟机,信息如下:
10.10.11.167 :安装Mycat
10.10.11.142:master主库,负责读写
10.10.11.163:slave从库,负责读
*:系统均为centos7
二、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/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很强大,有很多其他的功能,后续再学习,学无止境....