中间件代理方式的读写分离,在业务代码中,数据库的操作不直接连接数据库,而是先请求到中间件服务器(代理),由代理服务器判断是读操作去从数据服务器,写操作去主数据服务器。
中间件代理服务器,除了能够实现读写分离,还可以作为数据库集群的管理平台。
1.mycat介绍
Mycat是一款基于阿里开源产品Cobar而研发的开源数据库分库分表中间件(基于Java语言开发)。官网所言:Mycat国内最活跃的、性能最好的开源数据库中间件!
- 一个彻底开源的,面向企业应用开发的大数据库集群
- 支持事务、ACID、可以替代MySQL的加强版数据库
- 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
- 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
- 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
- 一个新颖的数据库中间件产品
2.mycat读写分离实现
提前做好数据库的主从复制,以及mycat的环境准备。
角色 | ip | 功能 |
master_mysql | 192.168.1.15 | 写数据,数据库的增删改查 |
slave_mysql | 192.168.1.16 | 读数据 |
mycat | 192.168.1.17 | 读写分离 |
1.安装jdk
1.下载
下载地址:https://www.oracle.com/technetwork/java/javase/do wnloads/jdk8-downloads-2133151.html
将下载好的mycat和jdk安装包上传到指定目录
[root@mycat ~]# ls
anaconda-ks.cfg jdk-8u192-linux-x64.tar.gz
initserver.sh Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
2.解压
[root@mycat ~]# tar -xf jdk-8u192-linux-x64.tar.gz
[root@mycat ~]# tar -xf Mycat-server-1.6.5-release-20180122220033-linux.tar.gz
3.将解压后的文件放到指定目录
[root@mycat ~]# cp -r jdk1.8.0_192/ /usr/local/jdk
[root@mycat ~]# cp -r mycat/ /usr/local/
2.配置环境变量
1.追加环境变量
[root@mycat ~]# sed -i '$aexport JAVA_HOME=/usr/local/jdk' /etc/profile
[root@mycat ~]# source /etc/profile
[root@mycat ~]# $JAVA_HOME
-bash: /usr/local/jdk: 是一个目录
[root@mycat ~]# sed -i '$aexport PATH=$PATH:$JAVA_HOME/bin' /etc/profile
[root@mycat ~]# source /etc/profile
[root@mycat ~]# $PATH
-bash: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/jdk/bin: 没有那个文件或目录
2.检测java环境
[root@mycat ~]# java -version
java version "1.8.0_192"
Java(TM) SE Runtime Environment (build 1.8.0_192-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.192-b12, mixed mode)
3.启动控制台mycat
[root@mycat ~]# /usr/local/mycat/bin/mycat console #出现以下界面则表示启动成功
Running Mycat-server...
wrapper | --> Wrapper Started as Console
wrapper | Launching a JVM...
jvm 1 | Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
jvm 1 | Wrapper (Version 3.2.3) Home - Java Service Wrapper
jvm 1 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
jvm 1 |
jvm 1 | log4j:WARN No appenders could be found for logger (io.mycat.memory.MyCatMemory).
jvm 1 | log4j:WARN Please initialize the log4j system properly.
jvm 1 | log4j:WARN See Apache log4j 1.2 - Frequently Asked Technical Questions for more info.
jvm 1 | MyCAT Server startup successfully. see logs in logs/mycat.log
找到分离文件
[root@mycat ~]# ls /usr/local/mycat/conf/
4.配置xml文件
[root@mycat ~]# vim /usr/local/mycat/conf/server.xml 进入找到93行
[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml #真实mysql,删除table标签
5.启动mycat
[root@mycat ~]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
[root@mycat ~]# netstat -anput |grep 8066
启动不成功,查看日志发现是xml文件中出现了不允许出现的字符"__"
[root@mycat ~]# vim /usr/local/mycat/logs/wrapper.log
INFO | jvm 1 | 2024/08/15 16:35:08 | at io.mycat.config.MycatConfig.<init>(MycatConfig.java:72)
INFO | jvm 1 | 2024/08/15 16:35:08 | at io.mycat.MycatServer.<init>(MycatServer.java:170)
INFO | jvm 1 | 2024/08/15 16:35:08 | at io.mycat.MycatServer.<clinit>(MycatServer.java:116)
INFO | jvm 1 | 2024/08/15 16:35:08 | ... 7 more
INFO | jvm 1 | 2024/08/15 16:35:08 | Caused by: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 45; 注释中不允许出现字符串 "--"。
INFO | jvm 1 | 2024/08/15 16:35:08 | at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
INFO | jvm 1 | 2024/08/15 16:35:08 | at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
INFO | jvm 1 | 2024/08/15 16:35:08 | at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
修改错误之后重新启动
[root@mycat ~]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
[root@mycat ~]# netstat -anput |grep 8066
tcp6 0 0 :::8066 :::* LISTEN 5109/java
6.测试
[root@client ~]# cd mysql-5.7.44-linux-glibc2.12-x86_64/
[root@client mysql-5.7.44-linux-glibc2.12-x86_64]# ls
bin docs include lib LICENSE man README share support-files
[root@client mysql-5.7.44-linux-glibc2.12-x86_64]# cd bin/
[root@client bin]# ./mysql -h192.168.1.17 -P8066 -uqingtang -pqingtang