MySQL数据同步到ES的4种解决方案

news2024/11/22 23:45:59

一、背景

大家应该都在各种电商网站检索过商品,检索商品一般都是通过什么实现呢?搜索引擎Elasticsearch。那么问题来了,商品上架,数据一般写入到MySQL的数据库中,那么用于检索的数据又是怎么同步到Elasticsearch的呢?

MySQL同步ES

二、同步双写

2.1 概念

这是能想到的最直接的方式,在写入MySQL,直接也同步往ES里写一份数据。

同步双写

2.2 优缺点

  • 优点:实现简单

  • 缺点:
    1、业务耦合,商品的管理中耦合大量数据同步代码。
    2、影响性能,写入两个存储,响应时间变长。
    3、不便扩展:搜索可能有一些个性化需求,需要对数据进行聚合,这种方式不便实现。

三、异步双写

3.1 概念

我们也很容易想到异步双写的办法,上架商品的时候,先把商品数据丢进MQ,为了解耦合,我们一般会拆分一个搜索服务,由搜索服务去订阅商品变动的消息,来完成同步。

异步双写

前面说的,一些数据需要聚合处理成类似宽表的结构怎么办呢?例如商品库的商品品类、spu、sku表是分开的,但是查询是跨维度的,在ES里再聚合一次效率就低一些,最好就是把商品的数据给聚合起来,在ES里以类似大宽表的形式存储,这样一来查询效率就高一些。

多维度多条件查询

这种其实没什么好办法,基本上还是得搜索服务直接查库,或者远程调用,再查询一遍商品的数据库,就是所谓的回查。

回查完成聚合

3.2 优缺点

  • 优点:
    1、解耦合,商品服务无需关注数据同步。
    2、实时性较好,使用MQ,正常情况下,同步完成在秒级。

  • 缺点:
    1、引入了新的组件和服务,增加了复杂度。

四、定时任务

4.1 概念

假如我们要快速搞搞,数据量有没那么大,怎么办呢?定时任务也可以。

定时任务

定时任务,最麻烦的一点是频率不好选,频率高的话,会非自然地形成业务的波峰,导致存储的CPU、内存占用波峰式上升,频率低的话实时性比较差,而且也有波峰的情况。

4.2 优缺点

  • 优点:实现比较简单。

  • 缺点:
    1、实时性难以保证。
    2、对存储压力较大。

五、数据订阅

5.1 概念

还有一种方式,就是最时兴的数据订阅。MySQL通过binlog订阅实现主从同步,各路数据订阅框架比如canal就依据这个原理,将client组件伪装成从库,来实现数据订阅。

MySQL主从同步

5.2 canal

我们以应用最广泛的canal为例,canal通过canal-adapter,支持多种适配器,其中就有ES适配器,通过一些配置,启动之后,就可以直接把MySQL数据同步到ES,这个过程是零代码的。

canal同步数据

但是,使用canal看起来很美好,帮我们把同步的事情都干了,但其实,还是要写代码。为什么呢?前面提到的多张表数据聚合,canal的支持没那么好,所以还是得回查。这时候用canal-adapter就不合适了,需要自己实现canal-client,监听和聚合数据,写入ES:

数据订阅+回查

5.3 优缺点

这种看起来和异步双写比较像,但是第一降低了商品服务的耦合,第二数据的实时性更好。所以使用数据订阅:

  • 优点:
    1、业务入侵较少
    2、实时性较好

5.4 数据订阅框架

至于数据订阅框架的选型,主流的大体上是这些:

数据订阅框架

除了MySQL同步ES,MySQL同步到其它的数据存储,例如HBase,其实大体上都是类似的几种方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/610740.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[2.0快速体验]Apache Doris 2.0 弹性计算节点快速体验

​1. 概览 我们都知道Doris 目前是一个典型的Share-Nothing的架构,Doris 通过绑定数据和计算资源在同一个节点获得非常好的性能表现. 但随着Doris 计算引擎性能持续提高, 越来越多的用户也开始选择使用Doris直接查询数据湖数据. 这类场景是一种Share-Disk场景, 数据…

Vue.js 中的模板编译原理是什么?

Vue.js 中的模板编译原理是什么? Vue.js是一种流行的前端框架,它使用了一种称为“模板”的技术来实现视图的渲染和更新。在Vue.js中,模板是一种类似HTML的语言,用于描述视图的结构和内容。但是,Vue.js并不直接将模板转…

【web框架】——Django01——如桃花来

目录索引 web框架介绍:常见软件的架构:*CS架构:**BS架构:* 网络通信:socket知识复习:*服务端代码逻辑:**客户端代码逻辑:* socket代码演示:*服务端代码演示:*…

【学习记录】win10 + ubuntu 22.04双系统安装

一、背景 因为家里的台式(Windows 10)最近一直频繁蓝屏,再加上Win10之前经常性的资源管理器未响应,对Windows系统逐渐失去了信心,于是想着安装稳定性较好的Linux。以前抵触Linux是因为其人机交互界面没Windows那么直观…

今天来当一下数据库,看一下sql到底在里面如何执行的?

今天来当一下数据库,看一下sql到底在里面如何执行的? 一、引子 不管是开发,还是运维,亦或者是产品。 多多少少会写sql,只不过有的人写得多,有的人写得少罢了。 但是你有想过,在数据库中&…

ASCII 码对照表

1. ASCII码表(控制字符) 2. ASCII码表(打印字符) 3. ASCII码表(扩展字符)

不要藏着掖着了,600万用户已经使用“Excel新版本”,统统拿走

600万用户正在切换 已经2023年,就不用再藏着掖着了,目前已经有600万用户开始使用了。 没错,“Excel新版本”已经开始普及了,正在大面积替代切换,不仅Excel用户能用,Access用户照样可以轻松玩转&#xff0…

VBA中如何调用自定义函数

一、问题提出 在VBA中我要把B列中所有的非空单元格的值都判断一遍,如果大于60就在其旁边的单元格写入"及格",反之就写入不及格。如下图所示: 由于B列的非空单元格数量无法确定,所以我们就要定义一个自定义的函数来获取…

【Qt】delegate的自定义实现函数createEditor进不去【2023.05.07】

摘要 妈卖批,因为这个函数进不去,emo了一下午。实际上就是因为函数声明和定义的地方漏了个const关键字。 1.正确✔: QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) cons…

DCASE挑战赛中的声音事件检测与定位(SELD)子任务介绍

DCASE(Detection and Classification of Acoustic Scenes and Events)系列挑战赛包含多个与声音计算相关的子任务,以DCASE2023为例,其包含如下七个与声音计算相关的任务。 (source:DCASE challenge website) 声音事件…

ChatGPT配合两款神器,1分钟生成流程图

流程图,工作上再正常不过的一种图形,常见制图方法对比: 传统手动制图:耗时耗力,迁移性差AI 辅助制图:使用自然语言提出需求,零基础快速制图 几款常见的我在用的在线绘图工具推荐: Pr…

火山引擎DataLeap的Catalog系统搜索实践(三):Learning to rank与后续工作

Learning to rank Learning to rank主要分为数据收集,离线训练和在线预测三个部分。搜索系统是一个Data-driven system,因此火山引擎DataLeap的Catalog系统设计之初就需要考虑数据收集。收集的数据可以用来评估和提升搜索的效果。数据收集和在线预测前面…

基于国民技术N32G435的FLASH读写测试

一、测试工具: 1.国民技术N32G43XCL-STB开发板----主控为N32G435CB 2.创芯工坊PW200加密离线烧录器 3.PowerWriter上位机,配合PW200查看FLASH数据。 4.keil5 二、测试背景 现在很多的应用中都需要保存离线数据,例如一些传感器的校正数…

基于C#制作一个鼠标连点器

秒杀抢券、压枪换弹都是网上冲浪的基本操作,制作一个鼠标连点器,从此在互联网所向披靡。 一、项目搭建1.1、创建1.2、界面设计 二、功能实现2.1、类型库调用2.2、窗口句柄定义2.3、线程处理2.4、快捷键 一、项目搭建 1.1、创建 打开Visual Studio,右侧选择创建新项…

ARM体系结构和RAM的工程搭建、程序编写

目录 工程搭建 程序编写 带标志位的加法ADC ADCS 跳转指令B\BL 栈的应用->叶子函数的调用过程 栈的应用->非叶子函数的调用过程 异常中断产生指令 协处理器指令 伪操作 安装交叉编译工具 Makefile 宏定义 预编译指令 申请一个字的空间 .word 申请多个字节空间 嵌套编程 方…

如何查询期刊的SCI分区

好消息是CSDN AI写作助手上线了 我不用自己一个字一个字去写SCI分区是啥(x) 然而—— 麻了还是自己写吧, 在人工智能这条路上,CSDN还是需要努力。 简单来说,我们做科研、发文章,肯定是需要比较的 谁的…

记录一次Mysql死锁事件(由Insert与uniqueKey导致)

| 导语记录一次于2023年01月23日遇到的死锁问题。 1、基础 1.1 数据库隔离级别 1.1.1RC READ COMMITTED:只能读取已经提交的数据;此时:允许幻读和不可重复读,但不允许脏读,所以RC隔离级别要求解决脏读; 1.1…

Mac下通过Docker安装ElasticSearch集群

1、安装ElasticSearch 使用docker直接获取es镜像,执行命令docker pull elasticsearch:7.7.0 执行完成后,执行docker images即可看到上一步拉取的镜像。 2、创建数据挂在目录,以及配置ElasticSearch集群配置文件 创建数据文件挂载目录 mkdir -…

如何快速掌握Facebook运营+独立站运营基础?

在当今数字化时代,Facebook运营和独立站运营成为许多企业和个人创业者的关键战略。通过巧妙地结合这两个渠道,你可以有效地推广品牌、吸引目标受众并实现商业目标。本文将为你介绍如何快速掌握Facebook运营和独立站运营的基础知识,为你的业务…

微服务组件之Eureka

1、什么是Eureka,为什么要有Eureka 在传统的RPC远程调用中,管理每个服务于服务之间依赖关系复杂,管理复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等&#xf…