mycat 分表子查询_还不懂MyCat?一文带你深入剖析,实现MySQL读写分离

前言

系统开发中,数据库是非常重要的一个点。除了程序的本身的优化,如:SQL语句优化、代码优化,数据库的处理本身优化也是非常重要的。主从、热备、分表分库等都是系统发展迟早会遇到的技术问题问题。Mycat是一个广受好评的数据库中间件,已经在很多产品上进行使用了。下面就针对Mycat的基础知识和应用做一总结性梳理。

e0be8c7a7f82e91c1e85d86ef5ecd462.png

一、MyCat简单介绍

MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理(类似于Mysql Proxy),用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议与多个MySQL服务器通信,也可以用JDBC协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

MyCat发展到目前的版本,已经不是一个单纯的MySQL代理了,它的后端可以支持MySQL、SQL Server、Oracle、DB2、PostgreSQL等主流数据库,也支持MongoDB这种新型NoSQL方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是哪种存储方式,在MyCat里,都是一个传统的数据库表,支持标准的SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。

Mycat可以简单概括为

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

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是对数据库的抽象。

三、Mycat工作原理

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

de7276f784a0f77de51eca91eabf0e7c.png

上述图片里,Orders表被分为三个分片datanode(简称dn),这三个分片是分布在两台MySQL Server上(DataHost),即datanode=database@datahost方式,因此你可以用一台到N台服务器来分片,分片规则为(sharding rule)典型的字符串枚举分片规则,一个规则的定义是分片字段(sharding column)+分片函数(rule function),这里的分片字段为prov而分片函数为字符串枚举方式。

当Mycat收到一个SQL时,会先解析这个SQL,查找涉及到的表,然后看此表的定义,如果有分片规则,则获取到SQL里分片字段的值,并匹配分片函数,得到该SQL对应的分片列表,然后将SQL发往这些分片去执行,最后收集和处理所有分片返回的结果数据,并输出到客户端。以select * from Orders where prov=?语句为例,查到prov=wuhan,按照分片函数,wuhan返回dn1,于是SQL就发给了MySQL1,去取DB1上的查询结果,并返回给用户。

如果上述SQL改为select * from Orders where prov in (‘wuhan’,‘beijing’),那么,SQL就会发给MySQL1与MySQL2去执行,然后结果集合并后输出给用户。但通常业务中我们的SQL会有Order By 以及Limit翻页语法,此时就涉及到结果集在Mycat端的二次处理,这部分的代码也比较复杂,而最复杂的则属两个表的Jion问题,为此,Mycat提出了创新性的ER分片、全局表、HBT(Human Brain Tech)人工智能的Catlet、以及结合Storm/Spark引擎等十八般武艺的解决办法,从而成为目前业界最强大的方案,这就是开源的力量!

四、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这一层出现单点故障. 可以使用的高可用集群方式有: Keepalived+Mycat+Mysql, Keepalived+LVS+Mycat+Mysql, Keepalived+Haproxy+Mycat+Mysql

六:使用mycat配置mysql读写分离

1、准备工作

(1)mysql节点的及mycat节点的准备

02f0970da5934e252f7004fdcd9eff68.png

(2)拓扑结构

c9bf97d2d9d3c25b893612da37e9d472.png

2、配置主从同步

(1)配置主库

# 在主库上创建用于复制的用户mysql> CREATE USER 'repl'@'192.168.16.%' IDENTIFIED BY 'replication';   mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.16.%';        # 配置主库的server-id及开启binglog,配置完成后需要重启mysql[mysqld]log-bin=mysql-bin server-id=1# mysql操作表时不区分大小写,不配置使用mycat时可能会报错lower_case_table_names=1    # 设置字符集及需要同步的库replicate-do-db=coursecharacter-set-server=utf8init_connect='SET AUTOCOMMIT=0;set names utf8'# 锁定所有的表,防止写入mysql> FLUSH TABLES WITH READ LOCK;# 获取当前日志信息mysql> SHOW MASTER STATUSG*************************** 1. row ***************************             File: mysql-bin.000001         Position: 1594# 将主库上的数据导出并传到从库~]# mysqldump --all-databases --master-data -u root -p > dbdump.db~]# scp dbdump.db root@192.168.16.152:/data/mysql/data# 释放主库锁mysql> unlock tables;

(2)配置从库

# 配置从库的server-id并重启重库[mysqld]server-id=2# 设置字符集及需要同步的库replicate-do-db=coursecharacter-set-server=utf8init_connect='SET AUTOCOMMIT=0;set names utf8'# mysql操作表时不区分大小写,不配置使用mycat时可能会报错lower_case_table_names=1   # 在从库上导入主库导出的数据~]# mysql -uroot -p  reset slave;mysql> CHANGE MASTER TO    -> MASTER_HOST='192.168.16.151',    -> MASTER_PORT=3306,    -> MASTER_USER='repl',    -> MASTER_PASSWORD='replication',    -> MASTER_LOG_FILE='mysql-bin.000003',    -> MASTER_LOG_POS=194;mysql> start slave;

3、配置mycat

(1)配置schema.xml文件

Schema.xml文件的配置内容如下

<?xml version="1.0"?>                                        select user()                                                    

(2)配置server.xml

通过server.xml定义登录mycat的库以及登录用户,定义的逻辑库名与schema.xml中schema标签中的name字段定义的库名要相同。添加定义一个登录用户的配置文件如下:

                       dayi123                  testdb    

(3)使用mycat

由于没有使用分片功能所以不用配置rule.xml,配置完成后重启mycat后即可使用。

# 重启mycat]# ./mycat restart# 登录mycat[root@MYCAT bin]# mysql -h192.168.16.155 -uroot -p -P8066   # 通过mycat操作数据库mysql> use TESTDBDatabase changedmysql> show tables;+------------------+| Tables_in_course |+------------------+| course           || dept             || score            || student          |

七、管理mycat

Mycat安装完成后默认会监听两个端口,8066为数据端口,9066为管理端口登录方式同mysal登录方式类似。

# 登录mycat管理端口]# mysql -h127.0.0.1 -uuser -puser -P9066

Mycat的主要管理命令如下:

  • show @@help; 查看所有的命令
  • reload @@config_all; 该命令用于更新配置文件
  • show @@database; 该命令用于显示MyCAT的数据库的列表,对应schema.xml配置文件的schema子节点。
  • show @@datanode; 该命令用于显示MyCAT的数据节点的列表,对应schema.xml配置文件的dataNode节点
  • show @@heartbeat:该命令用于报告心跳状态
  • show @@connection:该命令用于获取Mycat的前端连接状态,即应用与mycat的连接
  • kill @@connection id,id,id :用于杀掉连接。
  • show @@cache; 查看mycat缓存;SQLRouteCache为sql路由缓存。 TableID2DataNodeCache为缓存表主键与分片对应关系。 ER_SQL2PARENTID :为缓存ER分片中子表与父表关系。
  • show @@datasource; 查看数据源状态,如果配置了主从,或者多主可以切换。
  • switch @@datasource name:index:切换数据源,name为schema中配置的dataHost 中name。index为schema中配置的dataHost 的writeHost index 位标(按照配置顺序从上到下的一次顺序,从0开始)。

以上就是小编整理的MyCat简介,只是个人的想法,有哪里不准确的地方,还请各位大佬多多指出,咱们共同学习进步~~~

感觉文章整理的对自己有帮助的朋友,请关注小编,你们的支持就是小编最大的动力~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL备份和还原数据库及慢查询日志使用

转载于:https://www.cnblogs.com/NiceTime/p/6665495.html

Oracle 11gR2 +sqldeveloper 安装过程(学习记录)

Oracle 11g 和SQL developer安装过程 一、Oracle 11g的安装 背景&#xff1a;由于课程学习需要Oracle 11g,但在Oracle官方网页&#xff08;https://www.oracle.com/index.html&#xff09;中没有直接找到Oracle 11的版本&#xff0c;所以自己在网上找到相关的压缩包进行的。 …

网线重新插拔后恢复正常_生活小窍门之网线不够长怎么办,毕亚兹网线连接器轻松搞定...

很多朋友在家中装修完时候&#xff0c;为了整齐和方便收纳都会把每个屋中的网口和光纤输出口集中到一起&#xff0c;放置到网络箱中&#xff0c;看起来更加整齐划一&#xff0c;但是装修时都不会考虑到网线要预留很长&#xff0c;很多时候都只留了很短的一节网线&#xff0c;还…

利用IDEA部署过的Tomcat开发Web Service

&#xff08;1&#xff09;使用idea开发一个Web Service&#xff1b; &#xff08;2&#xff09;开发一个客户端来调用该Web Service并展现出相应j结果&#xff1b; &#xff08;3&#xff09;编程调用网络上提供的天气预报Web Service并显示结果。 &#xff08;1&#xff09;开…

仅展示近三天的动态设置_抱歉,朋友仅展示最近三天的朋友圈

QQ空间可以封存&#xff1b; 微信朋友圈可以设置三天/半年可见&#xff1b; 微博可以设置半年内可见&#xff1b; 越来越多的人选择把自己的过去隐藏起来&#xff0c;为什么&#xff1f; 上了大学之后&#xff0c;你的微信好友变多了&#xff0c;连发传单的小哥和校门口理发店的…

wallpaper怎么导入视频_快速制作视频字幕,我们推荐这款可视化字幕软件!

大家平时在使用诸如pr&#xff0c;会声会影&#xff0c;或者爱剪辑等视频编辑软件制作字幕时会不会觉得很麻烦&#xff0c;一点都不方便呢&#xff1f;亦或是大家苦苦寻找&#xff0c;却怎么都找不到合适的字幕制作软件。那么到底有没有即高效又方便快捷的字幕制作软件呢&#…

带负荷测试要求二次最小电流_开关柜设计人员如何选择合适的零序电流互感器?...

作者介绍了开关柜内配零序电流互感器(适用于0.38&#xff5e;66kV)&#xff0c;分析特性&#xff0c;探讨如何选择合适的零序电流互感器&#xff0c;以期达到最佳的使用效果。1 概述在中压电力系统的项目中&#xff0c;我们开关柜的设计人员经常会遇到开关柜内配零序电流互感器…

scikit_learn 官方文档翻译(集成学习)

1.11. Ensemble methods&#xff08;集成学习&#xff09; 目标&#xff1a; 相对于当个学习器&#xff0c;集成学习通过使用多个基学习器的预测结果来来提高学习预测的泛化性能以及鲁棒性&#xff1b; 集成学习的两个思路&#xff1a; 1&#xff09;、通过使用并行的学习&…

css 实现一个尖角_一个讲述了 CSS 相关的技巧、动画实现 的开源项目(60篇相关文章)...

iCSS不止于 CSS文章围绕 CSS/web动画 展开&#xff0c;谈一些有趣的话题&#xff0c;内容天马行空&#xff0c;想到什么说什么&#xff0c;不仅是为了拓宽解决问题的思路&#xff0c;更涉及一些容易忽视或是十分有趣的 CSS 细节。Article List下面这个左边竖条图形&#xff0c;…

httos双向认证配置_idou老师教你学Istio 15:Istio实现双向TLS的迁移

本文由华为云容器Istio团队撰稿&#xff0c;未经允许谢绝转载。众所周知&#xff0c;HTTPS是用来解决 HTTP 明文协议的缺陷&#xff0c;在 HTTP 的基础上加入 SSL/TLS 协议&#xff0c;依靠 SSL 证书来验证服务器的身份&#xff0c;为客户端和服务器端之间建立“SSL”通道&…

混凝土静力受压弹性模量试验计算公式_【小马建考干货】天天送检,你知道混凝土试块检测哪些性能标指吗?...

混凝土九大类性能检测试块留置尺寸&#xff0c;具体留置前请咨询项目试验室&#xff0c;因为奇葩试验室很多&#xff01;一、砼抗压强度试块尺寸1、砼标准试件尺寸为 150*150*150&#xff08;公称最大粒径≤31.5mm&#xff09;。2、非标准试件尺寸通常用100*100*100&#xff08…

怎么做手机的上下滑动_diy滴胶手机壳到底怎么做呢?

diy滴胶手机壳到底怎么做呢&#xff1f;步骤1⃣:购买到手机壳(新手建议用有凹槽的手机壳&#xff0c;以免滴胶溢出)步骤2⃣:​拿到手机壳之后&#xff0c;建议用酒精擦拭一下&#xff0c; 以免有灰尘影响滴胶的效果步骤3⃣:​(此步骤不为必须步骤)如果不喜欢手机背面的颜色&…

扫描线三巨头 hdu1928hdu 1255 hdu 1542 [POJ 1151]

学习链接&#xff1a;http://blog.csdn.net/lwt36/article/details/48908031 学习扫描线主要学习的是一种扫描的思想&#xff0c;后期可以求解很多问题。 扫描线求矩形周长并 hdu 1928 Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O…

希尔排序 最坏时间_排序算法(2)

本文介绍插入排序和希尔排序&#xff0c;插入排序是较为常见的排序算法&#xff0c;希尔排序也是基础的排序算法&#xff0c;废话不多说&#xff0c;具体来看一下两种算法。山插入排序插入排序的基本思想是拿到下一个插入元素&#xff0c;在已经有序的待排数组部分找到自己的位…

多对一(一对多)的双向关联

一个组&#xff08;Group&#xff09;有多个用户&#xff08;User&#xff09;&#xff0c;进行多对一&#xff08;一对多&#xff09;的双向配置&#xff0c;在数据库中生成的表结构如下图&#xff1a; Annotation配置&#xff1a; Group: 1 package com.bjsxt.hibernate;2 3 …

隧道不能访问web vxaln_SpringBoot实现本地存储文件上传及提供HTTP访问服务

笔者计划为大家介绍分布式文件系统&#xff0c;用于存储应用的图片、word、excel、pdf等文件。在开始介绍分布式文件系统之前&#xff0c;为大家介绍一下使用本机存储来存放文件资源。二者的核心实现过程是一样的&#xff1a;上传文件&#xff0c;保存文件(本节是本地磁盘)返回…

修改form_Vue通过阿里云oss的url连接直接下载文件并修改文件名

我测试过很多遍,想要通过a标签的形式来直接点击url下载文件并重命名但是都失败了,最终只能下载却不能重命名 所以 换了java后台来修改名字.以下代码我做的网页是点击文件直接下载直接下载下来了,一开始的文件名是上传到oss时以id命名的名字,现在下载的时候想改名,遇到了问题,所…

STM32学习笔记(五)——通用定时器计数延时

STM32定时器概述 STM32F40x系列总共最多有14个定时器&#xff0c;定时器分为三类&#xff1a;基本定时器、通用定时器和高级定时器。它们的都是通过计数来达到定时的目的&#xff0c;和51的定时器差不多&#xff0c;基本原理都是一样的&#xff0c;就是功能多了一些&#xff0c…

第十九讲:职责链模式

public class CarBodyHandler extends CarHandler{Overridepublic void HandlerCar() {// TODO Auto-generated method stubSystem.out.println("组装车身");}} public abstract class CarHandler {public abstract void HandlerCar(); } public class CarHeadHandle…

四阶行列式直接展开_四阶行列式的完全展开式共有多少项

展开全部 共24项。 1.将该行列式前三列重复书写在该行列式的右边,可在前四列中作出两条对角线,然e5a48de588b662616964757a686964616f31333365663463后在此七列中作出相应的平行线,可得(图表一) 2.作乘积关系,可得如下八项: a11a22a33a44,a12a23a34a41,a13a24a31a42,a14a2…