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

京东云开发者
• 阅读 482

1 问题域

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

2 ES宽表构建解决方案域

2.1 同步双写

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



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



2.2 异步双写

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



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



2.3 基于Binlog的实时同步

2.3.1 Binlog作为消息

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



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



2.3.2 Binlog作为数据

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



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



3 解决方案优缺点对比



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



4 我们的实践

4.1 Binlog作为数据构建ES宽表



分库分表后复杂查询的应对之道:基于DTS实时性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查询;



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



4.2.2 查询条件构建



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

点赞
收藏
评论区
推荐文章
Easter79 Easter79
3年前
TiDB DM 2.0 GA,数据迁移不用愁
社会数字化、智能化的发展进程中,海量的数据带来巨大挑战,各行各业都在加速数字化转型,越来越多的企业意识到数据基础设施是成功的关键。然而,作为数据基础设施的核心,传统数据库例如MySQL面临性能和容量瓶颈,通过中间件实现的分库分表方案复杂度高,同时带来高昂的运维成本。作为一款企业级NewSQL数据库,TiDB采用计算、存储分离的架构,可以根据业务
Stella981 Stella981
3年前
Asp.NetCore 3.1 EFCore处理Mysql的分库分表
一、什么情况下需要分库分表?Mysql单表数据量超过500万条。二、Asp.netCore技术栈,分库分表的解决方案有哪些?1、阿里云的DRDS2、Mycat 数据库分库分表中间件;3、TiDB;三、以上3种解决方案各自的特点:1、阿里云DRDS是收费的商业版,价格稍贵,但是比S
Stella981 Stella981
3年前
MyCat性能优化
  由于公司业务的快速发展导致数据库的数据量飞速增长,我们底层数据的存储,逐渐成为制约整个产品性能的核心部分。于是我们调研了各大数据库分库产品,如:hibernate5对多租户的支持,当当ShardingJdbc,mysqlProxy,mycat等。最终考虑到国内目前各个产品的活跃度和成熟度,以及对现有业务的适配情况,最终选择了mycat作为分库分表的
Wesley13 Wesley13
3年前
TiDB 4.0 新特性在电商行业的探索
作者介绍冀浩东,转转公司数据库负责人,负责转转公司整体的数据库运营。初引入TiDB解决了哪些问题?转转使用TiDB主要解决了两个问题,一个是分库分表问题,另一个是运维复杂度。分库分表是一个非常普遍的问题,会增加我们业务逻辑的复杂性,并且多维度的mapping可能导致我们整体性能的下降。有了
Stella981 Stella981
3年前
Canal 组件简介与 vivo 帐号实践
互联网应用随着业务的发展,部分单表数据体量越来越大,应对服务性能与稳定的考虑,有做分库分表、数据迁移的需要,本文介绍了vivo帐号应对以上需求的实践。一、前言Canal是阿里巴巴开源项目,关于什么是Canal?又能做什么?我会在后文为大家一一介绍。在本文您将可以了解到vivo帐号使用Canal解决了什么样的业务痛点,基于此希望
Wesley13 Wesley13
3年前
MySQL 分库分表方案
数据库分库分表前言今天有朋友问到了数据库分库分表,他们都说数据库达到了瓶颈,需要重构,但是毫无头绪,现在做个概念总结(期待后期的实操吗?)会从以下几个方面说起:第一部分:实际网站发展过程中面临的问题。第二部分:有哪几种切分方式,垂直和水平的区别和适用面。第三部分:目前市面有的一些开源产品,技术,它们的优缺点是
Easter79 Easter79
3年前
TiDB 4.0 新特性在电商行业的探索
作者介绍:冀浩东,转转公司数据库负责人,负责转转公司整体的数据库运营。初引入TiDB解决了哪些问题?转转使用TiDB主要解决了两个问题,一个是分库分表问题,另一个是运维复杂度。分库分表是一个非常普遍的问题,会增加我们业务逻辑的复杂性,并且多维度的mapping可能导致我们整体性能的下降。有了T
Easter79 Easter79
3年前
SpringBoot如何整合多个数据源,看这篇就够了
SpringBoot现在是很多很多公司应用的后端框架,因为它搭建快,能更好、更快速的整合其他第三方。那么随着业务的不断扩展,业务量的增加,这时候就会牵扯到分库分表,虽然这个词听起来很熟悉,作为程序员也很容易理解,但是我想应该也有不少读者没接触过分库分表,今天我们不聊如何分库分表,而是聊SpringBoot如何整合多个数据源的事情。也就是如何接入不同的
Stella981 Stella981
3年前
SpringBoot如何整合多个数据源,看这篇就够了
SpringBoot现在是很多很多公司应用的后端框架,因为它搭建快,能更好、更快速的整合其他第三方。那么随着业务的不断扩展,业务量的增加,这时候就会牵扯到分库分表,虽然这个词听起来很熟悉,作为程序员也很容易理解,但是我想应该也有不少读者没接触过分库分表,今天我们不聊如何分库分表,而是聊SpringBoot如何整合多个数据源的事情。也就是如何接入不同的