一、环境
1操作系统:CentOS-6.7-x86_64-bin-DVD1.iso 2JDK 版本:jdk1.8.0_45 3MyCat 版本:Mycat-server-1.6 4MyCat 节点 IP:10.1.10.15 主机名:ebus-mycat-01 主机配置:4 核 CPU、4G 内存 5MySQL版本:mysql5.6.26.tar.gz 6主节点 IP:10.1.10.99 主机名:ebus-mysql-01 主机配置:4 核 CPU、4G 内存 7从节点 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
1NETWORKING=yes 2HOSTNAME=ebus-mycat-01 3#NTPSERVERARGS=iburst
# vi /etc/hosts
1127.0.0.1 ebus-mycat-01 2127.0.0.1 ebus-mysql-02 310.1.10.15 ebus-mycat-01 410.1.10.99 ebus-mysql-01 510.1.10.98 ebus-mysql-03 610.1.10.97 ebus-mysql-04
2、因为 MyCat 是用 Java 开发的,因此 MyCat 运行需要安装 JDK(准确来说是 JRE 就够了), 并且需要 JDK1.7 或以上版本。
# vi /etc/profile
1export JAVA_HOME=/usr/local/java/jdk1.8.0_144 2export JRE_HOME=$JAVA_HOME/jre 3export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH 4export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# source /etc/profile(让环境配置生效)
java -version
1java version "1.8.0_144" 2Java(TM) SE Runtime Environment (build 1.8.0_144-b01) 3Java 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
1$ su root 2Password:
# mv /home/mycat/mycat /usr/local/
# cd /usr/local/mycat/
# ll
5、设置 MyCat 的环境变量
vi /etc/profile
1## mycat env 2export MYCAT_HOME=/usr/local/mycat 3export 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
1<?xml version="1.0"?> 2<!DOCTYPE mycat:schema SYSTEM "schema.dtd"> 3<mycat:schema xmlns:mycat="http://io.mycat/"> 4 <schema name="pcx_schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="pcxNode"></schema> 5 6 <!-- 定义MyCat的数据节点,database为所关注数据库名称 --> 7 <dataNode name="pcxNode" dataHost="dtHost" database="lh_test" /> 8 9 10 <!-- 定义数据主机dtHost,连接到MySQL读写分离集群 ,schema中的每一个dataHost中的host属性值必须唯一--> 11 <!-- dataHost实际上配置就是后台的数据库集群,一个datahost代表一个数据库集群 --> 12 <!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡--> 13 <!-- writeType="0",所有写操作发送到配置的第一个writeHost,这里就是我们的hostmaster,第一个挂了切到还生存的第二个writeHost--> 14 <dataHost name="dtHost" maxCon="500" minCon="20" balance="1" 15 writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100"> 16 <!--心跳检测 --> 17 <heartbeat>show slave status</heartbeat> 18 19 <!--配置后台数据库的IP地址和端口号,还有账号密码,用户名/密码为远程配置用户 --> 20 <writeHost host="hostMaster" url="10.1.10.99:3306" user="root" password="www.liuhao.com" /> 21 <writeHost host="hostSlave" url="10.1.10.98:3306" user="root" password="www.liuhao.com" /> 22 </dataHost> 23 24</mycat:schema>
注:
1、<dataNode name="pcxNode" dataHost="dtHost" database="lh\_test" />的database指的是所要进行读写分离的数据库名称
2、****<writeHost>节点(包含主节点和从节点)连接mysql的用户名和密码均是设置的远程连接的用户名/密码
3、配置 server.xml
server.xml 主要用于设置系统变量、管理用户、设置用户权限等。
[wusc@ebus-mycat-01 conf]$ vi server.xml
1<?xml version="1.0" encoding="UTF-8"?> 2<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 3 - you may not use this file except in compliance with the License. - You 4 may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 5 - - Unless required by applicable law or agreed to in writing, software - 6 distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 7 WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 8 License for the specific language governing permissions and - limitations 9 under the License. --> 10<!DOCTYPE mycat:server SYSTEM "server.dtd"> 11<mycat:server xmlns:mycat="http://io.mycat/"> 12 <system> 13 <!-- 这里配置的都是一些系统属性,可以自己查看mycat文档 --> 14 <property name="defaultSqlParser">druidparser</property> 15 <property name="charset">utf8mb4</property> 16 </system> 17 18 19 20 <!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群 --> 21 <user name="user1"> 22 <property name="password">root</property> 23 <property name="schemas">pcx_schema</property> 24 </user> 25 26 <!-- 用户2,只读权限--> 27 <user name="user2"> 28 <property name="password">root</property> 29 <property name="schemas">pcx_schema</property> 30 <property name="readOnly">true</property> 31 </user> 32</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
增加:
1-A INPUT -m state --state NEW -m tcp -p tcp --dport 8066 -j ACCEPT 2-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
1<?xml version="1.0" encoding="UTF-8"?> 2<Configuration status="WARN"> 3 <Appenders> 4 <Console name="Console" target="SYSTEM_OUT"> 5 <PatternLayout pattern="%d [%-5p][%t] %m %throwable{full} (%C:%F:%L) %n"/> 6 </Console> 7 8 <RollingFile name="RollingFile" fileName="${sys:MYCAT_HOME}/logs/mycat.log" 9 filePattern="${sys:MYCAT_HOME}/logs/$${date:yyyy-MM}/mycat-%d{MM-dd}-%i.log.gz"> 10 <PatternLayout> 11 <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n</Pattern> 12 </PatternLayout> 13 <Policies> 14 <OnStartupTriggeringPolicy/> 15 <SizeBasedTriggeringPolicy size="250 MB"/> 16 <TimeBasedTriggeringPolicy/> 17 </Policies> 18 </RollingFile> 19 </Appenders> 20 <Loggers> 21 <!--<AsyncLogger name="io.mycat" level="info" includeLocation="true" additivity="false">--> 22 <!--<AppenderRef ref="Console"/>--> 23 <!--<AppenderRef ref="RollingFile"/>--> 24 <!--</AsyncLogger>--> 25 <asyncRoot level="debug" includeLocation="true"> 26 27 <AppenderRef ref="Console" /> 28 <AppenderRef ref="RollingFile"/> 29 30 </asyncRoot> 31 </Loggers> 32</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配置文件中的数据库名称配置以及所连接的真正数据库的用户名/密码是对于远程用户名/密码而言的。
