如何获取中间层的结果_社区投稿|DBLE和Mycat跨分片查询结果不一致案例分析

一、背景二、DBLE 项目介绍三、环境准备 1.测试架构 2.测试软件版本 3.表结构 4.分片规则配置schema配置rule配置四、比对开始 1.准备测试数据 2.执行跨节点join查询 3.执行计划DBLEMycat五、总结
810b4339f93d25583d3c759fabc482fd.png

背景

某一零售业后端使用了分布式中间件+ 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

测试软件版本

095eb35b07d4cd0299e11919ea631e2d.png

表结构

▽ 结算单来往明细表

fe102d0b72bd6164a985ece4843aa457.png

▽ 业务来往单据表

edf0e53a25048bf5d8410f9d2ea42a7a.png

分片规则配置

配置表t_bl_detail、t_bl_super_detail,使用取模算法,数据分布在db1-db4四个database中。

  • schema配置
e8105be62775178f7482335e9af7db5f.png

DBLE - schema 配置

84d4ba71fb3e5c1fd3dcad6a8eb22c2a.png

Mycat - schema 配置

  • rule 配置
b877d73834594eef7af737525acd45db.png

DBLE - rule 配置

658431e83322250afe7bc3d935777f1e.png

Mycat - rule 配置

比对开始

准备测试数据

登录任意一台中间件写入测试数据:

3203769e0d76bc32ad2cce112464ed68.png
49d0b075754a194f965e5e634ac71355.png

执行跨节点 join 查询

b61c8e1311d2571717d3c7b191afcd1e.png

在通过中间件之前,现在 MySQL 中执行一遍看下结果,作为预期结果供后续案例使用。

f28c64b7044ecc580ff7bc05bc66efe4.png

分别通过 DBLE、Mycat 执行跨节点 join 语句。

025fff1a00573ab9ce15e5677be4d554.png

DBLE 执行跨节点 join 语句

40b4798dccda21ef2be8831ab5b5968b.png

DBLE 执行跨节点 join 语句

可看到相同的查询语句,DBLE 执行结果符合预期,Mycat 执行结果缺失。数据差异在于 DBLE 查询结果相较于 Mycat 多了跨节点的结果。虽然 Mycat 执行跨节点 join 不报错,但是查询结果却和预期不一致。

执行计划

只从结果上判断并没有办法知道是什么原因导致了 Mycat 结果缺失,查看查询计划,比较两者差异。

  • DBLE

通过 DBLE 的执行计划可看出,DBLE 内部分别对结算明细表、业务单据表做了各自的数据查询,将查询结果在中间层做了merge。最后获得跨节点 join 的结果。

945c806bd07fc63a8d15c5169e8517dc.png
  • Mycat

Mycat 对于跨节点 join 的处理则相对暴力,直接将查询语句下发到各个节点,最后将结果进行汇总,如果表连接涉及到跨节点。则跨节点的数据无法进行 join。

9996c8599211dd232e6d72162a847da1.png

总结

Mycat 是一款非常优秀的分布式中间件,但是在某些细节方面处理的不尽人意。在跨节点关联查询场景下,Mycat 采取的策略是直接将语句透传到各个节点上,将获取到的结果整合后返回,得到的结果集和预期结果有出入,缺失了跨节点关联的数据。

DBLE 处理跨节点的关联查询是先获取到关联需要的数据,提取到中间件进行融合,得到关联查询的结果并返回。得到的结果集符合预期,与 MySQL 执行结果一致。可见 DBLE 在跨节点关联查询方面做了优化,能够提供准确的查询结果。

3edd4a0f36403d53342cc5c098abf560.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值