mysql之中间件mycat原理

avatar 2021年4月21日18:12:58 评论 1,416 次浏览

在没有说mycat之前,我们要明白mycat的作用,mycat就是一个中间件,不存储任何数据,也不做任何数据的处理,它只是服务请求到mysql之间的一个中间件,把查询的语句通过查询换成,查询优化,不仅仅可以用作读写分离、以及分表分库、容灾备份,而且可以用于多租户应用开发、云平台基础设施、让你的架构具备很强的适应性和灵活性,借助于即将发布的 Mycat智能优化模块,系统的数据访问瓶颈和热点一目了然,根据这些统计分析数据,你可以自动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个应用的代码一行也不用改变。

mycat的特点:

1.支持 SQL 92标准 支持Mysql集群,可以作为Proxy使用 支持JDBC连接ORACLE、DB2、SQL Server,将其模拟为MySQL Server使用 支持galera for mysql集群,percona-cluster或者mariadb cluster,提供高可用性数据分片集群,自动故障切换,高可用性 。
2.支持读写分离(参考具体的schema.xml配置),支持分库分表,容灾备份。
3.支持Mysql双主多从,以及一主多从的模式 。
4.支持全局表,多租户应用开发、云平台基础设施、让你的架构具备很强的适应性和灵活性,借助于即将发布的 Mycat智能优化模块,系统的数据访问瓶颈和热点一目了然。
5.支持数据自动分片到多个节点,用于高效表关联查询 。
6.垮库join,支持独有的基于E-R 关系的分片策略,实现了高效的表关联查询多平台支持,部署和实施简单。
7.支持nosql数据库mongoDB。

mycat原理

应用通过mycat请求sql--mycat拦截sql--解析sql--数据资源管理--数据源分配--请求/响应--结果整合

MyCat中概念的理解

逻辑库:通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。
逻辑表:对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。
分片表:分片表,是指那些原有的很大数据的表,需要水平切分到多个数据库的表,这样,每个分片都有一部分数据,所有分片构成了完整的数据。
非分片表:一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,就是那些不需要进行数据切分的表。
ER表:子表的记录与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,通过表分组(Table Group)保证数据Join不会跨库操作。
全局表:所有的分片都有一份数据的拷贝,所有将字典表或者符合字典表特性的一些表定义为全局表。系统表(变动不频繁,规模不大)。
分片节点(dataNode):数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机,为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)。
分片规则(rule):一个大表被分成若干个分片表,就需要一定的规则。
全局序列号(sequence):数据切分后,原有关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号。

MyCat的主要作用

主从复制

Master对外提供写操作,salve对外提供读操作。当数据发生变化时会master将数据同步给slave。

流程:
1.master将操作记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events)
2.Slave通过I/O Thread异步将master的binary log events拷贝到它的中继日志(relay log);
3.Slave执行relay日志中的事件,匹配自己的配置将需要执行的数据,在slave服务上执行一遍从而达到复制数据的目的。

主从配置binarylog延迟产生?
1.当master tps高于sqlve线程所能承受的范围
2.网络延迟
3.磁盘io读写耗时

判断binarylog延迟
1.通过show slave status \G;sends_behind_master 0
2.mk-heartbeat

解决延迟问题
1.配置更好的硬件资源;
2.把iothread改成多线程模式(mysql5.6库进行多线程方式,5.7GTID进行多线程方式);
3.应用程序自己判断(mycat);

垂直切分

将一个很多表的大库切分成几个小库分到不同的节点上,具体步骤如下:
1.收集分析业务模块间的关系;
2.复制数据库到其他实例;
3.配置mycat垂直分库;
4.通过mycat访问db;
5.删除原库中已迁移表;

优点:
拆分简单;
应用程序模块清晰整合容易;
维护方便;

缺点:被拆分成多个节点的数据无法实现跨库查询,跨库查询会报错。
方案1:通过java程序调用多个数据库后将数据组装返回;
方案2:将库中的字段冗余避免出现跨库查询;
方案3:将变化不大的表设置成全局表;
库切分后但是大表仍然会有查询瓶颈;
切分后扩展性有限制;

水平切分

垂直切分解决不了一些大表大量访问数据的问题,因此需要水平切分。所谓的水平切分,就是将某些大表的数据按照规则分别分散到a1,a2,a3....这些表上,然后访问数据就到a1,a2,a3这些表上访问。
分片原则:1.能不切分尽量不要切分;2.选择合适的切分规则和分片键;3.避免使用join跨分片查询(E-R表关联或者全局表);
当根据分片键进行查询或修改时,mycat会根据分片键运算规则将分片键发送到相应的数据库上。当不是用分片键进行curd时,mycat会将请求发送到所有的数据库上然后返回结果。

水平切分步骤如下:
1.根据业务状态确定要进行水平切分的表;
2.分析业务模型选择分片键以及分片算法;
3.使用mycat部署分片集群;
4.测试分片集群;
5.业务及数据迁移;

如何选择分片键
尽可能的比较均匀分布数据的各个节点上;
该业务字段是最频繁的或者最重要的查询条件;
选择完分片键之后还需要对关联的表进行E-R表操作(就是将有关联其他表数据分配到同一个节点上,避免了join操作);

控制数据库连接数量
无论是将数据库水平切分还是垂直切分,都可以在mycat上修改数据库的连接数量,对数据库的请求连接会被发送到不同的节点服务器上。可以提高数据库的连接瓶颈。mycat的作用适用必须在请求量大大环境中,如果在流量小的环境中,体现不出来作用,还有就是mysql本身的优化,曾经测试过,优化后的mysql相比没有优化的环境中使用mycat性能没有体现出来,而且mysql在语法的优化更能加快数据的返回。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: