MySQL 中间件-Mycat

图片[1]-MySQL 中间件-Mycat-李佳程的个人主页
  • mysql-proxy:Oracle,https://downloads.mysql.com/archives/proxy/
  • Atlas:Qihoo,https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
  • dbproxy:美团,https://github.com/Meituan-Dianping/DBProxy
  • Cetus:网易乐得,https://github.com/Lede-Inc/cetus
  • Amoeba:https://sourceforge.net/projects/amoeba/
  • Cobar:阿里巴巴,Amoeba的升级版, https://github.com/alibaba/cobar
  • Mycat:基于Cobar
    • http://www.mycat.io/ (原网站)
    • http://www.mycat.org.cn/
    • https://github.com/MyCATApache/Mycat-Server
  • ProxySQL:https://proxysql.com/
  • MaxScale: 是 MariaDB 开发的一个数据库智能代理服务,允许根据数据库 SQL 语句将请求转向目标一个到多个服务器,可设定各种复杂程度的转向规则。MaxScale 设计用于透明的提供数据库的负载均衡和高可用性,同时提供高度可伸缩和灵活的架构,支持不同的协议和路由决策。MaxScale 使用 C 语言开发,利用 Linux 下的异步 I/O 功能。使用 epoll 作为事件驱动框架。https://mariadb.com/kb/en/maxscale/

1、Mycat

1.1、Mycat 介绍

在整个IT系统架构中,数据库是非常重要,通常又是访问压力较大的一个服务,除了在程序开发的本身做优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了。
Mycat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理(类似于Mysql Proxy),用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。
Mycat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQLServer、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

  • Mycat 可以简单概括为
    • 一个彻底开源的,面向企业应用开发的大数据库集群
    • 支持事务、ACID、可以替代MySQL的加强版数据库
    • 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
    • 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
    • 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
    • 一个新颖的数据库中间件产品
  • Mycat 官网:http://www.mycat.org.cn/
  • Mycat 关键特性
    • 支持SQL92标准
    • 遵守MySQL 原生协议,跨语言,跨平台,跨数据库的通用中间件代理
    • 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群
    • 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
    • 基于Nio实现,有效管理线程,高并发问题
    • 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页
    • 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join
    • 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询
    • 支持多租户方案
    • 支持分布式事务(弱xa)
    • 支持全局序列号,解决分布式下的主键生成问题
    • 分片规则丰富,插件化开发,易于扩展
    • 强大的web,命令行监控
    • 支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉
    • 支持密码加密
    • 支持服务降级
    • 支持IP白名单
    • 支持SQL黑名单、sql注入攻击拦截
    • 支持分表(1.6)
    • 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)

为什么要用MyCat

这里要先搞清楚Mycat和MySQL的区别(Mycat的核心作用)。我们可以把上层看作是对下层的抽象,例如操作系统是对各类计算机硬件的抽象。那么我们什么时候需要抽象?假如只有一种硬件的时候,我们需要开发一个操作系统吗?再比如一个项目只需要一个人完成的时候不需要leader,但是当需要几十人完成时,就应该有一个管理者,发挥沟通协调等作用,而这个管理者对于他的上层来说就是对项目组的抽象。
同样的,当我们的应用只需要一台数据库服务器的时候我们并不需要Mycat,而如果你需要分库甚至分表,这时候应用要面对很多个数据库的时候,这个时候就需要对数据库层做一个抽象,来管理这些数据库,而最上面的应用只需要面对一个数据库层的抽象或者说数据库中间件就好了,这就是Mycat的核心作用。所以可以这样理解:数据库是对底层存储文件的抽象,而Mycat是对数据库的抽象。

图片[2]-MySQL 中间件-Mycat-李佳程的个人主页
Mycat工作原理

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

  • Mycat应用场景
    • Mycat适用的场景很丰富,以下是几个典型的应用场景
    • 单纯的读写分离,此时配置最为简单,支持读写分离,主从切换
    • 分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片
    • 多租户应用,每个应用一个库,但应用程序只连接Mycat,从而不改造程序本身,实现多租户化
    • 报表系统,借助于Mycat的分表能力,处理大规模报表的统计
    • 替代Hbase,分析大数据
    • 作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择
    • Mycat长期路线图
    • 强化分布式数据库中间件的方面的功能,使之具备丰富的插件、强大的数据库智能优化功能、全面的系统监控能力、以及方便的数据运维工具,实现在线数据扩容、迁移等高级功能
    • 进一步挺进大数据计算领域,深度结合Spark Stream和Storm等分布式实时流引擎,能够完成快速的巨表关联、排序、分组聚合等 OLAP方向的能力,并集成一些热门常用的实时分析算法,让工程师以及DBA们更容易用Mycat实现一些高级数据分析处理功能
    • 不断强化Mycat开源社区的技术水平,吸引更多的IT技术专家,使得Mycat社区成为中国的Apache,并将Mycat推到Apache基金会,成为国内顶尖开源项目,最终能够让一部分志愿者成为专职的Mycat开发者,荣耀跟实力一起提升
  • Mycat不适合的应用场景
    • 设计使用Mycat时有非分片字段查询,请慎重使用Mycat,可以考虑放弃!
    • 设计使用Mycat时有分页排序,请慎重使用Mycat,可以考虑放弃!
    • 设计使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请慎重使用Mycat,可以考虑放弃!
    • 设计使用Mycat时如果有分布式事务,得先看是否得保证事务得强一致性,否则请慎重使用Mycat,可以考虑放弃!
  • MyCat的高可用性:
    • 在生产环境中, Mycat节点最好使用双节点, 即双机热备环境, 防止Mycat这一层出现单点故障。可以使用的高可用集群方式有:
    • Keepalived+Mycat+Mysql
    • Keepalived+LVS+Mycat+Mysql
    • Keepalived+Haproxy+Mycat+Mysql

1.2、Mycat 安装

# 下载安装JDK
[root@centos79-mysql01 ~]# yum install -y java-1.8.0-openjdk.x86_64

[root@centos79-mysql01 ~]# java -version
openjdk version "1.8.0_352"
OpenJDK Runtime Environment (build 1.8.0_352-b08)
OpenJDK 64-Bit Server VM (build 25.352-b08, mixed mode)

# 下载安装mycat
[root@centos79-mysql01 ~]# wget https://github.com/MyCATApache/Mycat-Server/releases/download/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz

[root@centos79-mysql01 ~]# mkdir /apps
[root@centos79-mysql01 ~]# tar xvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /apps

[root@centos79-mysql01 ~]# ls /apps/mycat/
bin  catlet  conf  lib  logs  version.txt
  • mycat安装目录结构:
    • bin mycat命令,启动、重启、停止等
    • catlet catlet为Mycat的一个扩展功能
    • conf Mycat 配置信息,重点关注
    • lib Mycat引用的jar包,Mycat是java开发的
    • logs 日志文件,包括Mycat启动的日志和运行的日志
    • version.txt mycat版本说明
  • logs目录:
    • wrapper.log mycat启动日志
    • mycat.log mycat详细工作日志
  • Mycat的配置文件都在conf目录里面,几个常用的文件:
    • server.xml Mycat软件本身相关的配置文件,设置账号、参数等
    • schema.xml Mycat对应的物理数据库和数据库表的配置,读写分离、高可用、分布式策略定制、节点控制
    • rule.xml Mycat分片(分库分表)规则配置文件,记录分片规则列表、使用方法等
# 启动和连接

# 配置环境变量
[root@centos79-mysql01 ~]# vim /etc/profile.d/mycat.sh

PATH=/apps/mycat/bin:$PATH

[root@centos79-mysql01 ~]# source /etc/profile.d/mycat.sh

# 启动
[root@centos79-mysql01 ~]# mycat start

# 查看日志,确定成功
[root@centos79-mysql01 ~]# cat /apps/mycat/logs/wrapper.log
INFO   | jvm 1    | 2022/11/21 07:14:36 | MyCAT Server startup successfully. see logs in logs/mycat.log


# 连接mycat
[root@centos79-mysql01 ~]# mysql -uroot -p123456 -h 127.0.0.1 -P8066

1.3、Mycat 主要配置文件说明

server.xml

存放Mycat软件本身相关的配置文件,比如:连接Mycat的用户,密码,数据库名称等

server.xml文件中配置的参数解释说明:

user 用户配置节点

name 客户端登录MyCAT的用户名,也就是客户端用来连接Mycat的用户名。

password 客户端登录MyCAT的密码

schemas 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如:db1,db2

privileges 配置用户针对表的增删改查的权限

readOnly mycat逻辑库所具有的权限。true为只读,false为读写都有,默认为false

注意:

  • server.xml文件里登录mycat的用户名和密码可以任意定义,这个账号和密码是为客户机登录mycat时使用的账号信息
  • 逻辑库名(如上面的TESTDB,也就是登录mycat后显示的库名,切换这个库之后,显示的就是代理的真实mysql数据库的表)要在schema.xml里面也定义,否则会导致mycat服务启动失败!
  • 这里只定义了一个标签,所以把多余的都注释了。如果定义多个标签,即设置多个连接mycat的用户名和密码,那么就需要在schema.xml文件中定义多个对应的库!

schema.xml

是最主要的配置项,此文件关联mysql读写分离策略,读写分离、分库分表策略、分片节点都是在此文件中配置的。MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的。

schema.xml文件中配置的参数解释说明:

schema 数据库设置,此数据库为逻辑数据库,name与server.xml中schema对应
dataNode 分片信息,也就是分库相关配置
dataHost 物理数据库,真正存储数据的数据库

配置说明:

name属性唯一标识dataHost标签,供上层的标签使用。
maxCon属性指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数
minCon属性指定每个读写实例连接池的最小连接,初始化连接池的大小

每个节点的属性逐一说明:

  • schema:
    • name 逻辑数据库名,与server.xml中的schema对应
    • checkSQLschema 数据库前缀相关设置,这里为false
    • sqlMaxLimit select 时默认的limit,避免查询全表
  • table
    • name 表名,物理数据库中表名
    • dataNode 表存储到哪些节点,多个节点用逗号分隔。节点为下文dataNode设置的name
    • primaryKey 主键字段名,自动生成主键时需要设置
    • autoIncrement 是否自增
    • rule 分片规则名,具体规则下文rule详细介绍
  • dataNode
    • name 节点名,与table中dataNode对应
    • datahost 物理数据库名,与datahost中name对应
    • database 物理数据库中数据库名
  • dataHost
    • name 物理数据库名,与dataNode中dataHost对应
    • balance 均衡负载的方式
    • writeType 写入方式
    • dbType 数据库类型
    • heartbeat 心跳检测语句,注意语句结尾的分号要加
  • schema.xml文件中有三点需要注意:balance=”1″,writeType=”0″ ,switchType=”1″
  • schema.xml中的balance的取值决定了负载均衡对非事务内的读操作的处理。balance 属性负载均衡类型,目前的取值有 4 种:
    • balance=”0″:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上,即读请求仅发送到writeHost上
    • balance=”1″:一般用此模式,读请求随机分发到当前writeHost对应的readHost和standby的writeHost上。即全部的readHost与stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1, S2 都参与 select 语句的负载均衡
    • balance=”2″:读请求随机分发到当前dataHost内所有的writeHost和readHost上。即所有读操作都随机的在writeHost、 readhost 上分发
    • balance=”3″:读请求随机分发到当前writeHost对应的readHost上。即所有读请求随机的分发到wiriterHost 对应的 readhost 执行, writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有

writeHost和readHost 标签

这两个标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。
唯一不同的是:writeHost指定写实例、readHost指定读实例,组着这些读写实例来满足系统的要求。
在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去
注意:
Mycat主从分离只是在读的时候做了处理,写入数据的时候,只会写入到writehost,需要通过mycat的主从复制将数据复制到readhost

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享