一、背景二、DBLE 项目介绍三、环境准备 1.测试架构 2.测试软件版本 3.表结构 4.分片规则配置schema配置rule配置四、比对开始 1.准备测试数据 2.执行跨节点join查询 3.执行计划DBLEMycat五、总结
![810b4339f93d25583d3c759fabc482fd.png](https://i-blog.csdnimg.cn/blog_migrate/bf08c99bc1e873870e71530ac155634a.jpeg)
背景
某一零售业后端使用了分布式中间件+ MySQL 数据库作为后端存储。但是因为历史问题存在两种分布式中间件,分别是 Mycat 和 DBLE ,共用一组后端 MySQL实例。分片规则以及后端数据完全一致。最近碰到了一个比较有意思的场景,财务结算单来往明细和业务来往单据的关联查询。一条跨节点 join 查询在 DBLE、Mycat 的查询得到的结果不一致。究竟谁对谁错?
DBLE 项目介绍
DBLE 是企业级开源分布式中间件,江湖人送外号 “MyCat Plus”;以其简单稳定,持续维护,良好的社区环境和广大的群众基础得到了社区的大力支持;
DBLE官方网站:
https://opensource.actionsky.com
可以详细了解DBLE的背景和应用场景,本文不涉及到的细节都可在官方文档获得更细节都信息;对于刚了解到同学,可以以本文为快速入门基础
DBLE 官方项目:
https://github.com/actiontech/dble
如对源码有兴趣或者需要定制的功能的可以通过源码编译安装
DBLE 下载地址:
https://github.com/actiontech/dble/releases
DBLE 官方社区交流群:669663113
环境准备
在虚拟机搭建类似架构,模拟场景,比较 Mycat-DBLE 在跨节点 join 上的异同点。
测试架构
测试环境架构比较简单,DBLE 与 Mycat 共用数据库。
![1c106dd8a4d8ad2890acb99c47b95d9d.png](https://i-blog.csdnimg.cn/blog_migrate/ee97fb76c4f4961497453b9647b4b23d.jpeg)
测试软件版本
![095eb35b07d4cd0299e11919ea631e2d.png](https://i-blog.csdnimg.cn/blog_migrate/05e38ff33df048508d1b05619abc309d.jpeg)
表结构
▽ 结算单来往明细表
![fe102d0b72bd6164a985ece4843aa457.png](https://i-blog.csdnimg.cn/blog_migrate/1e6b28777789b0ad4161eecc7f914c86.jpeg)
▽ 业务来往单据表
![edf0e53a25048bf5d8410f9d2ea42a7a.png](https://i-blog.csdnimg.cn/blog_migrate/023967d7eb7c8a1edf5d4c84a952019d.jpeg)
分片规则配置
配置表t_bl_detail、t_bl_super_detail,使用取模算法,数据分布在db1-db4四个database中。
- schema配置
![e8105be62775178f7482335e9af7db5f.png](https://i-blog.csdnimg.cn/blog_migrate/c07db39b0f2815f9cb615415c7cfa4f1.jpeg)
DBLE - schema 配置
![84d4ba71fb3e5c1fd3dcad6a8eb22c2a.png](https://i-blog.csdnimg.cn/blog_migrate/cbe004c81b51edc9f32511a3f1c6bde8.jpeg)
Mycat - schema 配置
- rule 配置
![b877d73834594eef7af737525acd45db.png](https://i-blog.csdnimg.cn/blog_migrate/0367823a3a98e34ecfac095bd69cfabc.jpeg)
DBLE - rule 配置
![658431e83322250afe7bc3d935777f1e.png](https://i-blog.csdnimg.cn/blog_migrate/8534eba0a8b1f77ed88f018f72cb7b39.jpeg)
Mycat - rule 配置
比对开始
准备测试数据
登录任意一台中间件写入测试数据:
![3203769e0d76bc32ad2cce112464ed68.png](https://i-blog.csdnimg.cn/blog_migrate/6506ab1b18d539816d25d2e5490ad080.jpeg)
![49d0b075754a194f965e5e634ac71355.png](https://i-blog.csdnimg.cn/blog_migrate/c3efa31f57b187d0b697fdc6d47b69d0.jpeg)
执行跨节点 join 查询
![b61c8e1311d2571717d3c7b191afcd1e.png](https://i-blog.csdnimg.cn/blog_migrate/0537b4f46a6d31fb20496888e8732627.jpeg)
在通过中间件之前,现在 MySQL 中执行一遍看下结果,作为预期结果供后续案例使用。
![f28c64b7044ecc580ff7bc05bc66efe4.png](https://i-blog.csdnimg.cn/blog_migrate/7e4673d7039be1e50e2f3bc7728f9f0b.jpeg)
分别通过 DBLE、Mycat 执行跨节点 join 语句。
![025fff1a00573ab9ce15e5677be4d554.png](https://i-blog.csdnimg.cn/blog_migrate/58391278c67f3307331b596d846cb4c2.jpeg)
DBLE 执行跨节点 join 语句
![40b4798dccda21ef2be8831ab5b5968b.png](https://i-blog.csdnimg.cn/blog_migrate/6a3f67149842b721c6c051ca41e130fe.jpeg)
DBLE 执行跨节点 join 语句
可看到相同的查询语句,DBLE 执行结果符合预期,Mycat 执行结果缺失。数据差异在于 DBLE 查询结果相较于 Mycat 多了跨节点的结果。虽然 Mycat 执行跨节点 join 不报错,但是查询结果却和预期不一致。
执行计划
只从结果上判断并没有办法知道是什么原因导致了 Mycat 结果缺失,查看查询计划,比较两者差异。
- DBLE
通过 DBLE 的执行计划可看出,DBLE 内部分别对结算明细表、业务单据表做了各自的数据查询,将查询结果在中间层做了merge。最后获得跨节点 join 的结果。
![945c806bd07fc63a8d15c5169e8517dc.png](https://i-blog.csdnimg.cn/blog_migrate/7c755284f92eeb1ca733a5db3fe91b6e.jpeg)
- Mycat
Mycat 对于跨节点 join 的处理则相对暴力,直接将查询语句下发到各个节点,最后将结果进行汇总,如果表连接涉及到跨节点。则跨节点的数据无法进行 join。
![9996c8599211dd232e6d72162a847da1.png](https://i-blog.csdnimg.cn/blog_migrate/05947c06cb18290b94252edaab978241.jpeg)
总结
Mycat 是一款非常优秀的分布式中间件,但是在某些细节方面处理的不尽人意。在跨节点关联查询场景下,Mycat 采取的策略是直接将语句透传到各个节点上,将获取到的结果整合后返回,得到的结果集和预期结果有出入,缺失了跨节点关联的数据。
DBLE 处理跨节点的关联查询是先获取到关联需要的数据,提取到中间件进行融合,得到关联查询的结果并返回。得到的结果集符合预期,与 MySQL 执行结果一致。可见 DBLE 在跨节点关联查询方面做了优化,能够提供准确的查询结果。
![3edd4a0f36403d53342cc5c098abf560.png](https://i-blog.csdnimg.cn/blog_migrate/cce1174c8784e70da258da275dd4ed1d.jpeg)