一、环境
操作系统:CentOS-6.7-x86_64-bin-DVD1.iso
JDK 版本:jdk1.8.0_45
MyCat 版本:Mycat-server-1.6
MyCat 节点 IP:10.1.10.15 主机名:ebus-mycat-01 主机配置:4 核 CPU、4G 内存
MySQL版本:mysql5.6.26.tar.gz
主节点 IP:10.1.10.99 主机名:ebus-mysql-01 主机配置:4 核 CPU、4G 内存
从节点 IP:10.1.10.98 主机名:ebus-mysql-02 主机配置:4 核 CPU、4G 内存
二、MyCat 介绍
MyCat 的读写分离是基于后端 MySQL 集群的主从同步来实现的,而 MyCat 提供语句的分发功能。MyCat1.4 开始支持 MySQL 主从复制状态绑定的读写分离机制,让读更加安全可靠。
三、MyCat 的安装
1、设置 MyCat 的主机名和 IP 与主机名的映射
# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=ebus-mycat-01
#NTPSERVERARGS=iburst
# vi /etc/hosts
127.0.0.1 ebus-mycat-01
127.0.0.1 ebus-mysql-02
10.1.10.15 ebus-mycat-01
10.1.10.99 ebus-mysql-01
10.1.10.98 ebus-mysql-03
10.1.10.97 ebus-mysql-04
2、因为 MyCat 是用 Java 开发的,因此 MyCat 运行需要安装 JDK(准确来说是 JRE 就够了), 并且需要 JDK1.7 或以上版本。
# vi /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_144
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# source /etc/profile(让环境配置生效)
java -version
java version "1.8.0_144"
Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
3、创建 mycat 用户并设置密码
# useradd mycat
# passwd mycat(liuhao)
4、上传安装包 Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 到 MyCat 服务器中的
/home/mycat 目录,并解压并移动到 /usr/local/mycat 目录
$ tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
$ su root
Password:
# mv /home/mycat/mycat /usr/local/
# cd /usr/local/mycat/
# ll
5、设置 MyCat 的环境变量
vi /etc/profile
## mycat env
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin
# source /etc/profile(让环境配置生效)
四、配置 MyCat
1、在配置 MyCat 前,请确认 MySQL 的主从复制安装配置已完成并正常运行。MySQL 主从数据的同步在 MySQL 中配置,MyCat 不负责数据同步的问题。
补充:
(1) MySQL 主从复制配置中,如果涉及到函数或存储过程的同步复制,需要在/etc/my.cnf 中的[mysqld]段中增加配置 log_bin_trust_function_creators=true 或在客户端中设置 set globallog_bin_trust_function_creators = 1;
(2) 如果要做读写分离下的主从切换,那么从节点也有可能会变为写节点,因此从节点就不能设置为只读 read_only=1 。
(3) Linux 版本的 MySQL,需要设置为 MySQL 大小写不敏感,否则可能会发生找不到表的问题。可在/etc/my.cnf 的[mysqld]段中增加 lower_case_table_names=1 。
2、配置 MyCat 的 schema.xml
schema.xml 是 MyCat 最重要的配置文件之一,用于设置 MyCat 的逻辑库、表、数据节点、dataHost 等内容,
[mycat@ebus-mycat-01 conf]$ cd /usr/local/mycat/conf/
[mycat@ebus-mycat-01 conf]$ vi schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="pcx_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="pcxNode"></schema>
<!-- 定义MyCat的数据节点,database为所关注数据库名称 -->
<dataNode name="pcxNode" dataHost="dtHost" database="lh_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="2" slaveThreshold="100">
<!--心跳检测 -->
<heartbeat>show slave status</heartbeat>
<!--配置后台数据库的IP地址和端口号,还有账号密码,用户名/密码为远程配置用户 -->
<writeHost host="hostMaster" url="10.1.10.99:3306" user="root" password="www.liuhao.com" />
<writeHost host="hostSlave" url="10.1.10.98:3306" user="root" password="www.liuhao.com" />
</dataHost>
</mycat:schema>
注:
1、
2、
3、配置 server.xml
server.xml 主要用于设置系统变量、管理用户、设置用户权限等。
[wusc@ebus-mycat-01 conf]$ vi server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<!-- 这里配置的都是一些系统属性,可以自己查看mycat文档 -->
<property name="defaultSqlParser">druidparser</property>
<property name="charset">utf8mb4</property>
</system>
<!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群 -->
<user name="user1">
<property name="password">root</property>
<property name="schemas">pcx_schema</property>
</user>
<!-- 用户2,只读权限-->
<user name="user2">
<property name="password">root</property>
<property name="schemas">pcx_schema</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
注:
1、user1和user2均是mycat虚拟连接用户
2、用户user2仅具有读权限
3、用户user1才具体读和写权限
4、防火墙中打开 8066 和 9066 端口
MyCat 的默认数据端口为 8066,mycat 通过这个端口接收数据库客户端的访问请求。 管理端口为 9066,用来接收 mycat 监控命令、查询 mycat 运行状况、重新加载配置文件等。
[root@ebus-mycat-01 mycat]# vi /etc/sysconfig/iptables
增加:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 9066 -j ACCEPT
重启防火墙:
[root@ebus-mycat-01 mycat]# service iptables restart
5、修改 log 日志级别为 debug,以便通过日志确认基于 MyCat 的 MySQL 数据库集群读写分离的数据操作状态(可以在正式上生产前改成 info 级别)
[mycat@ebus-mycat-01 conf]$ vi /usr/local/mycat/conf/log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d [%-5p][%t] %m %throwable{full} (%C:%F:%L) %n"/>
</Console>
<RollingFile name="RollingFile" fileName="${sys:MYCAT_HOME}/logs/mycat.log"
filePattern="${sys:MYCAT_HOME}/logs/$${date:yyyy-MM}/mycat-%d{MM-dd}-%i.log.gz">
<PatternLayout>
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="250 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<!--<AsyncLogger name="io.mycat" level="info" includeLocation="true" additivity="false">-->
<!--<AppenderRef ref="Console"/>-->
<!--<AppenderRef ref="RollingFile"/>-->
<!--</AsyncLogger>-->
<asyncRoot level="debug" includeLocation="true">
<AppenderRef ref="Console" />
<AppenderRef ref="RollingFile"/>
</asyncRoot>
</Loggers>
</Configuration>
6、启动 MyCat
[mycat@ebus-mycat-01 bin]$ cd /usr/local/mycat/bin/
(1) 控制台启动,这种启动方式在控制台关闭后,MyCat 服务也将关闭,适合调试使用:
[mycat@ebus-mycat-01 bin]$ ./mycat console
(2) 可以采用以下后台启动的方式:
[mycat@ebus-mycat-01 bin]$ ./mycat start
Starting Mycat-server...
(对应的,重启: mycat restart, 关闭: mycat stop)
7、MyCat 连接测试
(1) 如果本地 Windows 安装有 MySQL,可以使用已有的 mysql 客户端远程操作 MyCat
(2) 如果为了方便,需要在 MyCat 主机上对 MyCat 进行操作(把 MyCat 当是本地 MySQL 来操作),可以在 MyCat 节点主机上安装 MySQL 客户端:
[mycat@ebus-mycat-01 bin]$ su root
[root@ebus-mycat-01 bin]# yum install mysql
使用安装好的 mysql 客户端登录 MyCat
[mycat@ebus-mycat-01 bin]$ mysql -uuser2 -proot -h10.1.10.15 -P8066(仅具有查询数据库权限)
[mycat@ebus-mycat-01 bin]$ mysql -uuser1 -proot -h10.1.10.15 -P8066(具有数据库写权限)
[root@ebus-mycat-01 mycat]# vi /etc/my.cnf
增加:
[client] default-character-set=utf8
保存后再查询,乱码问题解决,如下:
(3) 使用第三方 MySQL 管理客户端连接 MyCat 测试(navicat 支持,MySQL-Front 兼容性不太 好),以 navicat 为例:
8、读写分离测试
(1) 监听 MyCat 日志
[mycat@ebus-mycat-01 ~]$ cd /usr/local/mycat/logs/
[mycat@ebus-mycat-01 logs]$ tail -f mycat.log
五、读写分离测试
1、监听 MyCat 日志
[mycat@ebus-mycat-01 ~]$ cd /usr/local/mycat/logs/
[mycat@ebus-mycat-01 logs]$ tail -f mycat.log
2、先测试一下读操作
我们连接到mycat发送一句select *命令试试
测试结果:
可以看到select 操作被路由到了10.1.10.98也就是我们的slave节点,执行多次select *看看依然是同样的结果,即还是被路由到了读节点。
3、再测试一下写操作
结果:
可见插入被路由到了master节点
4、然后看一下Mycat服务器数据库情况
5、最后我们看看master的数据是否被同步到slave
记录成功的同步过来了,可见读写分离搭建成功。
六、关键点
1、Mycat是在Mysql主从复制基础上所做的工作,因此必须确保主从复制没有问题;
2、Mycat相当于一个对外暴露的服务,其连接Mysql内部的一些细节被隐藏,Mycat读取/写入哪个真正数据库由Mycat"路由规则"决定;
3、Mycat的schema.xml配置文件中的数据库名称配置以及所连接的真正数据库的用户名/密码是对于远程用户名/密码而言的。