目录

mycat概述、安装及配置概览

概述

mycat官网

Mycat 读写分离、主从切换、分库分表的操作记录

mycat简介

MyCat是目前最流行的基于Java语言编写的数据库中间件,也可以理解为是数据库代理。在架构体系中是位于数据库和应用层之间的一个组件,并且对于应用层是透明的,即数据库 感受不到mycat的存在,认为是直接连接的mysql数据库(实际上是连接的mycat,mycat实现了mysql的原生协议)

数据库中间件?

中间件:是一类连接软件组件和应用的计算机软件,以便于软件各部件之间的沟通。eg::Tomcat,web中间件。

数据库中间件:连接java应用程序和数据库

MyCat是基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MyCat变得非常的强大。

mycat的三大功能:分库分表、读写分离、主从切换

http://img.cana.space/picStore/20201120224039.png

数据库中间件对比

http://img.cana.space/picStore/20201120192532.png

  • Cobar属于阿里B2B事业群,始于2008年,在阿里服役3年多,接管3000+个MySQL数据库的schema,集群日处理在线SQL请求50亿次以上。由于Cobar发起人的离职,Cobar停止维护。
  • Mycat是开源社区在阿里cobar基础上进行二次开发,解决了cobar存在的问题,并且加入了许多新的功能在其中。青出于蓝而胜于蓝。
  • OneProxy基于MySQL官方的proxy思想利用c进行开发的,OneProxy是一款商业收费的中间件。舍弃了一些功能,专注在性能和稳定性上。
  • kingshard由小团队用go语言开发,还需要发展,需要不断完善。
  • Vitess是Youtube生产在使用,架构很复杂。不支持Mysql原生协议,使用需要大量改造成本。
  • Atlas是360团队基于mysql proxy改写,功能还需完善,高并发下不稳定。
  • MaxScale是mariadb(MySQL原作者维护的一个版本)研发的中间件
  • MySQLRoute是MySQL官方Oracle公司发布的中间件

mycat作用

读写分离

http://img.cana.space/picStore/20201120194438.png

数据分片

垂直拆分(分库)、水平拆分(分表)、垂直+水平拆分(分库分表)

http://img.cana.space/picStore/20201120194459.png

多数据源整合

http://img.cana.space/picStore/20201120194522.png

Galera Cluster也就是multi-master的集群架构,多主集群架构

mycat原理

Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发 往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

http://img.cana.space/picStore/20201120194731.png

这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用 Mycat 还是 MySQL。

安装与启动

安装

Mycat是java开发的,所以运行Mycat需要jre支持,我们要搞个jre

软件下载:

这里为了可移植性好,我们自定义docker镜像,写个dockerfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
FROM centos:8
MAINTAINER lienhui68<lienhui1992@gmail.com>

LABEL name="lienhui68 mycat image" \
build-date="20201120"

ADD server-jre-8u271-linux-x64.tar.gz /home/
ADD Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz /home/

ENV WORKPATH /home/mycat/
WORKDIR $WORKPATH

# 设置JAVA_HOME,可以现在本地解压看得到的是什么目录
ENV JAVA_HOME /home/jdk1.8.0_271
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH $JAVA_HOME/bin:$PATH

EXPOSE 8066

CMD /home/mycat/bin/mycat console

Mycat启动方式有两种:

  • bin目录 ./mycat console 控制台方式启动 (我们用这种,可以看到执行记录信息)
  • bin目录 ./mycat start 后台启动

启动

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
$ pwd
/Users/david/docker/docker-config/mycat
$ vim dockerfile
# 将上面的dockerfile内容复制到这个文件里面,保存退出
$ docker build -t lienhui68/mycat:1.0 .
...
Successfully built e8d95e89356a
Successfully tagged lienhui68/mycat:1.0
# 启动容器
$ docker run -p 8066:8066 -it e8
Running Mycat-server...
wrapper  | --> Wrapper Started as Console
wrapper  | Launching a JVM...
jvm 1    | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
jvm 1    |   Copyright 1999-2006 Tanuki Software, Inc.  All Rights Reserved.
jvm 1    |
jvm 1    | MyCAT Server startup successfully. see logs in logs/mycat.log
# 使用docker ps查看容器id:33
# 进入容器
$ docker exec -it 33 /bin/bash
[root@3389b98455c8 mycat]# ls
bin  catlet  conf  lib	logs  tmlogs  version.txt
# 我们先把conf配置和logs日志目录copy到宿主机,主要是我们启动的时候挂载宿主机,方便配置和查看日志;
$ cd /Users/david/docker
# 先创建好mycat目录,否则cp会拷贝源目录的内容到mycat下而不是将源目录整个的拷贝到mycat下
$ mkdir mycat
$ docker cp 33:/home/mycat/conf/ ~/docker/mycat/
$ docker cp 33:/home/mycat/logs/ ~/docker/mycat/
$ ls
conf logs
# 删除原容器33,重新创建容器,指定挂载目录
$ docker rm -f 33
33
$ docker run -p 8066:8066 \
-v ~/docker/mycat/conf/:/home/mycat/conf/ \
-v ~/docker/mycat/logs/:/home/mycat/logs/ \
--name mycat01 \
-d lienhui68/mycat:1.0
b6864dfb984b5a57bbde040678651579da3ffa9a08d433cbb5915cce0275762f
# 查看mycat启动日志
$ tail -f 20 logs/mycat.log
tail: 20: No such file or directory

==> logs/mycat.log <==
	at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method) ~[?:1.8.0_271]
	at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:715) ~[?:1.8.0_271]
	at io.mycat.net.NIOConnector.finishConnect(NIOConnector.java:167) ~[Mycat-server-1.6.7.4-release.jar:?]
	at io.mycat.net.NIOConnector.finishConnect(NIOConnector.java:146) ~[Mycat-server-1.6.7.4-release.jar:?]
	at io.mycat.net.NIOConnector.run(NIOConnector.java:99) ~[Mycat-server-1.6.7.4-release.jar:?]
2020-11-20 15:44:20.828  INFO [$_NIOConnector] (io.mycat.net.AbstractConnection.close(AbstractConnection.java:520)) - close connection,reason:java.net.ConnectException: Connection refused ,MySQLConnection@746783191 [id=0, lastTime=1605887060820, user=root, schema=db3, old shema=db3, borrowed=false, fromSlaveDB=false, threadId=0, charset=utf8, txIsolation=3, autocommit=true, attachment=null, respHandler=null, host=localhost, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
2020-11-20 15:44:20.828  INFO [$_NIOConnector] (io.mycat.sqlengine.SQLJob.connectionError(SQLJob.java:125)) - can't get connection for sql :select user()
2020-11-20 15:44:20.828  WARN [$_NIOConnector] (io.mycat.backend.heartbeat.MySQLDetector.onResult(MySQLDetector.java:208)) - heart beat error: hostM1/localhost1 retry=10 tmo=30000
2020-11-20 15:44:20.830 ERROR [$_NIOConnector] (io.mycat.backend.heartbeat.MySQLHeartbeat.nextDector(MySQLHeartbeat.java:215)) - set Error 1  DBHostConfig [hostName=hostM1, url=localhost:3306]
2020-11-20 15:44:20.831  INFO [$_NIOConnector] (io.mycat.backend.datasource.PhysicalDatasource$1$1.connectionError(PhysicalDatasource.java:508)) - connection connectionError
# 这个是由于没有进行mycat配置导致的错误,在mycat配置

配置概览

Mycat conf目录下有三个重要配置文件,分别是:

  1. schema.xml:定义逻辑库,表,分片节点等内容;
  2. rule.xml:定义分片规则;
  3. server.xml:定义用户以及系统相关变量;

查看server.xml,可以查看默认用户的连接信息

1
2
3
4
<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</property>
		<property name="defaultSchema">TESTDB</property>

我们可以使用navicat或者mysql客户端连接到mycat的逻辑库,不过现在没有真实的数据库,连接上去后点击表会报ERROR 1184 (HY000): Invalid DataSource:0