前置环境
事先准备3台虚拟机,其配置如下
- 主数据库(master)ip:192.168.126.151,装有percona5.6.51
- 从数据库(slave)ip:192.168.126.152,装有percona5.6.51
- mycat服务(mycat)ip:192.168.126.153,装有mycat
另外,以上3台服务器均需配置jdk(1.8)
配置主从
master
master服务器上,使用vim /etc/my.cnf
打开mysql配置文件,加入
server-id=1
log-bin=mysql-bin # binlog
重启mysql
service mysql restart
进入mysql通过show master status
可以看到,其中File字段即为binlog文件名字
slave
与master一样,使用vim /etc/my.cnf
并添加
server-id=2
log-bin=mysql-bin # binlog
然后在mysql中执行如下语句
CHANGE MASTER TO MASTER_HOST="192.168.126.151",
MASTER_PORT=3306,
MASTER_USER="root",
MASTER_PASSWORD="root",
MASTER_LOG_FILE="mysql-bin.000002",
MASTER_LOG_POS=120
以上均要与master中的值一样。
执行start slave
开启服务,并使用show slave status
查看,如出现下图,则成功完成主从配置
这时我们修改master,则slave也会出现相应更改。
注意: 如果主从是由同一台虚拟机克隆而来的话,server-uuid会一样,这时需要删除其中一台虚拟器的/var/lib/mysql/auto.cnf 文件,并进行重启,这样mysql会重新生成server_uuid
取消主从
在salve上,进入MySQL执行stop slave
停止服务,然后通过执行reset slave all
清空先前的配置信息,最后运行show slave status
发现所有字段均为空了。
在master上,执行reset master
对于my.cnf配置文件,可不做修改
读写分离
读写分离即读和写操作在不同数据库上完成。通过将read和write分开,可以有效减低获取锁冲突的几率。
但是Dao层不会关心数据库操作具体会由哪个库执行,此外,如上面配置的主数据库发生故障时,也需要我们手动切换到从数据库,因此,我们需要一个中间层(MySQL Proxy)来完成具体数据库的分派和自动切换。
而mycat就是这个MySQL Proxy。
配置mycat
进入mycat安装目录./mycat/conf
,会有schema.xml和server.xml。
在server.xml 加入
<!--对业务端暴露的逻辑数据库,实际并不存在,在schema.xml中配置-->
<user name="root">
<property name="password"></property>
<!--数据库名-->
<property name="schemas">mycat</property>
</user>
修改schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--配置逻辑数据库-->
<schema name="mycat" checkSQLschema="false" sqlMaxLimit="100">
<!--此处name为实际要对应的表名, 并配置上数据源-->
<table name="test1" dataNode="dn1" />
</schema>
<!--可以理解为数据源-->
<!--此处database实际数据库名-->
<dataNode name="dn1" dataHost="master" database="test" />
<!--每个dataHost可以看做一套主从架构,在外看来只是数据源-->
<dataHost name="master" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!--心跳机制中执行的语句-->
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<!--配置数据库实例信息-->
<writeHost host="hostM1" url="192.168.126.151:3306" user="root" password="dj123456">
<readHost host="hostM2" url="192.168.126.152:3306" user="root" password="dj123456"/>
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
</mycat:schema>
其中shema配置文件有些概念需要理清,可参考下图
测试
启动mycat服务
mycat start
mycat status
如果启动不成功,可以在./mycat/logs/wrapper.log
中查看启动日志
连接上接mycat插入数据
主库已出现数据
而从库配置为readhost,不会出现数据