MyCAT——中间件实现读写分离

1. 部署运行环境:

mycat是使用java语言开发的,所以在部署之前需要先部署JKD,且版本需要在V1.8或以上。
a. 上传JDK,此处选择的是:jdk-8u131-linux-x64.tar.gz
b. 创建安装目录:mkdir /usr/java
c. 解压JDK压缩包到安装目录:tar -xvf jdk-8u131-linux-x64.tar.gz -C /usr/java
d. 添加环境变量

vim /etc/profile
	……
	JAVA_HOME=/usr/java/jdk1.8.0_131
	PATH=$JAVA_HOME/bin:$PATH
	CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
	export PATH JAVA_HOME CLASSPATH
	……
source /etc/profile	#重新载入配置文件,使新增的环境变量生效。
java -version		#验证JDK是否安装成功。系统返回如下提示,说明配置正确。
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

2. 部署mycat

Mycat提供编译好的安装包,官方网站:http://www.mycat.org.cn/,可以在Windwos、Mac、Linux等系统上运行。
Linux系统可用的安装包如下所示:Mycat-server-xxxxx.linux.tar.gz。可以采用解压即用的方式安装。
建议安装路径:/usr/local/mycat。这里使用:Mycat-server-1.6.7.5-release-20200410174409-linux.tar.gz
部署过程可以简单概括如下四步:
下载–>上传–>解压–>添加环境变量

mkdir /usr/local/mycat	#创建安装目录
tar xf Mycat-server-1.6.7.5-release-20200410174409-linux.tar.gz -C /usr/local/mycat	#解压到安装目录
vim /etc/profile	#在该文件末尾增加以下参数,添加环境变量。
……
MYCAT_HOME=/usr/local/mycat
PATH=$MYCAT_HOME/bin:$PATH
……
source /etc/profile	#重新载入配置文件,使新增的环境变量生效,安装完成。

3. 程序目录说明:

以下内容来自《Mycat权威指南(第一版)》

  1. bin 程序目录,存放了 window 版本和 linux 版本,除了提供封装成服务的版本之外,也提供了 nowrap 的
    shell 脚本命令,方便大家选择和修改。
    Linux 下进入到 bin 目录,运行:
    chmod +x *
    ./mycat console
    注:mycat 支持的命令{ console | start | stop | restart | status | dump }
  2. conf 目录下存放配置文件,
    server.xml 是 Mycat 服务器参数调整和用户授权的配置文件,
    schema.xml 是逻辑库定义和表以及分片定义的配置文件,
    rule.xml 是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下。
    配置文件修改,需要重启 Mycat 或者通过 9066 端口 reload.
  3. lib 目录下主要存放 mycat 依赖的一些 jar 文件.
  4. logs/mycat.log 中存放日志,每天一个文件,日志的配置是在 conf/log4j.xml 中,根据自己的需要,可 以调整输出级别为 debug,debug 级别下,会输出更多的信息,方便排查问题.
    注意: Linux 下部署安装 MySQL,默认不忽略表名大小写,需要手动到/etc/my.cnf 下配置lower_case_table_names=1, 使 Linux 环境下 MySQL 忽略表名大小写,否则使用 MyCAT 的时候会提示找不到表的错误!

4. 配置文件:

mycat的配置文件主要有2个:

  1. server.xml:配置可访问MyCAT的账号、密码,以及Mycat要管理的数据库。
vim /usr/local/mycat/conf/server.xml
……
105 
106         <user name="root" defaultAccount="true">		#已授权的可以访问数据库的用户名1
107                 <property name="password">123456</property>		#以上用户名对应的密码
108                 <property name="schemas">TESTDB</property>		#可管理或可操作的数据库名
109                 <property name="defaultSchema">TESTDB</property>
110                 <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
111 
112                 <!-- 表级 DML 权限设置 -->
113                 <!--            
114                 <privileges check="false">
115                         <schema name="TESTDB" dml="0110" >
116                                 <table name="tb01" dml="0000"></table>
117                                 <table name="tb02" dml="1111"></table>
118                         </schema>
119                 </privileges>           
120                  -->
121         </user>
122 
123         <user name="user">		#已授权的可以访问数据库的用户名2
124                 <property name="password">user</property>		#以上用户名对应的密码
125                 <property name="schemas">TESTDB</property>		#可管理或可操作的数据库名
126                 <property name="readOnly">true</property>		#以上用户的可用权限,此处是:只读
127                 <property name="defaultSchema">TESTDB</property>
128         </user>
129 
130 </mycat:server>
……
  1. schema.xml:配置待管理的数据库的管理策略,如:数据库名称、最大连接数、负载均衡方式,以及要管理的主机IP、角色和切换模式等。
cp /usr/local/mycat/conf/schema.xml /use/local/mycat/conf/schema.xml.bak	#备份原文件
echo > /usr/local/mycat/conf/schema.xml	#清空原文件内容
vim /usr/local/mycat/conf/schema.xml	#添加如下配置
……
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'>	#设置待管理的数据库名;
        </schema>
        <dataNode name="dn1" dataHost="dthost" database="test"/>	#设置待管理的数据库名;
        <dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">	#配置读写分离规则和自动切换规则,详见下一部分解释。
        <heartbeat>select user()</heartbeat>
        <writeHost host="Master" url="主库IP:3306" user="mycat" password="123456">	#配置主库的域名和IP地址
        </writeHost>
        <writeHost host="Slave" url="从库IP:3306" user="mycat" password="123456" />	#配置从库的域名和IP地址
        </dataHost  >
</mycat:schema>
……

关于读写分离规则参数:balance

	balance=“0”,不开启读写分离,所有读操作均发送到当前可用的writehost上;
	balance=“1”,所有的readHost和stand by writeHost都参与select语句的负载均衡。
	balance=“2”,所有读请求随机分发到writeHost和readHost上。
	balance=“3”,所有读请求随机分发到writeHost对应的readHost上,即writeHost不承担读请求的压力。

关于自动切换参数switchType:

	switchType=“-1”,不自动切换;
	switchType=“1”,默认值,自动切换;
	switchType=“2”,基于MySQL主从同步的状态,决定是否切换,心跳语句:show slave status
	switchType=“3”,基于MySQL galary cluster的切换机制,心跳语句:show status like 'wsrep%',适用于集群。

5. 授权mycat登录主库和从库

分别在主库和从库中,授权mycat账号可以登录主库和从库,用于写入或读取数据。
grant all on . to ‘mycat’@’%’ identified by ‘123456’;
可以根据具体需求授予不同的权限。

6 mycat的基本操作和日志

  1. 启动和关闭
[root@ZbxMaster ~]# mycat
Usage: /usr/local/mycat/bin/mycat { console | start | stop | restart | status | dump }
[root@ZbxMaster conf]# mycat start	#启动
Starting Mycat-server...
[root@ZbxMaster conf]# tail -f ../logs/wrapper.log 	#查看wrapper日志,确认启动是否成功。
STATUS | wrapper  | 2020/06/23 10:36:48 | --> Wrapper Started as Daemon
STATUS | wrapper  | 2020/06/23 10:36:48 | Launching a JVM...
INFO   | jvm 1    | 2020/06/23 10:37:26 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2020/06/23 10:37:26 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2020/06/23 10:37:26 | 
INFO   | jvm 1    | 2020/06/23 10:38:09 | MyCAT Server startup successfully. see logs in logs/mycat.log
STATUS | wrapper  | 2020/06/23 11:23:49 | TERM trapped.  Shutting down.
STATUS | wrapper  | 2020/06/23 11:23:50 | <-- Wrapper Stopped
STATUS | wrapper  | 2020/06/23 11:23:56 | --> Wrapper Started as Daemon
STATUS | wrapper  | 2020/06/23 11:23:57 | Launching a JVM...
INFO   | jvm 1    | 2020/06/23 11:24:29 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO   | jvm 1    | 2020/06/23 11:24:29 |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
INFO   | jvm 1    | 2020/06/23 11:24:29 | 
INFO   | jvm 1    | 2020/06/23 11:25:34 | MyCAT Server startup successfully. see logs in logs/mycat.log	#提示启动成功
[root@ZbxMaster conf]# mycat stop	#关闭
Stopping Mycat-server...
Stopped Mycat-server.	#提示关闭成功
  1. 日志
    路径:/usr/local/mycat/logs
    mycat.log -->显示mycat运行中的所有情况,发生问题可以查看该日志。
    wrapper.log -->用于监控mycat的启动和停止过程。

7. mycat启动报错处理

Startup failed: Timed out waiting for a signal from the JVM.
JVM did not exit on request, terminated

解决办法
在wrapper.conf中添加
wrapper.startup.timeout=300 //超时时间300秒
wrapper.ping.timeout=120

8. 测试读写分离

  1. 停止主库,登录mycat,可以执行查询操作;
  2. 停止从库,开启主库,可以写入数据,不能查询。

你可能感兴趣的:(集群)