![b14dd08b9d46c68ef501111401226c61.png](https://i-blog.csdnimg.cn/blog_migrate/191bbd140ee093d04e02a88bb0f21cf4.jpeg)
文章来源:爱可生开源社区
作者:杨严豪
1.背景
某一零售业后端使用了分布式中间件+MySQL数据库作为后端存储。但是因为历史问题存在两种分布式中间件,分别是Mycat和DBLE,共用一组后端MySQL实例。分片规则以及后端数据完全一致。最近碰到了一个比较有意思的场景,财务结算单来往明细和业务来往单据的关联查询。一条跨节点join查询在DBLE、Mycat的查询得到的结果不一致。究竟谁对谁错?
2.DBLE 项目介绍
DBLE 是企业级开源分布式中间件,江湖人送外号 “MyCat Plus”;以其简单稳定,持续维护,良好的社区环境和广大的群众基础得到了社区的大力支持;
DBLE官方网站: https:// opensource.actionsky.com
可以详细了解DBLE的背景和应用场景,本文不涉及到的细节都可在官方文档获得更细节都信息;对于刚了解到同学,可以以本文为快速入门基础 DBLE 官方项目: https:// github.com/actiontech/d ble
如对源码有兴趣或者需要定制的功能的可以通过源码编译安装 DBLE 下载地址: https:// github.com/actiontech/d ble/releases DBLE 官方社区交流群:669663113
3.环境准备
在虚拟机搭建类似架构,模拟场景,比较Mycat-DBLE在跨节点join上的异同点。
3.1测试架构
测试环境架构比较简单,DBLE与Mycat共用数据库。
![3100306357d985b2f40b5c2744fb9779.png](https://i-blog.csdnimg.cn/blog_migrate/9d967dcb8a521ef292c39114e2d60a56.jpeg)
3.2 测试软件版本
![5a54d9f77745a50e993e0c2f238c20cc.png](https://i-blog.csdnimg.cn/blog_migrate/c4ed3607b285c1065b394ddddab309cb.jpeg)
3.3 表结构
结算单来往明细表
CREATE
业务来往单据表
CREATE
3.4 分片规则配置
配置表t_bl_detail、t_bl_super_detail,使用取模算法,数据分布在db1-db4四个database中。
3.41 schema配置
- DBLE配置
<schema
- Mycat配置
<schema
3.42 rule配置
- DBLE配置
<tableRule
- Mycat配置
<tableRule
4.比对开始
4.1 准备测试数据
随便登录哪一台中间件写入测试数据
insert
![44221f047c779e3ff3c2d4c844b2b6bf.png](https://i-blog.csdnimg.cn/blog_migrate/d33d1f50e511a8f85eb454e36d20d674.jpeg)
4.2 执行跨节点join查询
select
在通过中间件之前,现在MySQL中执行一遍看下结果,作为预期结果供后续案例使用。
![4975ceea1c4608ffc02f383a65ad3e0d.png](https://i-blog.csdnimg.cn/blog_migrate/1049be0d7572493e90831edb47ac1f67.jpeg)
分别通过DBLE、mycat执行跨节点join语句
▽ DBLE 执行跨节点 join 语句
![f5a39bc92cf302801e64ad656055ab58.png](https://i-blog.csdnimg.cn/blog_migrate/82d6402ed3258b4e4404acc8c5af55b8.jpeg)
▽ Mycat 执行跨节点 join 语句
![fb77e4ba4405bffbb89406020bbc5223.png](https://i-blog.csdnimg.cn/blog_migrate/e5635b098c84952da6bd599a977ef426.jpeg)
可看到相同的查询语句,DBLE执行结果符合预期,Mycat执行结果缺失。数据差异在于DBLE查询结果相较于Mycat多了跨节点的结果。虽然Mycat执行跨节点join不报错,但是查询结果却和预期不一致。
4.3 执行计划
只从结果上判断并没有办法知道是什么原因导致了Mycat结果缺失,查看查询计划,比较两者差异。
DBLE
通过dble的执行计划可看出,DBLE内部分别对结算明细表、业务单据表做了各自的数据查询,将查询结果在中间层做了merge。最后获得跨节点join的结果
- DBLE的执行计划
![8f50e5da94d65a7e5bc635e6f52e3a58.png](https://i-blog.csdnimg.cn/blog_migrate/544ce08cfebd72a899ba93f378c72056.jpeg)
Mycat
mycat对于跨节点join的处理则相对暴力,直接将查询语句下发到各个节点,最后将结果进行汇总,如果表连接涉及到跨节点。则跨节点的数据无法进行join。
- Mycat的执行计划
![2f564e8f6ca7db4a6fd9aae1bf31e2ab.png](https://i-blog.csdnimg.cn/blog_migrate/e930d3197b797bf3de0412b87f5cb403.jpeg)
5.总结
Mycat是一款非常优秀的分布式中间件,但是在某些细节方面处理的不尽人意。在跨节点关联查询场景下,Mycat采取的策略是直接将语句透传到各个节点上,将获取到的结果整合后返回,得到的结果集和预期结果有出入,缺失了跨节点关联的数据。
DBLE处理跨节点的关联查询是先获取到关联需要的数据,提取到中间件进行融合,得到关联查询的结果并返回。得到的结果集符合预期,与MySQL执行结果一致。可见DBLE在跨节点关联查询方面做了优化,能够提供准确的查询结果。
![46179134b8e3eea476b83a3b4befa672.png](https://i-blog.csdnimg.cn/blog_migrate/c7a2cea3bacb6e5af586c6488de9648b.jpeg)