一、Mycat介绍
1、是什么(数据库中间件)
- 前身是阿里的cobar
- 一个彻底开源的,面向企业应用开发的大数据库集群
- 支持事务、ACID、可以替代MySQL的加强版数据库
- 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
- 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
- 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
- 一个新颖的数据库中间件产品
2、Mycat关键特性
- 支持SQL92标准
- 支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常见SQL语法
- 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
- 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。
- 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
- 基于Nio实现,有效管理线程,解决高并发问题。
- 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。
- 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。
- 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。
- 支持多租户方案。
- 支持分布式事务(弱xa)。
- 支持XA分布式事务(1.6.5)。
- 支持全局序列号,解决分布式下的主键生成问题。
- 分片规则丰富,插件化开发,易于扩展。
- 强大的web,命令行监控。
- 支持前端作为MySQL通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
- 支持密码加密
- 支持服务降级
- 支持IP白名单
- 支持SQL黑名单、sql注入攻击拦截
- 支持prepare预编译指令(1.6)
- 支持非堆内存(Direct Memory)聚合计算(1.6)
- 支持PostgreSQL的native协议(1.6)
- 支持mysql和oracle存储过程,out参数、多结果集返回(1.6)
- 支持zookeeper协调主从切换、zk序列、配置zk化(1.6)
- 支持库内分表(1.6)
- 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。
3、干什么的
(1)读写分离
(2)数据分片
- 垂直拆分
- 水平拆分
-
垂直+水平拆分
(3)多数据源整合
4、原理
拦截
Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户
这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用mycat还是mysql。
5、Mycat监控
- 支持对Mycat、Mysql性能监控
- 支持对Mycat的JVM内存提供监控服务
- 支持对线程的监控
-
支持对操作系统的CPU、内存、磁盘、网络的监控
6、Mycat架构
1.6版本架构
二、安装
Mycat官网:http://www.mycat.io/
可以了解下Mycat的背景和应用情况,这样使用起来比较有信心。
Mycat权威指南:http://www.mycat.io/document/mycat-definitive-guide.pdf
Mycat实体书籍:《分布式数据库架构及企业实践——基于Mycat中间件》 ISBN:978-7-121-30287-9
Mycat下载地址:http://dl.mycat.io/
官网有个文档,属于详细的介绍,初次入门,看起来比较花时间。
下载:
建议大家选择 1.6-RELEASE 版本,毕竟是比较稳定的版本。
安装:
根据不同的系统选择不同的版本。包括linux、windows、mac,作者考虑还是非常周全的,当然,也有源码版的。(ps:源码版的下载后,只要配置正确,就可以正常运行调试,这个赞一下。)
[图片上传失败...(image-7dc3fc-1578843743507)]
Mycat的安装其实只要解压下载的目录就可以了,非常简单。
安装完成后,目录如下:
目录 | 说明 |
---|---|
bin | mycat命令,启动、重启、停止等 |
catlet | catlet为Mycat的一个扩展功能 |
conf | Mycat 配置信息,重点关注 |
lib | Mycat引用的jar包,Mycat是java开发的 |
logs | 日志文件,包括Mycat启动的日志和运行的日志 |
三、配置
Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件:
- server.xml:用于配置Mycat的用户名、密码、逻辑数据库名、服务端口、读写权限等
- schema.xml:最常用的配置文件,用于配置物理数据库信息(ip、port、username、password、database)、表的配置(表所在的数据节点、表的分片规则、主键是否自增等)、读写分离配置等
- rule.xml:分片规则配置,mycat提供了十多种分片规则,也可以自定义分片规则
- log4j2.xml:配置mycat的日志信息,开发的时候建议设置成debug级别
logs: Mycat打印的日志文件
- console.log:mycat启动时的日志,启动成功一般会有有日志记录,如果没有日志记录可以通过mycat status命令来查看是否启动成功,如果启动失败可以去mycat.log中查看错误日志
- mycat.log:mycat执行sql对应的日志,可以通过该日志知道mycat是怎么样执行sql的,一些错误日志会输出到该文件中,是一个很重要的日志文件
- wrapper.log:错误日志也可能在这个日志文件中
- switch.log
Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是Mycat,不会接触到后端的数据库。
我们现在做一个主从、读写分离,简单分表的示例。结构如下图:
服务器 | IP | 说明 |
---|---|---|
Mycat | 192.168.0.2 | mycat服务器,连接数据库时,连接此服务器 |
database1 | 192.168.0.3 | 物理数据库1,真正存储数据的数据库 |
database2 | 192.168.0.4 | 物理数据库2,真正存储数据的数据库 |
Mycat作为主数据库中间件,肯定是与代码弱关联的,所以代码是不用修改的,使用Mycat后,连接数据库是不变的,默认端口是8066。连接方式和普通数据库一样,如:jdbc:mysql://192.168.0.2:8066/
四:Mycat命令
# 前端启动 打印一些信息 通过ctrl+c来停止
~ bin/mycat console
# 后台启动 几乎不打印日志
~ bin/mycat start
# 打印的信息比较多
~ ./bin/startup_nowrap.sh
# 重新启动
~ bin/mycat restart
# 查看mycat是否正在运行
~ bin/mycat status
# 停止mycat
~ bin/mycat stop
# 有时候启动失败是端口占用了,找到它,杀死它,重启启动
~ lsof -i:8066
~ kill -9 PID
~ bin/mycat start
五:Mycat的配置文件
server.xml文件
文件用途:
- 配置系统相关参数
- 配置哦用户访问权限
- 配置SQL防火墙及SQL拦截功能
- 几乎保存了所有 mycat 需要的系统配置信息。
server.xml配置详解
1、system 标签
该标签内嵌套的所有 property 标签都与系统配置有关。
3306
9066
0
0.0.0.0
4096
utf8
3
8
300000
300
0
0
2
100
104857600
2、user 标签
该标签主要用于定义登录 mycat 的用户和权限。示例定义了一个用户,用户名为 test、密码为123456,可访问的 schema 也只有 TESTDB 一个。
123456
mycat1,mycat2,mycat3
false
123456
mycat1
用户密码加密
java -cp /usr/local/mycat/lib/Mycat-server-1.6.5-release.jar io.mycat.util.DecryptUtil 0:root:123456
# 启用并更改密码为密文,0表示前端加密,root表示用户名,123456为用户密码
1
xasdfasdxSFA23
# 1.5.1如下
[root@mycat01 lib]# java -cp /usr/local/mycat/lib/Mycat-server-1.5.1-RELEASE.jar org.opencloudb.util.DecryptUtil 0:root:password
a2SY+TZczkA9Fz9+QA3DoY7W7+Vp62782bp/qR1BNN8XjDXfiImfArARJyWdIcm8RMIU29p5FijneWPoHUyZgw==
# 重启mycat生效
log4j2.xml文件
文件用途:
- 配置输出日志的格式
- 配置输出日志的级别
log4j2.xml配置详解
完整配置 基本上不用改,只要知道格式这些就好
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n
格式 | 说明 |
---|---|
%d{yyyy-MM-dd HH:mm:ss.SSS} | 表示日志的时间格式 |
%5p | 表示输出的日志级别 |
%t | 日志中记录线程名称 |
%m | 输出代码中指定的消息 |
%n | 输出一个回车换行符,window平台为 “/r/n”, linux平台为 “\n” |
level属性配置MyCAT日志级别
级别:All < Trace < Debug < Info < Warn < Error < Fatal < OFF
rule.xml文件
文件用途:
- 水平分表的时候才需要,配置水平分片的分片规则
- 指定分片规则和分片规则对应的分片函数
id
hash-mod-4
4
常用分片算法
- 1、简单取模-PartitionByMod:适用于整数类型的列,简单取模存储到后端节点-分片基数,数据分布比较均匀
customer_id
mod-long
2
- 2、hash取模-PartitionByHashMod:适用非整形类型的列,如字符串、日期,经过hash后再进行取模,数据分布可能不均匀**
login_name
mod-long
2
前面两个算法是利用mycat本身算法分片,后面两算法可以人为控制
- 3、枚举分片-PartitionByFileMap:根据可能的枚举值指定数据存储的节点位置,需要额外增加mapfile文件,适用按地区来分片业务场景**
mapFile记录可能出现的值,及分片值对应的节点索引
login_name
filemap-int
partition-hash-int.txt
0
0
- 4、字符串范围取模-PartitionByPrefixPattern:截取固定长度字符串进行ascii码求和,然后除以求模基数(配置文件指定),确定数据存储节点**
login_name
filemap-int
128/property>
prefix-partition-pattern.txt
2
schema.xml文件
文件用途:
- 配置逻辑库及逻辑表信息
- 配置逻辑表所存储的数据节点
- 配置数据节点所对应的物理数据库服务器信息
schema.xml配置详解
1、定义逻辑库
- name:定义逻辑库的名称,名字不可重复,可以和物理库不一样。
- checkSQLschema:判断是否检查发给mycat的sql是否含有库名。
- sqlMaxLimit:限制前端应用的默认返回行数,如果这里没有配置,将使用server.xml中的参数值,-1表示关闭Limit限制。
2、定义逻辑表
- name:定义逻辑表的名称,必须和物理表名一致且唯一。
- primaryKey:定义逻辑表主键,和物理表主键一致,可以缓存主键信息,提高查询性能。
- dataNode:指定物理表存储的物理节点;物理节点顺序和rule.xml节点顺序必须一致;。
- rule:指定分片规则,这里的customer_login分配规则名称对应rule.xml的tableRule名称
3、定义物理数据库
- name:物理节点名称,唯一。
- dataHost:定义分片所在的物理主机。
- database:物理数据库名称。
4、定义mysql集群信息
show slave status
# balance
# "0" 不开启读写分离机制,适用只有一个mysql数据库实例,或者读写敏刚应用
# "1" 全部的readhost和stand by writehost参与select语句负载均衡,适用双主双从实例
# "2" 所有的readhost和writehost都参与select语句负载均衡,适用写压力不大的应用场景
# "3" 所有readhost参与select语句的负载均衡,适用一主多从实例架构
# writeType
# "0" 默认值,所有的写请求落在第一个writehost上,当第一个writehost宕机后,才会选择第二个writehost主机
# "1" 随机将write请求分发到writehost主机上,有风险,适用PXC多写集群
# dbType
# 可以用于mongodb,用jdbc驱动
# switchType 写数据库如何进行切换
# "1" 当写主机不可用,自动切换到下一个可用写节点
# "-1" 关闭自动切换写主机功能,适用MHA管理的集群
switchType="-1,1,2,3"
--是否启用主从切换
-1:表示不启用主从切换;
1:为默认值,自动切换;
2:基于主从同步的状态,决定是否切换,与show slave status心跳对应;
3:基于多住galary集群切换,与show status like 'wsrep%'对应;
show slave status
--心跳检测语句,一般为select user();
如果是switchType=2,基于主从同步状态决定是否切换,则心跳设为show slave status;
如果是switchType=3,则心跳设为show status like 'wsrep%';
5、关于balance补充
- 1、一主一从情况下,为1有可能无法select 从库,读写均落在主库
- 2、一主情况下,主库宕机,所有从库无法通过mycat连接
- 3、一主多从,balance设为1,select均在从库
- 4、一主一从,balance设为3,select在从库 通常使用该项
- 5、一主一从,balance设为2,select会落在从库
未完待续。。。。。。
参考:
http://www.mycat.io/
http://www.mycat.io/document/mycat-definitive-guide.pdf
https://www.cnblogs.com/fyy-hhzzj/p/9044775.html
https://www.cnblogs.com/kingsonfu/p/10627802.html
https://blog.csdn.net/vbirdbest/article/details/83514361
https://blog.csdn.net/weixin_41043145/article/details/102753351
https://www.cnblogs.com/jenvid/p/10180435.html
https://blog.csdn.net/qq_30889373/article/details/103007101