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.9下载地址: https://downloads.mysql.com/archives/get/file/mysql-5.7.9-linux-glibc2.5-x86_64.tar.gz JDK版本:jdk1.7下载地址: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.5下载地址:http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gzhttps://github.com/MyCATApache/Mycat-Server/archive/1.6.5-RELEASE.zip
HAProxy版本:haproxy-1.5.19.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://mycat.org.cn/ )
MyCat 的读写分离是基于后端 MySQL 集群的主从同步来实现的,而 MyCat 提供语句的分发功能。
MyCat1.4 开始支持 MySQL 主从复制状态绑定的读写分离机制,让读更加安全可靠。
四、MyCat 的安装
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-01
# vi /etc/hosts
127.0.0.1 localhost127.0.0.1 mycat-01 192.168.199.112 mycat-01 192.168.199.110 mysql-01 192.168.199.111 mysql-02
3、因为 MyCat 是用 Java 开发的,因此 MyCat 运行需要安装 JDK(准确来说是 JRE 就够了),并且需要 JDK1.7 或以上版本
卸载自带的openjdk版本:
[[email protected]01 jdk1.7.0_79]# rpm -qa |grep java tzdata-java-2018g-1.el6.noarch java-1.7.0-openjdk-1.7.0.201-2.6.16.0.el6_10.x86_64 [[email protected]-01 jdk1.7.0_79]# rpm -e --nodeps tzdata-java-2018g-1.el6.noarch [[email protected]-01 jdk1.7.0_79]# rpm -e --nodeps java-1.7.0-openjdk-1.7.0.201-2.6.16.0.el6_10.x86_64 [[email protected]-01 jdk1.7.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 用户并设置密码
# useradd mycat
# passwd mycat
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.gztar -zxvf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz -C /usr/local/cd /usr/local/mycat/
设置 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 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 等内容。
[[email protected] ~]# cd /usr/local/mycat/conf/
[[email protected] conf]#vi schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<!-- 定义MyCat的逻辑库,逻辑库的概念与MySQL中的 database 概念相同 -->
<!-- schema name="rc_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="rc_dn1"></schema -->
<!-- schema name="pay_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="pay_dn1"></schema-->
<schema name="rc_schema2" checkSQLschema="false" sqlMaxLimit="100" dataNode="rc_dn2"></schema>
<schema name="pay_schema2" checkSQLschema="false" sqlMaxLimit="100" dataNode="pay_dn2"></schema>
<!-- 其中checkSQLschema表明是否检查并过滤SQL中包含schema的情况,如逻辑库为 TESTDB,则可能写为select * from TESTDB.edu_user,此时会自动过滤TESTDB,SQL变为select * from edu_user,若不会出现上述写法,则可以关闭属性为false -->
<!--sqlMaxLimit默认返回的最大记录数限制,MyCat1.4版本里面,用户的Limit参数会覆盖掉MyCat的sqlMaxLimit默认设置-->
<!-- 定义MyCat的数据节点 -->
<!-- dataNode name="rc_dn1" dataHost="dtHost1" database="roncoo" / -->
<!-- dataNode name="pay_dn1" dataHost="dtHost1" database="edu_simple_pay" / -->
<dataNode name="rc_dn2" dataHost="dtHost2" database="roncoo" />
<dataNode name="pay_dn2" dataHost="dtHost2" database="edu_simple_pay" />
<!-- dataNode 中的 name 数据表示节点名称, dataHost表示数据主机名称, database表示该节点要路由的数据库的名称 -->
<!-- dataHost配置的是实际的后端数据库集群(当然,也可以是非集群) -->
<!-- 注意:schema中的每一个dataHost中的host属性值必须唯一,否则会出现主从在所有dataHost中全部切换的现象 -->
<!-- 定义数据主机dtHost1,只连接到MySQL读写分离集群中的Master节点,不使用MyCat托管MySQL主从切换 -->
<!--
<dataHost name="dtHost1" 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主从切换 -->
<!-- 定义数据主机dtHost2,连接到MySQL读写分离集群,并配置了读写分离和主从切换 -->
<dataHost name="dtHost2" maxCon="500" minCon="20" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<!-- 通过show slave status检测主从状态,当主宕机以后,发生切换,从变为主,原来的主变为从,这时候show slave status就会发生错误,因为原来的主没有开启slave,不建议直接使用switch操作,而是在DB中做主从对调。 -->
<heartbeat>show slave status</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM2" url="192.168.199.110:3306" user="root" password="123456" />
<writeHost host="hostS2" url="192.168.199.111:3306" user="root" password="123456" />
</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上 -->
<!-- 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 时则表示主从同步,可以安全切换,否则不会切换。
常见问题:10038错误码
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
原文地址:https://www.cnblogs.com/gaogaoyanjiu/p/10241185.html