一、入门概述
1.什么是Mycat
- 一个彻底开源的,面向企业应用开发的大数据库集群
- 支持事务、ACID、可以替代MySQL的加强版数据库
- 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
- 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
- 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
- 一个新颖的数据库中间件产品
2.为什么使用MyCat
如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。如何使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储,为应对此问题就出现了——MyCat
3.支持的数据库
支持MySQL ORACLE SQLServer等一些主流的数据库
4.核心技术(分库分表)
数据库分片指:通过某种特定的条件,将我们存放在一个数据库中的数据分散存放在不同的多个数据库(主机)中,这样来达到分散单台设备的负载,根据切片规则,可分为以下两种切片模式
- Schema:逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的Table
- Table:逻辑表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点DataNode。在此可以指定表的分片规则
- DataNode:MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过DataSource来关联到后端某个具体数据库上
- DataSource:定义某个物理库的访问地址,用于捆绑到Datanode上
5. 数据库中间件落地产品
① 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公司发布的中间件
6 .工作原理
Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
这种方式把数据库的分布式从代码中解耦出来,程序员察觉不出来后台使用 Mycat 还是MySQL。
二、安装启动
1.操作环境
通过Vmware安装4台Linux虚拟机,并分别安装mysql5.7版本的数据库,我这里采用Docker方式安装的数据库,安装方式可以参考我的另一篇文章
序号 | 角色 | IP | 名称 |
---|---|---|---|
1 | 安装Mycat和Mysql | 192.168.146.134 | Mycat1 |
2 | 安装Mysql | 192.168.146.135 | Mycat2 |
3 | 安装Mysql | 192.168.146.136 | Mycat3 |
4 | 安装Mysql | 192.168.146.137 | Mycat4 |
2.获取安装包
链接:https://pan.baidu.com/s/1zNPqyYmfzzori9MDOzws-A
提取码:93fn
复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V2的分享
下载文件后将文件上传至Linux的 /opt目录下
3.解压后即刻使用
[root@localhost opt]# tar -zxvf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz -C /usr/local
4.需要修改的3个配置文件
①schema.xml:定义逻辑库,表、分片节点等内容
②rule.xml:定义分片规则
③server.xml:定义用户以及系统相关变量,如端口等
5.修改配置文件
1)修改配置文件****server.xml
…
<!-- 修改用户账号,不要和mysql的账号一样,区分开 -->
<user name="mycat">
<!-- 设置登录mycat的密码 -->
<property name="password">123456</property>
<!-- 设置mycat的逻辑库名称 -->
<property name="schemas">TESTDB</property>
</user>
…
2)修改配置文件schema.xml
删除标签间的表信息,标签只留一个,标签只留一个, 只留一对
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="host1" database="testdb" />
<dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"
slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.146.134:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="192.168.146.135:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
6.验证数据库访问情况
1) 创建数据库
在Mycat1和Mycat2上面创建数据库,名称为testdb,该名称在上面的配置文件schema.xml中配置的
2)测试 远程访问
Mycat 作为数据库中间件要和数据库部署在不同机器上,所以要验证远程访问情况
验证Mycat1和Mycat2是否可以登录对方的Mysql数据库
mysql -u root -p 123456 -h 192.168.146.134 -P 3306
mysql -u root -p 123456 -h 192.168.146.135 -P 3306
#如远程访问报错,请建对应用户
grant all privileges on *.* to root@'缺少的host' identified by '123456';
7.启动Mycat程序
①控制台启动 :去 mycat/bin 目录下执行 ./mycat console
②后台启动 :去 mycat/bin 目录下 ./mycat start
为了能第一时间看到启动日志,方便定位问题,我们选择①控制台启动。
8.登录Mycat
1)登录后台管理窗口 端口9066
#我这里采用Mysql安装采用的docker,所以前面需要添加一段docker命令
#通过账号mycat 密码123456 端口9066来登录,账号密码在上面的配置文件中设置
[root@localhost conf]# docker exec -it mysql mysql -u mycat -p -P 9066 -h 192.168.146.134
Enter password:
#查看逻辑库
mysql> show databases;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 row in set (0.00 sec)
#查看帮助
mysql> show @@help;
+--------------------------------------------------------------+--------------------------------------------+
| STATEMENT | DESCRIPTION |
+--------------------------------------------------------------+--------------------------------------------+
| show @@time.current | Report current timestamp |
| show @@time.startup | Report startup timestamp |
| show @@version | Report Mycat Server version |
| show @@server | Report server status |
| show @@threadpool | Report threadPool status |
| show @@database | Report databases |
| show @@datanode | Report dataNodes |
| show @@datanode where schema = ? | Report dataNodes |
| show @@datasource | Report dataSources |
| show @@datasource where dataNode = ? | Report dataSources |
| show @@datasource.synstatus | Report datasource data synchronous |
| show @@datasource.syndetail where name=? | Report datasource data synchronous detail |
| show @@datasource.cluster | Report datasource galary cluster variables |
| show @@processor | Report processor status |
| show @@command | Report commands status |
| show @@connection | Report connection status |
| show @@cache | Report system cache usage |
| show @@backend | Report backend connection status |
| show @@session | Report front session details |
| show @@connection.sql | Report connection sql |
| show @@sql.execute | Report execute status |
| show @@sql.detail where id = ? | Report execute detail status |
| show @@sql | Report SQL list |
| show @@sql.high | Report Hight Frequency SQL |
| show @@sql.slow | Report slow SQL |
| show @@sql.resultset | Report BIG RESULTSET SQL |
| show @@sql.sum | Report User RW Stat |
| show @@sql.sum.user | Report User RW Stat |
| show @@sql.sum.table | Report Table RW Stat |
| show @@parser | Report parser status |
| show @@router | Report router status |
| show @@heartbeat | Report heartbeat status |
| show @@heartbeat.detail where name=? | Report heartbeat current detail |
| show @@slow where schema = ? | Report schema slow sql |
| show @@slow where datanode = ? | Report datanode slow sql |
| show @@sysparam | Report system param |
| show @@syslog limit=? | Report system mycat.log |
| show @@white | show mycat white host |
| show @@white.set=?,? | set mycat white host,[ip,user] |
| show @@directmemory=1 or 2 | show mycat direct memory usage |
| show @@check_global -SCHEMA= ? -TABLE=? -retry=? -interval=? | check mycat global table consistency |
| switch @@datasource name:index | Switch dataSource |
| kill @@connection id1,id2,... | Kill the specified connections |
| stop @@heartbeat name:time | Pause dataNode heartbeat |
| reload @@config | Reload basic config from file |
| reload @@config_all | Reload all config from file |
| reload @@route | Reload route config from file |
| reload @@user | Reload user config from file |
| reload @@sqlslow= | Set Slow SQL Time(ms) |
| reload @@user_stat | Reset show @@sql @@sql.sum @@sql.slow |
| rollback @@config | Rollback all config from memory |
| rollback @@route | Rollback route config from memory |
| rollback @@user | Rollback user config from memory |
| reload @@sqlstat=open | Open real-time sql stat analyzer |
| reload @@sqlstat=close | Close real-time sql stat analyzer |
| offline | Change MyCat status to OFF |
| online | Change MyCat status to ON |
| clear @@slow where schema = ? | Clear slow sql by schema |
| clear @@slow where datanode = ? | Clear slow sql by datanode |
+--------------------------------------------------------------+--------------------------------------------+
59 rows in set (0.00 sec)
2)登录数据窗口,端口8066
此登录方式用于通过 Mycat 查询数据,我们选择这种方式访问 Mycat
[root@localhost conf]# docker exec -it mysql mysql -u mycat -p -P 8066 -h 192.168.146.134
Enter password:
三、搭建读写分离
我们通过 Mycat 和 MySQL 的主从复制配合搭建数据库的读写分离,实现 MySQL 的高可用性。我们将搭建:一主一从、双主双从两种读写分离模式。
1.搭建一主一从
一个主机用于处理所有写请求,一台从机负责所有读请求,架构图如下
2.Mysql主从复制原理
Mysql主从复制主机只能有1个,从机可能有多台,Mysql主从复制将所有的写操作都写入到一个Binary log日志中,从数据库不能直接访问主机,而是读取主机的Binary log日志,这里记录了所有的写操作,将这些命令拿到以后不是立刻的执行,而是写入一个Relay log日志,然后将Realy log日志中的命令去执行
注意这里和Redis的主从复制是由区别的,Mysql的主从复制是从接入点开始复制的,也就是这个Mysql的从数据库在加入这个主从复制体系后开始复制新的命令,而主机之前的数据是不管的,例如一个主从复制体系,假如主机之前有100条记录,这时加入了一个新的从机数据库,那么从机只会复制新产品的记录,而之前的100条记录是不复制的,而Redis的主从复制是从头开始复制的
3.搭建MySQL数据库主从复制
见PDF文档
4.搭建双主双从
四、垂直拆分—分库
一个数据库由很多表的构成,每个表对应着不同的业务,垂直切分是指按照业务将表进行分类,分布到不同 的数据库上面,这样也就将数据或者说压力分担到不同的库上面,如下图:
系统被切分成了,用户,订单交易,支付几个模块
配置步骤建PDF文档
五、水平拆分–分表
相对于垂直拆分,水平拆分不是将表做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中 包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分 到一个数据库,而另外的某些行又切分到其他的数据库中,如图:
1 .单表插入按照某字段分片
2.ER表,存储表关联数据
Mycat 借鉴了 NewSQL 领域的新秀 Foundation DB 的设计思路,Foundation DB 创新性的提出了 Table Group 的概念,其将子表的存储位置依赖于主表,并且物理上紧邻存放,因此彻底解决了JION 的效率和性能问 题,根据这一思路,提出了基于 E-R 关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上。
3.全局表,多用于固定的表数据
4.常用分片规则
1)取模
2)分片枚举
3)范围约定
4)按日期(天)分片
5.全局主键序列
保证不同的数据库表存储的主键id不重复
1)本地文件
此方式 Mycat 将 sequence 配置到文件中,当使用到 sequence 中的配置后,Mycat 会更下classpath 中的 sequence_conf.properties 文件中 sequence 当前的值。
① 优点:本地加载,读取速度较快
② 缺点:抗风险能力差,Mycat 所在主机宕机后,无法读取本地文件。
2)数据库方式(使用)
3)时间戳方式
4)自主生成全局序列
六、基于HA机制的Mycat高可用
我们可以使用 HAProxy + Keepalived 配合两台 Mycat 搭起 Mycat 集群,实现高可用性。HAProxy 实现了 MyCat 多节点的集群高可用和负载均衡,而 HAProxy 自身的高可用则可以通过 Keepalived 来实现。