MySQL数据同步ES的4种方法,你能想到几种?

2023-11-04

大家好,我是老三,这期给大家分享一个电商中常见的场景——MySQL数据同步Elasticsearch。

商品检索

大家应该都在各种电商网站检索过商品,那么检索商品一般都是通过什么实现呢?搜索引擎Elasticsearch。

那么问题来了,商品上架,数据一般写入到MySQL的数据库中,那么用于检索的数据又是怎么同步到Elasticsearch的呢?

MySQL同步ES

1.同步双写

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

同步双写

对于这种方式:

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

2.异步双写

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

异步双写

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

多维度多条件查询

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

回查完成聚合

这种方式:

  • 优点:
    • 解耦合,商品服务无需关注数据同步
    • 实时性较好,使用MQ,正常情况下,同步完成在秒级
  • 缺点:
    • 引入了新的组件和服务,增加了复杂度

3.定时任务

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

定时任务

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

这种方式:

  • 优点:实现比较简单
  • 缺点:
    • 实时性难以保证
    • 对存储压力较大

4.数据订阅

还有一种方式,就是最时兴的数据订阅。

MySQL通过binlog订阅实现主从同步,各路数据订阅框架比如canal就依据这个原理,将client组件伪装成从库,来实现数据订阅。

MySQL主从同步

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

canal同步数据

但是,和老板了解过,使用canal看起来很美好,帮我们把同步的事情都干了,但其实,还是要写代码。为什么呢?

前面提到的多张表数据聚合,canal的支持没那么好,所以还是得回查。这时候用canal-adapter就不合适了,需要自己实现canal-client,监听和聚合数据,写入ES:

数据订阅+回查

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

所以使用数据订阅:

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

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

Cancal Maxwell Python-Mysql-Rplication
开源方 阿里巴巴 Zendesk 社区
开发语言 Java Java Python
活跃度 活跃 活跃 活跃
高可用 支持 支持 不支持
客户端 Java/Go/PHP/Python/Rust Python
消息落地 Kafka/RocketMQ 等 Kafka/RabbitNQ/Redis 等 自定义
消息格式 自定义 JSON 自定义
文档详略 详细 详细 详细
Boostrap 不支持 支持 不支持

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



参考:

[1]. https://www.infoq.cn/article/1afyz3b6hnhprrg12833

[2].https://www.iamle.com/archives/2900.html

[3].https://blog.51cto.com/lianghecai/4755693

[4].https://qinyuanpei.github.io/posts/1333693167/

[5].https://github.com/alibaba/canal/wiki/ClientAdapter


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL数据同步ES的4种方法,你能想到几种? 的相关文章

  • PHP 选择后立即删除

    我有一个 PHP 服务器脚本 它从 MySQL 数据库中选择一些数据 一旦我将 mysql query 和 mysql fetch assoc 的结果存储在我自己的局部变量中 我就想删除我刚刚选择的行 这种方法的问题在于 PHP 似乎对我的
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • 需要仅返回 Elasticsearch 中具有完整父主体的匹配嵌套对象

    我在我的项目中使用 Elastic search 1 7 版本 我有一个名为colleges在该索引下有一个嵌套索引名称courses像这样 name College Name university University Name city
  • MySQL Connector/C++ 库链接错误问题

    PROBLEM 好吧 我一直在尝试遵循 MySQL Forge Wiki 和其他一些网站上的示例代码 这些网站提供了有关如何获得简单数据库连接的教程 但由于某种原因 我的项目总是因链接错误而失败 我可以我自己不明白为什么或如何解决它 我仍在
  • MySQL 使用 ALTER IGNORE TABLE 出现重复错误

    我的 MySQL 中有一个有重复项的表 我尝试删除重复项并保留一项 我没有主键 我可以通过以下方式找到重复项 select user id server id count as NumDuplicates from user server
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber
  • 如何正确转义mysql?

    我刚刚发现如果我写 select from tbl where name like foo 然后添加 foo 作为参数及其值 a 用户数据 它不会正确转义 我勒个去 它想要 a 即使我使用参数 我还是忍不住觉得我对 sql 注入持开放态度
  • 无法通过套接字“/var/lib/mysql/mysql.sock”连接到本地 MySQL 服务器 (2)

    当我尝试连接 mysql 时出现以下错误 Can t connect to local MySQL server through socket var lib mysql mysql sock 2 这个错误有解决办法吗 其背后的原因可能是什
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • MySQL MIN/MAX 所有行

    我有桌子Races与行ID Name and TotalCP 我选择分钟 TotalCP FROM Races 但是我想选择具有最小值的整行 我如何在单个查询中做到这一点 从聚合值获取整行的一般形式是 SELECT FROM Races W
  • Mysql 创建定义器

    我创建了一个在 CentOS Web 服务器上运行的 Intranet Web 应用程序 该应用程序使用另一个本地服务器 始终是 CentOS 作为 MySQL 数据库 在数据库内部我创建了例程 这些例程总是这样开始 CREATE DEFI
  • 免费 PHP 登录库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何将ElasticSearch与MySQL集成?

    在我的一个项目中 我计划将 ElasticSearch 与 MySQL 结合使用 我已经成功安装ElasticSearch 我可以单独管理ES中的索引 但我不知道如何用 MySQL 实现同样的功能 我读过一些文件 但我有点困惑 没有明确的想
  • MySQL 查询到 CSV [重复]

    这个问题在这里已经有答案了 有没有一种简单的方法来运行MySQL查询来自linux命令行并以csv格式输出结果 这就是我现在正在做的事情 mysql u uid ppwd D dbname lt lt EOQ sed e s g tee l
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • SonarQube 进程已退出,退出值 [es]:137

    我想在我的 vps linux x86 64 debian 9 上安装声纳 但是当我执行这个 cdm sonar sh 控制台时 我有以下日志 Running SonarQube wrapper gt Wrapper Started as
  • 一次从多个表中删除行

    我正在尝试将 2 个查询合并为一个这样的查询 result db gt query DELETE FROM menu WHERE name new or die db gt error result db gt query DELETE F
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi

随机推荐

  • 使用vscode搭建vue项目并引用element-ui

    1 环境准备 Visual studio code nodejs vue cli yarn 2 新建项目 1 打开Visual studio code 打开一个你想要创建项目的文件夹 2 打开集成终端如下图所示或者使用快捷键 3 在终端中输
  • LevelDB.NET 使用

    LevelDB是google实现的非常高效的kv数据库 多数是和redis比较 这里记录下如何使用 新建项目 Nuget添加类库 通过反编译发现运行时是 NET 4 0 这里我用4 5测试需要选择64位平台 代码 写数据 db Put Wr
  • python3排序 sorted(key=lambda)

    python3排序sorted key lambda 当待排序列表的元素由多字段构成时 我们可以通过sorted iterable key reverse 的参数key来制定我们根据那个字段对列表元素进行排序 key lambda 元素 元
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • StringBuilder.append()与String的"+"的效率PK

    如果String通过 来拼接 如果拼接的字符串是常量 则效率会非常高 因为会进行编译时优化 这个时候StringBuilder的append 是达不到的 如果将String的 放在循环中 会创建很多的StringBuilder对象 并且执行
  • 信贷风控中Vintage、滚动率、迁移率的理解

    风控业务背景 信贷风险管理是一门艺术 更是一门科学 资产质量分析中常会涉及到三个理论 账龄分析 Vintage Analysis 用以分析账户成熟期 变化规律等 滚动率分析 Roll Rate Analysis 用以定义账户好坏程度 迁移率
  • 未解决,fsmgmt.msc共享文件夹管理中,文件夹无属性选项

    之前用的win10家庭版 都没有fsmgmt msc 现在升级成专业版发现没有属性 https jingyan baidu com article 358570f69e9b13ce4724fce9 html 我的电脑
  • windows下redis设置redis开机自启动方法

    1 查看一下Redis服务是否注册 1 Win R快捷键输入services msc 然后回车或者点击确定 2 win10桌面 此电脑 右键单击 管理 gt 服务与应用程序 gt 服务 此处输入R 即可看到R开头的服务列表 在没有添加服务的
  • IDEA+Springboot+Git+jenkins+tomcat实现自动部署-基本流程

    jenkins构建 前言 测试项目准备 一 jenkins构建一个新项目 把Gitee仓库的项目获取到本地打包运行 二 jenkins构建一个新项目 把Gitee仓库的项目获取到本地打包 通过Publish Over SSH传输到另外一台机
  • 《在IDEA中配置MySQL的驱动程序》

    一 下载mysql connecter 下载地址 http dev mysql com downloads connector j 具体步骤已在下图中标注 注意是下载zip压缩包格式 因为解压缩安装很方便 下载完成后得到压缩包如下 二 安装
  • 深度详解ResNet到底在解决一个什么问题?

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 https www zhihu com question 64494691 本文仅作为学术分享 如果侵权 会删文处理 最近看到不少ResNet的变体 比如ResNeSt
  • 【软考】-高项-整合管理-重要知识点思维导图

    整合管理 文章目录 整合管理 含义 内容 项目管理计划 含义 组件 开工 会议 分类 目的作用 如何召开高效会议 批准的变更请求 可交付成果 工作绩效数据 变更的流程 1 提出与记录变更申请 2 初审变更 初审目的 常见方式为变更申请文档的
  • 实例分割模型Mask R-CNN详解:从R-CNN,Fast R-CNN,Faster R-CNN再到Mask R-CNN

    Mask R CNN是ICCV 2017的best paper 彰显了机器学习计算机视觉领域在2017年的最新成果 在机器学习2017年的最新发展中 单任务的网络结构已经逐渐不再引人瞩目 取而代之的是集成 复杂 一石多鸟的多任务网络模型 M
  • React黑马视频自学笔记02

    14 react事件处理 14 1事件绑定 语法 on 事件名称 事件处理程序 比如 onClick gt 注意 React事件采用驼峰命名法 比如 onMouseEnter onFocus 函数组件绑定事件的时候不用this 14 2事件
  • 监控Oracle(oracledb_exporter)

    我们以监控Oracle为例 目前仅有x86版本 可以下载源码针对不同环境使用golang环境自己编译 监控什么指标下载对应系统的exporter插件 统一下载地址 https prometheus io download 监控指标对应的gr
  • 解决实际问题的ES6代码段

    1 如何隐藏所有指定元素 const hide el gt el forEach e gt e style display none Example hide document querySelectorAll img 隐藏页面上的所有 元
  • Ubuntu搭建Qt环境

    1 ubuntu搭建qt环境的好处 ubuntu上可以安装qtcrater 然后一键下载到板子上 不需要手动编译 2 安装linux版本的qtcreater 注意 必须要先安装g 再安装qtcreater 否则会出问题 下载g 编译器 su
  • html实现文字滚动

    要在HTML中实现文字滚动 您可以使用
  • Python实现串口通信(pyserial)

    Python实现串口通信 pyserial pyserial模块封装了对串口的访问 兼容各种平台 安装 pip insatll pyserial 初始化 简单初始化示例 import serial ser serial Serial com
  • MySQL数据同步ES的4种方法,你能想到几种?

    大家好 我是老三 这期给大家分享一个电商中常见的场景 MySQL数据同步Elasticsearch 大家应该都在各种电商网站检索过商品 那么检索商品一般都是通过什么实现呢 搜索引擎Elasticsearch 那么问题来了 商品上架 数据一般