首页 > 其他分享 >库分表后复杂查询的应对之道:基于DTS实时性ES宽表构建技术实践

库分表后复杂查询的应对之道:基于DTS实时性ES宽表构建技术实践

时间:2024-06-24 11:45:59浏览次数:26  
标签:Binlog 查询 构建 DTS 宽表 ES

1 问题域

业务发展的初期,我们的数据库架构往往是单库单表,外加读写分离来快速的支撑业务,随着用户量和订单量的增加,数据库的计算和存储往往会成为我们系统的瓶颈,业界的实践多数采用分而治之的思想:分库分表,通过分库分表应对存系统读写性能瓶颈和存储瓶颈;分库分表帮我们解决问题的同时,也带来了复杂性;比如多条件的分页查询,多条件的联表查询变得复杂起来,通过调研我们发现针对这些分页,联表的复杂查询,业界常用的解决方案有以下两种:1 构建ES宽表2 构建查询条件到表主键Mapping映射表;本表文章介绍我们的实践:基于公司的中间件DTS构建实时性的ES宽表。所谓的宽表是通过主键将多张表关联成一张表,比如订单维度的宽表字段包含:订单主表,订单明细表,商品表,用户表等表字段。

2 ES宽表构建解决方案域

2.1 同步双写

应用在接收到写请求后,同步写DB成功,然后再同步写ES。

 


 

2.2 异步双写

应用在接收到写请求后,同步写DB成功,异步发送MQ,消费MQ异步写ES。

 


 

2.3 基于Binlog的实时同步

2.3.1 Binlog作为消息

将Binlog作为消息,或者驱动的Event,接收到消息后,RPC调取下游的业务系统,获取业务数据进行数组的组装,写入ES。

 


 

2.3.2 Binlog作为数据

解析Binlog中的数据,获取库表,字段变更前后的内容,INSERT, UPDATE, DELETE事件,基于Binlog中的数据去构建宽表,写入ES。

 


 

3 解决方案优缺点对比

 


 

4 我们的实践

4.1 Binlog作为数据构建ES宽表

 


 

4.1.1 顺序性的保证

上游DTS监听的binlog是有序的;发送消息时,业务方可以配置业务主键例如uep_order_no,DTS可以根据业务主键进行hash,将该条消息发送到对应的队列保证局部有序性;消费者消费时,同一个订单号uep_order_no映射到同一个分区,保证顺序消费;

4.1.2 幂等性的保证

DTS可以保证消息不丢失,但不保证消息不重复,可能发送重复的消息需要业务方保证幂等性,

UPDATE/DELETE操作天然具有幂等性

INSERT操作在进行操作前需要先判断下数据是否存在,不存在则插入,存在则更新

4.1.3 数据一致性的保证

由于数据存储在Mysql和ES两种存储媒介,可以采用定时任务对账机制保证数据的一致性,如果数据不一致采用补偿任务进行补偿操作

4.1.4 存量数据迁移

采用定时任务分页将数据从Mysql迁移到ES

4.2 ES复杂检索

4.2.1 检索的分类

多条件的复杂查询,采用Bool查询;

 


 

4.2.2 查询条件构建

 

标签:Binlog,查询,构建,DTS,宽表,ES
From: https://www.cnblogs.com/Jcloud/p/18264669

相关文章

  • MacBook怎么下载Indesign(ID)软件 百度云盘下载
    今天介绍一下,AdobeInDesign是一个桌面出版(DTP)的应用程序,主要用于各种印刷品的排版编辑。使用者常常将AdobeInDesign简称为ID,其与PS、AI、CDR并称为平面设计四小花旦。Indesign的最初设计是适用于定期出版物,海报以及其他印刷媒体,而随着人们对软件的开发与应用,现如今的In......
  • @RestController如何理解
    【SpringBoot】带你一文彻底搞懂RestController和Controller的关系与区别-CSDN博客目录什么是@RestController,什么是@Controller使用@ResponseBody注解让方法返回值作为响应内容是什么意思举例说明@RestController@Controller什么时候需要返回的是视图,什么时候需要返回数据......
  • C# Process 以管理员身份运行 bat 批处理
    使用C#中的Process类以管理员身份运行批处理(.bat)文件的步骤与运行其他应用程序类似。你需要设置ProcessStartInfo的Verb属性为"runas"。下面是一个示例代码,展示了如何实现这一点:usingSystem;usingSystem.Diagnostics;classProgram{staticvoidMain(){......
  • Unit test
    1.单元测试关系的是类中方法的逻辑正确性,不应该关注方法外部逻辑;1.1模块可以始终符合期望,在此之后才有集成工作2.不关注依赖方运行,用MOCK伪造假的依赖服务。(mock用于解耦---,模块思想,基本都是mock框架---mockito);2.2伪造的服务应清楚受测模块约束,不需要满足不必要的服务3.内部......
  • 0day新接口 紫光电子档案管理系统DesignReportSave文件上传
     0x01阅读须知        技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用......
  • Cesium 实战 - 自定义纹理材质系列之 - 动态扩散效果
    Cesium实战-自定义纹理材质系列之-动态扩散效果核心代码完整代码在线示例Cesium给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求;但是作为WebGL引擎,肯定不够丰富,尤其是动态效果样式。对于实体对象(Entity),可以通过自定义材质,实现各种动态效......
  • flask-session
    flask-session第三方flask-session,可以把session的内容保存在服务端安装并使用pip3installflask-session方式一fromflaskimportFlask,sessionfromflask_session.redisimportRedisSessionInterfaceimportredisapp=Flask(__name__)app.secret_key='adsfasd......
  • LLM troubleshooting for ping lost between containers.
    问题使用dockercompose启动的容器组,容器间不能通信。 LLM问答解决使用docker-compose启动的一组应用,但是容器间网络ping不通,为啥?答当使用docker-compose启动的一组应用出现容器间网络ping不通的情况时,可能的原因和解决方法可以归纳如下:   网络配置错误:       ......
  • manim边学边做--SingleStringMathTex
    SingleStringMathTex是Mobjects分类中用来显示数学公式的class。manim中有3个可以用来显示数学公式的class,还有两个是MathTex和Tex,后续再介绍。从SingleStringMathTex的名称中也可以看出,它是用来显示只有一行的简单公式。SingleStringMathTex在manim各个模块中的位置大致如上图中......
  • 创新实训 (九)CodeForces 数据和微调数据处理
    Codeforces数据获取Codeforces的题目中存在一些数学公式,所以处理的时候需要比较小心的对其进行处理。首先是题面数据,在CF当中标识一道题目的方式是problemSet与problemId。其中problemSet是一个数字,而problemId是一个字母。另外需要注意的是CF题面中存在许多数学......