一、环境
操作系统:CentOS-6.5-x86_64-bin-DVD1.iso
JDK版本:jdk1.7.0_80
MyCat版本:Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz (下载源码自行编译的)
MyCat节点IP:192.168.209.133 主机名:liuyazhuang133 主机配置:4核CPU、4G内存
MySQL版本:mysql-5.6.32.tar.gz
主节点IP:192.168.209.131 主机名:liuyazhuang131 主机配置:4核CPU、4G内存
从节点IP:192.168.209.132 主机名:liuyazhuang132 主机配置:4核CPU、4G内存
二、MyCat介绍 ( MyCat官网:http://mycat.io/ )
MyCat的读写分离是基于后端MySQL集群的主从同步来实现的,而MyCat提供语句的分发功能。MyCat1.4开始支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠。
三、MyCat的安装
1、设置MyCat的主机名和IP与主机名的映射
# vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=liuyazhuang133
# vi /etc/hosts 127.0.0.1 liuyazhuang133 192.168.209.131 liuyazhuang131 192.168.209.132 liuyazhuang132 192.168.209.133 liuyazhuang133
2、配置Java环境变量
因为MyCat是用Java开发的,因此MyCat运行需要安装JDK(准确来说是JRE就够了),并且需要JDK1.7或以上版本
# vi /etc/profile ## java env export JAVA_HOME=/usr/local/java/jdk1.7.0_80 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
3、上传安装包
上传Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz 到 MyCat服务器中的/home/mycat目录,并解压并移动到 /usr/local/mycat目录
$ tar -zxvf Mycat-server-1.5.1-RELEASE-20170717215510-linux.tar.gz
# mv /home/mycat/mycat /usr/local/ # cd /usr/local/mycat/ # ll
4、设置Mycat的环境变量
# vi /etc/profile ## mycat env export MYCAT_HOME=/usr/local/mycat export PATH=$PATH:$MYCAT_HOME/bin # source /etc/profile
四、配置MyCat
1、确认MySQL主从复制正常
在配置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等内容,
[root@liuyazhuang133 conf]$ cd /usr/local/root/conf/ [root@liuyazhuang133 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="lyz_schema1" checkSQLschema="false" sqlMaxLimit="100" dataNode="lyz_dn1"></schema> <schema name="lyz_schema2" checkSQLschema="false" sqlMaxLimit="100" dataNode="lyz_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="lyz_dn1" dataHost="dtHost2" database="lyzdb1" /> <dataNode name="lyz_dn2" dataHost="dtHost2" database="lyzdb2" /> <!-- 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.1.205:3306" user="root" password="lyz" /> </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.209.131:3306" user="root" password="root" /> <writeHost host="hostS2" url="192.168.209.132:3306" user="root" password="root" /> </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,会导致数据库不一致的严重问题 --> </m