mysql.5.7.22.解压安装.tar.gz
mycat:192.168.1.13 --主机名:mycat ##:注意一定要2核6G以上内存的机器,不然会报错mycat
mysql主库:192.168.1.14 --主机名:mysql-master1
mysql从库:192.168.1.15 --主机名:mysql-slave1
注意关闭selinux
做好mysql主从配置,并建好需要读写分离的数据库和表
Mysql主从复制:
http://www.wyasw.com/webdoc/view/Pub00000000623d73fd01638ad2d472007d.html
mycat的官网网址 http://www.mycat.org.cn/
我使用的是mycat1.6的linux安装包
下载地址
https://github.com/MyCATApache/Mycat-download-new
http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
下载mycat的安装包到 目录下
[root@mycat ~]# wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
[root@mycat ~]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
[root@mycat ~]# ls -d /usr/local/mycat/
/usr/local/mycat/
[root@mycat ~]# ls /usr/local/mycat
bin catlet conf lib logs version.txt
下载:jdk-8u131-linux-x64.tar.gz
[root@mycat ~]# tar -xvf /tmp/jdk-8u131-linux-x64.tar.gz -C /home/deploy/
[root@mycat ~]# ln -s /home/deploy/jdk1.8.0_131/ /home/deploy/java
[root@mycat ~]# tail -3 /etc/profile
[root@mycat ~]# source /etc/profile
##java
export JAVA_HOME=/home/deploy/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
mycat需要两个用户用来执行用户通过mycat执行的操作,当程序需要对表进行查询操作时,mycat将会使用mycat_r进行执行查询,用mycat_w进行写操作,本文写操作使用的root用户
GRANT CREATE,DELETE,INSERT,SELECT,UPDATE,DROP ON *.* TO 'mycat_w'@'%' IDENTIFIED BY 'mycat_w';
GRANT SELECT ON *.* TO 'mycat_r'@'%' IDENTIFIED BY 'mycat_r';
FLUSH PRIVILEGES;
接下来修改mycat的配置文件
[root@mycat ~]# cd /usr/local/mycat/conf/
[root@mycat conf]# ls
autopartition-long.txt rule.xml
auto-sharding-long.txt schema.xml
auto-sharding-rang-mod.txt sequence_conf.properties
cacheservice.properties sequence_db_conf.properties
ehcache.xml sequence_distributed_conf.properties
index_to_charset.properties sequence_time_conf.properties
log4j2.xml server.xml
migrateTables.properties sharding-by-enum.txt
myid.properties wrapper.conf
partition-hash-int.txt zkconf
partition-range-mod.txt zkdownload
配置文件非常多,配置项也远比amoeba复杂.如果只是简单配置在不同的服务器上进行读写分离只需要配置两个0文件 server .xml 和 schema.xml
此文件其实跟读写分离策略关系不大,但是需要用此文件来配置连接MyCat的用户及权限等,因此在这里简单说明
[root@mycat ~]# vim /usr/local/mycat/conf/server.xml
找到这一段
</system>
<user name="root">
<property name="password">123456</property>
<property name="schemas">dong</property>
</user>
<user name="user">
<property name="password">read123456</property>
<property name="schemas">dong </property>
<property name="readOnly">true</property>
</user>
这里配置了两个可以来连接的用户
用户1 root 密码test 给予了此用户dong数据库的权限
用户2 user 密码user 给予了此用户dong数据库的只读权限
注意这里的dong不一定是你数据库上的真实库名.可以任意指定.只要和接下来的schema.xml的配置文件中的库名统一即可
系统默认 TESTDB大写 改成小写即可dong
MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的!~(当然分库分表策略、分片节点也在此文件中,暂且不谈)
【请注意修改自己的MySQL连接信息】
备份源schema.xml文件
[root@mycat ~]# cp /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak
配置
[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="dong" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="dong" />
<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.14:53306" user="root" password="mycat_w">
<readHost host="hostS2" url="192.168.1.15:53306" user="mycat_r" password="mycat_r " />
</writeHost>
</dataHost>
</mycat:schema>
<user name="root">
<property name="password">123456</property>
<property name="schemas">dong,dong2</property>
</user>
<user name="user">
<property name="password">read123456</property>
<property name="schemas">dong,dong2</property>
<property name="readOnly">true</property>
</user>
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="dong" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<schema name="dong2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="dong" />
<dataNode name="dn2" dataHost="localhost1" database="dong2" />
<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.14:53306" user="root" password="mycat_w">
<readHost host="hostS2" url="192.168.1.15:53306" user="mycat_r" password="mycat_r" />
</writeHost>
</dataHost>
</mycat:schema>
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
这里TESTDB 就是我们对外声称的我们有数据库的名称 必须和server.xml中的用户指定的数据库名称一致 添加一个dataNode="dn1" 是指定了我们这个库只在dn1上.没有进行分库
<dataNode name="dn1" dataHost="localhost1" database="db1" />
这里只需要改database的名字 db1 就是你真实数据库服务上的数据库名 . 根据你自己的数据库名进行修改.
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"
这里只需要配置三个地方 balance="1"与writeType="0" ,switchType=”1”
a. balance 属性负载均衡类型,目前的取值有 4 种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
2. balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 ,M2->S2,并 且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡。
3. balance="2",所有读操作都随机的在 writeHost、 readhost 上分发。
4. balance="3", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后 版本有, 1.3 没有。
b. writeType 属性
负载均衡类型,目前的取值有 3 种:
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个
writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
2. writeType="1",所有写操作都随机的发送到配置的 writeHost。1.5后废弃,不推荐
c. switchType 属性
- -1 表示不自动切换
- 1 默认值,自动切换
- 2 基于MySQL 主从同步的状态决定是否切换
slaveThreshold="100"
开始支持 MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:
MyCAT心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性: switchType="2" 与
slaveThreshold="100",此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,Mycat心跳机
制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running",
"Slave_SQL_Running" 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master 主从复制时延,
当Seconds_Behind_Master>slaveThreshold 时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之
前的旧数据,而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则
表示主从同步,可以安全切换,否则不会切换。
<heartbeat>select user()</heartbeat>
心跳检查语句
用户密码配置
<writeHost host="hostM1" url="192.168.1.14:53306" user="root" password=" Mycat_123 " />
<readHost host="hostS1" url="192.168.1.15:53306" user="readuser" password="Mycat_123" />
</writeHost>
这里是配置的我们的两台读写服务器IP地址访问端口和 访问用户的用户名和密码
/usr/local/mycat/bin/mycat start
#日志路径
/usr/locat/mycat/logs/mycat.log
<readHost host="hostS2" url="192.168.1.15:53306" user="mycat_r" password="mycat_r" />
则给以上配置文件加一行
<readHost host="hostS3" url="192.168.1.16:53306" user="mycat_r" password="mycat_r" />
测试步骤:
1、用mycat root 8066用户登录,查看数据库 是不是dong逻辑库
2、用mycat root 8066用户登录,新建表,查看主库和从库是否有新建的表
3、停掉主从复制,给从库新建表,用mycat root 8066用户登录,查看数据库是否有刚新建的表及数据,有则证明主从读写分离成功,是从从库查询的,注意:之后删除新建表,再开启主从同步