Mycat高可用解决方案三(读写分离)

时间:2024-01-19 22:27:14

Mycat高可用解决方案三(读写分离)

一、系统部署规划

名称

IP

主机名称

配置

Mycat主机01

192.168.199.112

mycat01

2核/2G

Mysql主节点

192.168.199.110

mysql01

2核/2G

Mysql从节点

192.168.199.111

mysql02

2核/2G

二、软件版本:

进入下载列表地址:http://dl.mycat.io

MySQL 版本:mysql-5.7.
下载地址: https://downloads.mysql.com/archives/get/file/mysql-5.7.9-linux-glibc2.5-x86_64.tar.gz
JDK版本:jdk1.
下载地址:http://dl.mycat.io/jdk-7u79-linux-x64.tar.gz
备用jdk1.8
下载地址:http://dl.mycat.io/jdk-8u20-linux-x64.tar.gz
mycat版本:1.6.
下载地址:http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
https://github.com/MyCATApache/Mycat-Server/archive/1.6.5-RELEASE.zip
HAProxy版本:haproxy-1.8.15.tar.gz
下载地址:https://src.fedoraproject.org/repo/pkgs/haproxy/haproxy-1.8.15.tar.gz
其他版本列表页:https://src.fedoraproject.org/repo/pkgs/haproxy/
或者
yum install haproxy -y
keepalived版本:
下载地址:http://www.keepalived.org/software/keepalived-2.0.11.tar.gz
其他版本下载列表页:http://www.keepalived.org/download.html
或者
yum install keepalived -y

三、mycat 读写分离-架构图

MyCat 介绍 ( MyCat 官网:http://www.mycat.io/

MyCat 的读写分离是基于后端 MySQL 集群的主从同步来实现的,而 MyCat 只是 提供语句的分发功能。

MyCat1.4 开始支持 MySQL 主从复制状态绑定的读写分离机制,让读更加安全可靠。

Mycat高可用解决方案三(读写分离)

四、MyCat 的安装

mycat主机配置:192.168.199.112

1、配置网络
# vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=static
#HWADDR=00:50:56:a1:12:53
IPADDR=192.168.199.112
GATEWAY=192.168.199.2
NETMASK=255.255.255.0
DNS1=8.8.8.8
DNS2=192.168.199.2

2、设置 MyCat 的主机名和 IP 与主机名的映射
# vi /etc/sysconfig/network

NETWORKING=yes
HOSTNAME=mycat-

# vi /etc/hosts

127.0.0.1 localhost
127.0.0.1 mycat-
192.168.199.112 mycat-
192.168.199.110 mysql-
192.168.199.111 mysql-

3、因为 MyCat 是用 Java 开发的,因此 MyCat 运行需要安装 JDK(准确来说是 JRE 就够了),并且需要 JDK1.7 或以上版本

卸载自带的openjdk版本:

[root@mycat- jdk1..0_79]# rpm -qa |grep java
tzdata-java-2018g-.el6.noarch
java-1.7.-openjdk-1.7.0.201-2.6.16.0.el6_10.x86_64
[root@mycat- jdk1..0_79]# rpm -e --nodeps tzdata-java-2018g-.el6.noarch
[root@mycat- jdk1..0_79]# rpm -e --nodeps java-1.7.-openjdk-1.7.0.201-2.6.16.0.el6_10.x86_64
[root@mycat- jdk1..0_79]#

安装jdk1.7

mkdir -p /java
wget http://dl.mycat.io/jdk-7u79-linux-x64.tar.gz
mkdir -p /usr/local/java/
tar -zxvf jdk-7u79-linux-x64.tar.gz -C /usr/local/java/

配置JDK环境变量:

# vi /etc/profile

## java env
export JAVA_HOME=/usr/local/java/jdk1.7.0_79
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

# source /etc/profile
# java -version
4、创建 mycat 用户并设置密码(密码:mycat)
# useradd mycat

# passwd mycat

# cd /usr/local/

# chown mycat:mycat -R mycat/

其他相关命令:

、创建用户:
在创建用户时,需要为新建用户指定一用户组,如果不指定其用户所属的工作组,自动会生成一个与用户名同名的工作组。 创建用户 mycat 的时候指定其所属工作组mycats,例:useradd –g mycats mycat 、使用 passwd 命令为新建用户设置密码(密码:mycat)
例:passwd mycat
注意:没有设置密码的用户不能使用。 、命令 usermod 修改用户账户
例:将用户 mycat 的登录名改为 my1,
usermod –l my1 mycat 例:将用户 mycat 加入到 users组中,
usermod –g mycats mycat 例:将用户 mycat 目录改为/mycats/my1
usermod –d /mycats/my1 mycat
、使用命令 userdel 删除用户账户 例:删除用户mycat
userdel mycat 例:删除用户 mycat2,同时删除他的工作目录
userdel –r mycat2
自己总结的另外一种方式:
 1、执行命令找到用户目录并删除:
 find / -name mycat
 rm -rf /home/mycat 和可怀疑的文件目录
 
 2、执行命令删除用户:
 cat /etc/passwd
 vi /etc/passwd
 连击dd删除mycat用户
 
 3、执行命令删除用户组:
 cat /etc/group
 vi /etc/group
 连击dd删除mycat用户 1、与用户(user)和用户组(group)相关的配置文件; 1)与用户(user)相关的配置文件;
/etc/passwd 注:用户(user)的配置文件;
/etc/shadow 注:用户(user)影子口令文件; 2)与用户组(group)相关的配置文件;
/etc/group 注:用户组(group)配置文件;
/etc/gshadow 注:用户组(group)的影子文件; 2、管理用户(user)和用户组(group)的相关工具或命令; 1)管理用户(user)的工具或命令;
 
useradd 注:添加用户
adduser 注:添加用户
passwd 注:为用户设置密码
usermod 注:修改用户命令,可以通过usermod 来修改登录名、用户的家目录等等;
pwcov 注:同步用户从/etc/passwd 到/etc/shadow
pwck 注:pwck是校验用户配置文件/etc/passwd 和/etc/shadow 文件内容是否合法或完整;
pwunconv 注:是pwcov 的立逆向操作,是从/etc/shadow和 /etc/passwd 创建/etc/passwd ,然后会删除 /etc/shadow 文件;
finger 注:查看用户信息工具 id 注:查看用户的UID、GID及所归属的用户组 chfn 注:更改用户信息工具
su 注:用户切换工具 sudo 注:sudo 是通过另一个用户来执行命令(execute a command as another user),su 是用来切换用户,然后通过切换到的用户来完成相应的任务,
但sudo 能后面直接执行命令,比如sudo 不需要root 密码就可以执行root 赋与的执行只有root才能执行相应的命令;但得通过visudo 来编辑/etc/sudoers来实现;
visudo 注:visodo 是编辑 /etc/sudoers 的命令;也可以不用这个命令,直接用vi 来编辑 /etc/sudoers 的效果是一样的;
sudoedit 注:和sudo 功能差不多; 2、管理用户组(group)的工具或命令;
groupadd 注:添加用户组;
groupdel 注:删除用户组;
groupmod 注:修改用户组信息
groups 注:显示用户所属的用户组
grpck grpconv 注:通过/etc/group和/etc/gshadow 的文件内容来同步或创建/etc/gshadow ,如果/etc/gshadow 不存在则创建;
grpunconv 注:通过/etc/group 和/etc/gshadow 文件内容来同步或创建/etc/group,然后删除gshadow文件;

5、上传安装包 Mycat-server-1.6.5-release-20180122220033-linux.tar.gz 到 MyCat 服务器中的/home/mycat 目录,

并解压并移动到 /usr/local/mycat 目录

或者

直接下载安装包:

wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
tar -zxvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local/
cd /usr/local/mycat/

Mycat高可用解决方案三(读写分离)

设置 MyCat 的环境变量
# vi /etc/profile

## mycat env
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin
# source /etc/profile

Mycat高可用解决方案三(读写分离)

五、配置MyCat

简单的读写分离(schema.xml和server.xml),只有在特殊规则需要配置rule.xml

1、在配置 MyCat 前,请确认 MySQL 的主从复制安装配置已完成并正常运行。MySQL 主从数据的同步在MySQL 中配置,MyCat 不负责数据同步的问题。

补充:

(1) MySQL 主从复制配置中,如果涉及到函数或存储过程的同步复制,需要在/etc/my.cnf 中的[mysqld]段中增加配置 log_bin_trust_function_creators=true ,

或在客户端中设置 set global log_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@mycat-01 ~]# cd /usr/local/mycat/conf/

[root@mycat-01 conf]#vi schema.xml

参数说明:编写习惯:从下往上,dataHost > dataNode > schema(table)

本次配置:(dtd新老版本不一样,这里要注意)

老版本: 新版本:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 3、定义MyCat的逻辑库,逻辑库的概念与MySQL中的 database 概念相同 -->
<!-- 方式一:非读写分离 schema -->
<!-- <schema name="wr-off-schema01" checkSQLschema="false" sqlMaxLimit="100" dataNode="wr-off-dn01"></schema> -->
<!-- <schema name="wr-off-schema02" checkSQLschema="false" sqlMaxLimit="100" dataNode="wr-off-dn02"></schema> -->

<!-- 方式二:读写分离 schema -->
<schema name="wr-on-schema01" checkSQLschema="false" sqlMaxLimit="" dataNode="wr-on-dn01"></schema>
<schema name="wr-on-schema02" checkSQLschema="false" sqlMaxLimit="" dataNode="wr-on-dn02"></schema> <!-- 2、定义MyCat的数据节点 -->
<!-- 方式一:非读写分离 dataNode -->
<!-- <dataNode name="wr-off-dn01" dataHost="dtHost01" database="test01" /> -->
<!-- <dataNode name="wr-off-dn02" dataHost="dtHost01" database="test02" /> -->

<!-- 方式二:读写分离 dataNode -->
<dataNode name="wr-on-dn01" dataHost="dtHost02" database="test01" />
<dataNode name="wr-on-dn02" dataHost="dtHost02" database="test02" /> <!-- 注意:schema中的每一个dataHost中的host属性值必须唯一,否则会出现主从在所有dataHost中全部切换的现象。-->

<!-- 1、定义数据的物理主机 -->
<!-- 方式一:非读写分离 dataHost -->
<!-- 定义数据主机dtHost01,只连接到MySQL读写分离集群中的Master节点,不使用MyCat托管MySQL主从切换 -->
<!--
<dataHost name="dtHost01" maxCon="500" minCon="20" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.199.110:3306" user="root" password="123456" />
</dataHost>
--> <!-- 方式二:使用MyCat托管MySQL主从切换 -->
<!-- 定义数据主机dtHost02,连接到MySQL读写分离集群,并配置了读写分离和主从切换 -->
<dataHost name="dtHost02" maxCon="" minCon="" balance="" writeType=""
dbType="mysql" dbDriver="native" switchType="" slaveThreshold="">
<!-- 通过show slave status检测主从状态,
当主宕机以后,发生切换,从变为主,原来的主变为从,这时候show slave status就会发生错误,因为原来的主没有开启slave,
不建议直接使用switch操作,而是在DB中做主从对调。
-->
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM2" url="192.168.199.110:3306" user="root" password="" />
<readHost host="hostS2" url="192.168.199.111:3306" user="root" password="123456" />
</writeHost>
<writeHost host="hostS2" url="192.168.199.111:3306" user="root" password="" />
</dataHost>
<!-- 参数balance决定了哪些MySQL服务器参与到读SQL的负载均衡中 -->
<!-- balance="0",为不开启读写分离,所有读操作都发送到当前可用的writeHost上-->
<!-- balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡-->
<!-- balance="2",所有读操作都随机的在writeHost、readHost上分发-->
<!-- MyCat1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,
则需要在MyCat里配置为两个writeHost并设置balance="1" -->
<!-- writeType="0",所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost-->
<!-- writeType="1",仅仅对于galera for mysql集群这种多主多节点都能写入的集群起效,此时Mycat会随机选择一个writeHost并写入数据,
对于非galera for mysql集群,请不要配置writeType=1,会导致数据库不一致的严重问题 --> </mycat:schema>

MyCat1.4 开始支持 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 时则表示主从同步,可以安全切换,否则不会切换。

3、配置 server.xml

server.xml 主要用于设置系统变量、管理用户、设置用户权限等。
[root@mycat-01 conf]# vi server.xml

Mycat高可用解决方案三(读写分离)

老版本: 新版本:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="defaultSqlParser">druidparser</property>
<property name="charset">utf8mb4</property>
<!-- <property name="useCompression">1</property>-->
<!--1为开启mysql压缩协议-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--
<property name="processors">1</property>
<property name="processorExecutor">32</property>
-->
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--<property name="sequnceHandlerType">0</property>-->
<!--<property name="backSocketNoDelay">1</property>-->
<!--<property name="frontSocketNoDelay">1</property>-->
<!--<property name="processorExecutor">16</property>-->
<!--<property name="mutiNodeLimitType">1</property> --> <!-- 0:开启小数量级(默认);1:开启亿级数据排序-->
<!--<property name="mutiNodePatchSize">100</property> --> <!-- 亿级数量排序批量 -->
<!--
<property name="processors">32</property>
<property name="processorExecutor">32</property>
<property name="serverPort">8066</property>
<property name="managerPort">9066</property>
<property name="idleTimeout">300000</property>
<property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">4096</property>
<property name="processors">32</property> -->
</system> <!-- 用户1,对应的MyCat逻辑库连接到的数据节点对应的主机为MySQL主从复制配置中的Master节点,
没实现读写分离,读写都在该Master节点中进行 -->
<!--
<user name="mycat01">
<property name="password">123456</property>
<property name="schemas">wr-off-schema01,wr-off-schema02</property>
</user>
-->
<!-- 用户2,对应的MyCat逻辑库连接到的数据节点对应的主机为主从复制集群,并通过MyCat实现了读写分离 -->
<user name="mycat02">
<property name="password"></property>
<property name="schemas">wr-on-schema01,wr-on-schema02</property>
</user> <!-- 用户3,只读权限-->
<user name="mycat03">
<property name="password"></property>
<property name="schemas">wr-on-schema01,wr-on-schema02</property>
<property name="readOnly">true</property>
</user> </mycat:server>

mycat用户密码加密:

Mycat高可用解决方案三(读写分离)

为root用户生成加密后的密码:cd /usr/local/mycat/lib/
java -cp Mycat-server-1.6.5-release.jar io.mycat.util.DecryptUtil 0:root:12345

Mycat高可用解决方案三(读写分离)

<property name = "usingDecrypt"></property>
<property name = "password">hpYb3oDTK+R9M1d6jHkQZoymhRwEM8zq47km//26A5k8B9LpraNFbaeZFBregpgoy24TslumO8aWzieL+u84g==</property>

Mycat高可用解决方案三(读写分离)

4、防火墙中打开 8066 和 9066 端口

MyCat 的默认数据端口为 8066,mycat 通过这个端口接收数据库客户端的访问请求。
管理端口为 9066,用来接收 mycat 监控命令、查询 mycat 运行状况、重新加载配置文件等。
[root@mycat-01 mycat]# vi /etc/sysconfig/iptables
增加:

## MyCat
-A INPUT -m state --state NEW -m tcp -p tcp --dport -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport -j ACCEPT

重启防火墙:
[root@mycat-01 mycat]# service iptables restart

5、修改 log 日志级别为 debug

以便通过日志确认基于 MyCat 的 MySQL 数据库集群读写分离的数据操作状态(可以在正式上生产前改成 info 级别)
[mycat@mycat-01 conf]$ vi /usr/local/mycat/conf/log4j.xml

Mycat高可用解决方案三(读写分离)

6、启动 MyCat

[mycat@mycat-01 bin]$ cd /usr/local/mycat/bin/
(1) 控制台启动,这种启动方式在控制台关闭后,MyCat 服务也将关闭,适合调试使用:
[mycat@mycat-01 bin]$ ./mycat console
(2) 可以采用以下后台启动的方式:
[mycat@mycat-01 bin]$ ./mycat start
Starting Mycat-server...
(对应的,重启: mycat restart , 关闭: mycat stop )

检查启动日志:tail -f /usr/local/mycat/logs/wrapper.log

Mycat高可用解决方案三(读写分离)

或者 通过jps -m命令查看:

[mycat@mycat-01 bin]$ jps
Jps
WrapperSimpleApp
[mycat@mycat-01 bin]$ jps -m
WrapperSimpleApp io.mycat.MycatStartup start
Jps -m
[mycat@mycat-01 bin]$

7、MyCat 连接测试

(1)如果本地 Windows 安装有 MySQL,可以使用已有的 mysql 客户端远程操作 MyCat

mysql -umycat02 -p123456 -h 192.168.199.112 -P

Mycat高可用解决方案三(读写分离)

1:如何查看MySQL相关的编码格式默认值

在cmd中,输入指令"mysql –u root –p”以root身份连接mysql数据库

Mycat高可用解决方案三(读写分离)

然后有两种方式查看编码格式:

1)show variables like ‘character%’;

Mycat高可用解决方案三(读写分离)

2)show variables like ‘collation%’;

Mycat高可用解决方案三(读写分离)

2:既然可以用命令查看,当然也可以用命令修改了

稍微解释一下:

character_set_client:客户端编码方式;

character_set_connection:建立连接时使用的编码;

character_set_database:数据库的编码;

character_set_result:结果集的编码;

character_set_server:数据库服务器的编码;

I:执行命令:set NAMES ‘utf8’;

该命令等同于执行如下三条命令:

SET character_set_client = utf8; 
        SET character_set_results = utf8; 
        SET character_set_connection = utf8;

但是,该设置的编码格式,只对当前连接(窗口)有效,即用另外一个Dos窗口再连接mysql数据库进行查看,编码格式是没有改变的。

II:数据库、表、字段,均可以在创建时设置其默认编码格式,或者在其后进行修改

1)create database dbname character set utf8;

alter database dbname character set utf8;

2)create table tname(…) default charset=utf8;

alter table type character set utf8;

3)create table tname(flag_deleted enum('Y','N') character set utf8 not null default 'N')

alter table type modify type_name varchar(50) character set utf8;

3:比较好的,也是建议的,却是最后压轴的磨磨唧唧登场的方法,如下... ...

修改MySQL的配置文件my.ini。

在Window系统下,MySQL的配置文件是在MySQL安装目录下的my.ini文件,但是可能安装完成后,在目录下木有my.ini文件,而是如下这些文件:

Mycat高可用解决方案三(读写分离)

这时候可以去网上下载一个my.ini文件然后放到目录下即可,或者在C:\ProgramData\MySQL\MySQL Installer目录下有:

Mycat高可用解决方案三(读写分离)

选择其中一个版本的my-template-x.x.ini改名成my.ini,放到安装目录下也可以。至于细节再在my.ini中具体配置即可。

my.ini配置文件修改细节:

I:在[mysqld]标签下加

default-character-set=utf8

character_set_server=utf8

lower_case_table_names=1      //表名不区分大小写(此与编码无关)

II:在[mysql]标签下加

default-character-set=utf8

III:在[mysql.server]标签下加

default-character-set=utf8

IV:在[mysql_safe]标签下加

default-character-set=utf8

V:在[client]标签下加

default-character-set=utf8

4:在Dos窗口中执行

net stop mysqlservice    //关闭mysql服务

net stop mysqlservice    //启动mysql服务

然后在查看一下mysql默认的编码格式,是否改变成功!(最后绝招你可以重装mysql,然后在安装的那个步骤进行设置)

附注:

1:连接mysql数据库时的字符串,设计编码类型的时候如下所示

jdbc:mysql://127.0.0.1:3306/dbname?useUnicode=true&characterEncoding=utf-8

2:mysql支持哪些编码格式,查看%MySQL%\share\charsets\Index.xml即可

3:mysql的配置文件加载顺序

c:/windows/my.cnf-->c:/windows/my.ini-->c:/my.cnf-->c:/my.ini-->$installdir/my.ini(%MySQL_HOME%/my.ini)-->defaults-extra-file=path

(2)如果为了方便,需要在 MyCat 主机上对 MyCat 进行操作(把 MyCat 当是本地 MySQL 来操作),可以在 MyCat 节点主机上安装 MySQL 客户端:
[mycat@mycat-01 bin]$ su root
[root@mycat-01 bin]# yum install mysql -y
使用安装好的 mysql 客户端登录 MyCat
[mycat@mycat-01 bin]$ mysql -umycat02 -p123456 -h192.168.199.112 -P8066

(3)解决客户端查询乱码:

如果使用mycat主机上安装了mysql客户端进行查询出现乱码,则需要设置客户端的编码,

在/etc/my.cnf(windows系统 为$MYSQL_HOME/my.ini)中的[client],设置客户端的默认编码为utf8。

Mycat高可用解决方案三(读写分离)

[root@mycat-01 mycat]# vi /etc/my.cnf
增加:

[client]
default-character-set=utf8

保存后再查询,乱码问题解决,如

Mycat高可用解决方案三(读写分离)

(4) 使用第三方 MySQL 管理客户端连接 MyCat 测试(navicat 支持,MySQL-Front 兼容性不太好),以 navicat 为例:

Mycat高可用解决方案三(读写分离)

Mycat高可用解决方案三(读写分离)

8、读写分离测试

(1) 监听 MyCat 日志
[mycat@mycat-01 ~]$ cd /usr/local/mycat/logs/
[mycat@mycat-01 logs]$ tail -f mycat.log

Mycat高可用解决方案三(读写分离)

滚动监听主从节点,从节点监听两次(是因为从节点配置了主从切换和读写分离,本身是写节点,主机宕机又能作为主节点)

 (2) 读测试
[mycat@mycat-01 logs] mysql -umycat02 -p123456 -h192.168.199.112 -P8066
mysql> show databases;

mysql> use wr-on-schema01;

mysql> show tables;

mysql> select * from login_user;

Mycat高可用解决方案三(读写分离)

日志变化:

Mycat高可用解决方案三(读写分离)

多次执行select * from login_user 语句,MyCat 打印出来的日志信息显示读操作请求都是路由到 Slave 节点(192.168.199.111)。

(2) 写测试

mysql> insert into login_user (userName, pwd) values('曹操', '123456');

Mycat高可用解决方案三(读写分离)

执行上面的新增插入语句后,此时对应的 MyCat 日志信息如下:

Mycat高可用解决方案三(读写分离)

 多次执行以上插入语句,发现新增数据都是从 Master 节点(192.168.199.110)插进入的,并且 Slave 节点(192.168.199.111)通过 Binlog 同步了 Master 节点中的数据。

Mycat高可用解决方案三(读写分离)

Mycat高可用解决方案三(读写分离)

 综上,基于 MyCat 的读写分离集群配置成功。

==================================================================

常见问题:10038错误码

Mycat高可用解决方案三(读写分离)

10038错误码,一般是服务端开启了防火墙
如果重启服务器,可能把临时的防火墙重置为开启状态
解决办法:
1、配置防火墙不拦截:修改/etc/sysconfig/iptables 文件,添加以下内容:
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
2、永久关闭防火墙:chkconfig iptables off