A.自动切换
自动切换是MyCat主从复制的默认配置 , 当主机或从机宕机后, MyCat自动切换到可用的服务器上。假设写服务器为M, 读服务器为S, 则:
正常时, 写M读S;
当M宕机后, 读写S ; 恢复M后, 写S, 读M ;
当S宕机后, 读写M ; 恢复S后, 写M, 读S ;
B.基于MySQL主从同步状态的切换
这种切换方式与自动切换不同, MyCat检测到主从数据同步延迟时, 会自动切换到拥有最新数据的MySQL服务器上, 防止读到很久以前的数据。
原理就是通过检查MySQL的 主从同步状态(show slave status) 中的Seconds_Behind_Master
、Slave_IO_Running
、Slave_SQL_Running
三个字段,来确定当前主从同步的状态以及主从之间的数据延迟。 Seconds_Behind_Master
为0表示没有延迟,数值越大,则说明延迟越高。
2.MyCat主从切换实现
基于延迟的切换, 则判断结果集中的Slave_IO_Running
、Slave_SQL_Running
两个个字段是否都为yes,以及Seconds_Behind_Master
是否小于配置文件中配置的 slaveThreshold
的值,如果有其中任何一个条件不满足, 则切换。
主要流程如下:
五、MyCat核心技术
1.MyCat分布式事务实现
MyCat在1.6版本以后已经支持XA分布式事务类型了。具体的使用流程如下:
- 在应用层需要设置事务不能自动提交
set autocommit=0;
- 在SQL中设置XA为开启状态
set xa = on;
- 执行SQL
insert into user(id,name,sex) values(1,‘Tom’,‘1’),(2,‘Rose’,‘2’),(3,‘Leo’,‘1’),(4,‘Lee’,‘1’);
- 对事务进行提交或回滚
commit/rollback
完整流程如下:
2.MyCat SQL路由实现
MyCat的路由是和SQL解析组件息息相关的, SQL路由模块是MyCat数据库中间件最重要的模块之一,使用MyCat主要是为了分库分表, 而分库分表的核心就是路由。
A.路由的作用
如图所示, MyCat接收到应用系统发来的查询语句, 要将其发送到后端连接的MySQL数据库去执行,但是后端有三个数据库服务器,具体要查询那一台数据库服务器呢, 这就是路由需要实现的功能。
SQL的路由既要保证数据的完整 , 也不能造成资源的浪费, 还要保证路由的效率。
B.SQL解析器
Mycat1.3版本之前模式使用的是Fdbparser
的foundationdb
的开源SQL解析器,在2015年被apple收购后,从开源变为闭源了。
目前版本的MyCat采用的是Druid
的SQL解析器, 性能比采用Fdbparser
整体性能提高20%以上。
3.MyCat跨库Join
A.全局表
每个企业级的系统中, 都会存在一些系统的基础信息表, 类似于字典表、省份、城市、区域、语言表等, 这些表与业务表之间存在关系, 但不是业务主从关系,而是一种属性关系。
当我们对业务表进行分片处理时, 可以将这些基础信息表设置为全局表, 也就是在每个节点中都存在该表。
全局表的特性如下:
A.全局表的insert
、update
、delete
操作会实时地在所有节点同步执行, 保持各个节点数据的一致性
B.全局表的查询操作会从任意节点执行,因为所有节点的数据都一致
C.全局表可以和任意表进行join操作
B.ER表
关系型数据库是基于 实体关系模型(Entity Relationship Model
) 的, MyCat中的ER表便来源于此。 MyCat提出了基于ER关系的数据分片策略 , 子表的记录与其所关联的父表的记录存放在同一个数据分片中, 通过 表分组(Table Group
) 保证数据关联查询不会跨库操作。
C.catlet
catlet
是MyCat为了解决跨分片Join提出的一种创新思路, 也叫做 人工智能(HBT) 。MyCat参考了数据库中存储过程的实现方式,提出类似的跨库解决方案,用户可以根据系统提供的API接口实现跨分片Join。
采用这种方案开发时,必须要实现Catlet接口的两个方法 :
route 方法: 路由的方法, 传递系统配置和schema配置等 ;
processSQL方法: EngineCtx
执行SQL并给客户端返回结果集 ;
当我们自定义Catlet完成之后, 需要将Catlet的实现类进行编译,并将其字节码文件XXXCatlet.class
存放在mycat_home/catlet
目录下, 系统会加载相关Class, 而且每隔1分钟扫描一次文件是否更新, 若更新则自动重新加载,因此无需重启服务。
ShareJoin
ShareJoin
是Catlet
的实现, 是一个简单的跨分片Join, 目前支持两个表的Join,原理就是解析SQL语句, 拆分成单表的语句执行, 单后把各个节点的数据进行汇集。
要想使用Catlet完成join, 还需要借助于MyCat中的注解, 在执行SQL语句时,使用catlet注解:
/*!mycat:catlet=demo.catlets.ShareJoin */ select a.id as aid , a.id , b.id as bid , b.name as name from customer a,
company b where a.company_id=b.id and a.id = 1;
4.MyCat数据汇聚与排序
通过MyCat实现数据汇聚和排序,不仅可以减少各分片与客户端之间的数据传输IO, 也可以帮助开发者总复杂的数据处理中解放出来,从而专注于开发业务代码。
在MySQL中存在两种排序方式: 一种利用有序索引获取有序数据, 另一种通过相应的排序算法将获取到的数据在内存中进行排序。 而MyCat中数据排序采用堆排序法对多个分片返回有序数据,并在合并、排序后再返回给客户端。
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最后
由于文案过于长,在此就不一一介绍了,这份Java后端架构进阶笔记内容包括:Java集合,JVM、Java并发、微服务、SpringNetty与 RPC 、网络、日志 、Zookeeper 、Kafka 、RabbitMQ 、Hbase 、MongoDB、Cassandra 、Java基础、负载均衡、数据库、一致性算法、Java算法、数据结构、分布式缓存等等知识详解。
本知识体系适合于所有Java程序员学习,关于以上目录中的知识点都有详细的讲解及介绍,掌握该知识点的所有内容对你会有一个质的提升,其中也总结了很多面试过程中遇到的题目以及有对应的视频解析总结。
有内容对你会有一个质的提升,其中也总结了很多面试过程中遇到的题目以及有对应的视频解析总结。
[外链图片转存中…(img-LGBX9Xrj-1710429472245)]
[外链图片转存中…(img-fmUzr7hW-1710429472245)]