Mycat 老骥伏枥,志在千里

一、入门概述

1.什么是Mycat

  1. 一个彻底开源的,面向企业应用开发的大数据库集群
  2. 支持事务、ACID、可以替代MySQL的加强版数据库
  3. 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
  4. 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
  5. 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
  6. 一个新颖的数据库中间件产品

2.为什么使用MyCat

如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。如何使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储,为应对此问题就出现了——MyCat

3.支持的数据库

支持MySQL ORACLE SQLServer等一些主流的数据库
在这里插入图片描述

4.核心技术(分库分表)

数据库分片指:通过某种特定的条件,将我们存放在一个数据库中的数据分散存放在不同的多个数据库(主机)中,这样来达到分散单台设备的负载,根据切片规则,可分为以下两种切片模式
在这里插入图片描述

  1. Schema:逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的Table
  2. Table:逻辑表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点DataNode。在此可以指定表的分片规则
  3. DataNode:MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过DataSource来关联到后端某个具体数据库上
  4. 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和Mysql192.168.146.134Mycat1
2安装Mysql192.168.146.135Mycat2
3安装Mysql192.168.146.136Mycat3
4安装Mysql192.168.146.137Mycat4

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 来实现。

七、Mycat安全设置

1.权限配置

1) user标签权限配置,配置单个用户针对所有表的操作权限
2)privileges 标签权限控制,配置单个用户针对某个表的操作权限

2.SQL拦截

1)白名单
2)黑名单

八、Mycat监控工具

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为人师表好少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值