Mycat 快速入门
至于什么是Mycat,可能在不同的角色下有不同的理解。对MySQL架构有过了解的话,都知道MySQL实际上是由Server层和存储引擎层组成的。所以对于DBA来说,Mycat 就是 MySQL 的Server层。而 Mycat 后面连接的 MySQL Server,就好象是 MySQL 的存储引擎。因此,Mycat 本身并不存储数据,数据是在后端的 MySQL 上存储的,因此数据的可靠性
以及事务等依旧是 MySQL 保证的。
对于开发人员来说,Mycat基本等同于MySQL。因为完全可以使用连接MySQL的方式去连接Mycat,除了默认端口不同之外,连接方式上没有区别。所以Mycat对于开发人员来说是透明的,只不过在SQL的使用上有一些限制。
而对于架构师来说,Mycat 是一个数据库中间件,可以用作读写分离、分表分库以及容灾备份等。对于使用Mycat的应用来说,其隐藏了数据库的存储逻辑。让我们无需在代码上去对读写分离等存储逻辑进行控制,从而达到不修改应用代码的前提下,扩展数据库架构。
由于Mycat是国内的开源项目,有非常完善且丰富的中文文档。所以本文就不对基础概念进行赘述了,建议参考Mycat权威指南在线版或到Mycat官网中了解更多关于Mycat的内容。
什么是数据库中间件
数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务。由于对数据进行分片处理之后,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集群构成了整个完整的数据库存储。
如上图所表示,数据被分到多个分片数据库后,应用如果需要读取数据,就要需要处理多个数据源的数据。
如果没有数据库中间件,那么应用将直接面对分片集群。那么数据源切换、事务处理以及数据聚合等问题都需要应用直接处理。这样就会导致原本该是专注于业务的应用,将会花大量的工作来处理分片后的问题,最重要的是每个应用处理将是完全的重复造轮子。
因此有了数据库中间件,应用只需要集中于业务处理。而大量的通用的数据聚合,事务,数据源切换都由中间件来处理,中间件的性能与处理能力将直接决定应用的读写性能,所以一款好的数据库中间件至关重要。
Mycat的主要作用
1、作为分布式数据库中间件使用:
Mycat不仅可以连接mysql还可以连接其他诸如oracle、sql server等数据库,因为Mycat是使用Java编写的,理论上只要Java能连接的数据库,Mycat都可以连接。这就可以使得应用无需直连数据库,而是连接Mycat,此时后端数据库对应用就是透明的。这样就可以对应用屏蔽后端数据库的复杂性,并保持连接方式的统一。
2、实现数据库集群的读写分离和负载均衡:
当系统发展到后期,数据量上来后,数据库架构通常会向集群演进。其中Replication集群方案,节点存在主从角色,也就是常说的主从架构。在这种集群下通常由主节点负责写,从节点负责读。而Mycat可以作为中间层实现读写分离,无需每个应用都写一套读写分离逻辑。并且当存在多个从节点时,Mycat还可以将读请求负载均衡到各个从节点上。
3、实现数据库的高可用:
当数据库架构是一主一从时,可以利用Mycat实现数据库的高可用。当主节点挂掉后,Mycat可以切换到从节点上进行读写。但不适用于一主多从的情况,因为主节点挂掉后,Mycat只能切换到其中一个从节点上,而不能改变节点的角色。这样就会导致剩余的从节点无法对其进行数据同步。因此,一主多从需采用MMM或MHA等方式来实现高可用。
4、对业务数据库进行垂直切分:
当系统中的写负载上来后,单个主节点开始无法承受写请求的压力,这时就需要增加主节点来分担负载。拥有多个主节点后,通常会将一个库里没有依赖关系的表拆分到不同的库中,或将一些大表拆成小表,以分散负载。这也就是数据库的垂直切分。
存在多个主节点就意味着应用可能需要对多个数据库进行操作,而Mycat可以将多个数据库抽象成一个逻辑库。这样对于应用来说就无需改动代码去操作多个数据源,只需要操作Mycat中的逻辑库即可。
5、对业务数据库进行水平切分:
当数据库进行了垂直切分后,可能依旧会有一些库的写负载比较高,或者数据量达到单表极限。那么就需要考虑进行水平切分,所谓水平切分就是分库分表。垂直切分与水平切分的区别在于:水平切分后每个库里的表结构是一样的,切分的是数据。而垂直切分则是不同的库里表结构是不一样的,切分的是表。
当数据库进行水平切分后,应用在写数据时就需要考虑应该将数据写入到哪一个库中。而Mycat可以通过特定的策略将写请求分发到某个数据库上,这样应用就只需要将写请求发给Mycat即可,无需考虑应该写哪个库。
6、控制数据库连接数量:
系统中存在比较多的应用,而每个应用都有自己的一个连接池,那么当访问量增大就有可能超出数据库的最大连接数量。此时就可以通过Mycat建立一个公共的连接池,所有的应用都统一通过这个连接池来获取数据库的连接。从而控制同时连接数据库的应用数量,起到一个限流的作用,可以保证系统更加的稳定。
Mycat基本元素
逻辑库:
通常对实际应用来说,并不需要知道Mycat的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库,需要注意的是逻辑库不存储数据。所以不管中间件背后是怎么样的数据库架构,对于应用来说都是在操作一个数据库,而这个数据库就是Mycat抽象出来的逻辑库。
逻辑表:
既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中。也可以不做数据切分,不分片,只有一个表构成。同样,逻辑表也不存储数据。
逻辑表分类:
- 分片表:数据被拆分到多个数据库中的表
- 非分片表:数据未被拆分过的表
- 全局表:结构类似于字典并存在于所有分片中的表,目的是解决跨分片数据 join
- ER 表:按 ER 关系进行分片的表,目的是让子表的记录与所关联的父表记录存放在同一个数据分片上,保证数据 join不会跨库
Mycat安装
环境:
- 系统:CentOS 7
- JDK:1.8
- Mycat:1.6.7.4
首先到官方下载地址获取下载链接,然后到linux使用如下命令进行下载并解压:
[ ~]# cd /usr/local/src [ /usr/local/src]# wget http://dl.mycat.io/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz [ /usr/local/src]# tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /usr/local/
解压后,Mycat的目录结构如下:
[ /usr/local/mycat]# ll -rh total 24K -rwxrwxrwx 1 root root 227 Jan 5 16:41 version.txt drwxrwxrwx 2 root root 4.0K Jan 5 16:40 logs # 日志文件目录 drwxr-xr-x 2 root root 4.0K Jan 6 20:40 lib # 库文件目录 drwxrwxrwx 4 root root 4.0K Jan 6 20:40 conf # 配置文件目录 drwxrwxrwx 2 root root 4.0K Oct 22 21:26 catlet drwxr-xr-x 2 root root 4.0K Jan 6 20:40 bin # 可执行文件目录 [ /usr/local/mycat]#
为Mycat创建一个系统账户,并更改mycat
目录的所属用户,因为在实际的环境中是不可能让程序拥有root账户权限的。命令如下:
[ /usr/local]# useradd mycat -s /sbin/nologin [ /usr/local]# chown -R mycat:mycat mycat/
配置环境变量:
[ ~]# vim /etc/profile export MYCAT_HOME=/usr/local/mycat export PATH=$PATH:$MYCAT_HOME/bin [ ~]# source /etc/profile
由于我这里机器内存只有2G,所以需要修改一下Mycat启动参数,将最大内存改为1G,该参数默认是2G。当然,如果你的机器内存足够的话就不需要更改:
[ /usr/local]# vim mycat/conf/wrapper.conf wrapper.java.additional.4=-XX:MaxDirectMemorySize=1G
启动Mycat服务:
[ ~]# mycat start
查看日志,输出了successfully
表示启动成功:
[ ~]# more /usr/local/mycat/logs/wrapper.log |grep successfully INFO | jvm 1 | 2020/01/06 21:16:51 | MyCAT Server startup successfully. see logs in logs/mycat.log [ ~]#
Mycat启动后默认会监听8066、9066等端口,如果开启了防火墙,还需要对端口进行放行。开放端口的命令如下:
[ ~]# firewalld-cmd --zone=public --add-port=${端口号}/tcp --permanent [ ~]# firewalld-cmd --reload
到此为止,我们就成功将Mycat服务搭建起来了。