700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Mycat 老骥伏枥 志在千里

Mycat 老骥伏枥 志在千里

时间:2021-06-07 21:27:25

相关推荐

Mycat 老骥伏枥 志在千里

一、入门概述

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(数据库)对应,一个逻辑库中定义了所包括的TableTable:逻辑表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点DataNode。在此可以指定表的分片规则DataNode:MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过DataSource来关联到后端某个具体数据库上DataSource:定义某个物理库的访问地址,用于捆绑到Datanode上

5. 数据库中间件落地产品

① Cobar属于阿里B2B事业群,始于,在阿里服役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方式安装的数据库,安装方式可以参考我的另一篇文章

2.获取安装包

链接:/s/1zNPqyYmfzzori9MDOzws-A

提取码:93fn

复制这段内容后打开百度网盘手机App,操作更方便哦–来自百度网盘超级会员V2的分享

下载文件后将文件上传至Linux的 /opt目录下

3.解压后即刻使用

[root@localhost opt]# tar -zxvf Mycat-server-1.6.7.1-release-0627191042-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 3306mysql -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.134Enter 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.134Enter 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监控工具

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。