MySQL 如何实现将数据实时同步到 ES ?

news2024/11/25 8:35:35

引言:在现代应用程序开发中,通常会将数据存储在 MySQL 中,用于事务性处理和数据持久化。而 Elasticsearch(ES)则是一种专门用于全文搜索和分析的强大工具。将这两者结合使用的一个常见需求是实时将 MySQL 中的数据同步到 Elasticsearch 中,以实现高效的数据检索和分析功能。本文将探讨几种常见的实现方案和技术选型。

题目

MySQL 如何实现将数据实时同步到 ES ?

推荐解析

引言

在日常的开发中,我们一般会使用 MySQL 来作为数据的存储,然后 ES 来实现全文的数据检索以及特殊查询,那么这个时候就会有一个问题,我们 MySQL 如何实时将数据同步到 ES 中呢?我们接下来来盘点一下。

解决方案

1. 数据双写

这个方案应该是比较常用的,即在写入数据的时候,先将数据写入 MySQL 然后在将数据写入 ES,这种方案实现起来比较简单,但是如果你在写入 MySQL 之后,服务发生了宕机,这个时候就可能产生不一致的情况,这个时候就可能需要重新进行写入。

伪代码如下:

/**
  * 新增商品
*/
@Transactional(rollbackFor = Exception.class)
public void addGoods(GoodsDto goodsDto) {
    //1、保存Mysql
    Goods goods = new Goods();
    BeanUtils.copyProperties(goodsDto,goods);
    GoodsMapper.insert();
    
    //2、保存ES
    IndexRequest indexRequest = new IndexRequest("goods_index","_doc");
    indexRequest.source(JSON.toJSONString(goods), XContentType.JSON);
    indexRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
    highLevelClient.index(indexRequest);
}

这个方案的优缺点如下:

  • 优点:

    • 实现起来逻辑简单,而且实时性较高
  • 缺点

    • 硬编码问题严重,并且业务耦合程度高
    • 如果服务或者 Elasticsearch 发生宕机情况,就有数据丢失的风险
2. MQ 异步同步

这个思路应该是大家比较容易想到的,就是在执行完 MySQL 的写入操作之后,将操作交给 MQ,然后通过 MQ 告诉 ES 需要进行数据的同步。

这个方案优缺点如下:

  • 优点:

    • 这个方案最直接的点就是性能高,并且实现了业务的解耦合,并且可以利用 MQ 的重试机制,在写入失败的时候进行重试,降低了数据丢失的风险。
    • 这样还支持多个数据源的写入,提高了扩展性,不会出现由于单个数据源写入异常从而导致其他数据源写入受到影响的问题。
  • 缺点:

    • 硬编码问题,在接入新的数据源的时候需要实现新的消费者代码,代码侵入性较强
    • 引入了消息队列,提高了运维的成本,增加了系统的复杂程度
    • 可能出现延时问题,因为消息队列是异步消费模型,用户写入的数据不一定可以马上看到结果,有一定的延迟。
3. 基于 Binlog 实现数据同步

上面的这两个方案总结下来就两个问题,第一个问题就是硬编码并且代码侵入性较强,另外一个点就是没有办法实现数据的实时同步,那么有没有其他方案,答案肯定是有的,那就是利用 MySQL 的 Binlog 日志来实现数据同步,如下图所示:

具体步骤如下:

  • 优点:

    • 没有代码侵入,没有硬编码
    • 原有的系统没有任何变化,可以实现无感知,性能较高
    • 业务解耦合,这个和消息队列是差不多实现思路的,不过这个不需要关注原来系统的业务实现
  • 缺点:

    • 如果采用 MQ 消费解析 Binlog 日志的话,又会回到方案二引入消息队列产生的问题

针对以上方案,我们可以使用一种新的解决方案,就是阿里巴巴开源的 Canal 中间件。

Canal 方案

什么是 Canal ?

Canal:译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。

说白了就是,根据 MySQL 的 BinLog 日志进行增量同步数据。要理解 Canal 的原理,就要先了解 MySQL 的主从复制原理,如下:

  1. MySQL 所有的增删改操作都会进入MySQL 主从复杂的主节点,即 Master 节点。
  2. Master 节点会生成 Binlog 日志文件,每次操作 MySQL 数据库就会记录到 Binlog 日志文件中。
  3. Slave 节点会订阅 Master 节点的 Binlog 日志,以增量备份的形式同步数据到 Slave 数据。
Canal 同步流程

Canal 的原理就是伪装成 MySQL主从复制的从节点(Slave 节点),从而订阅 MySQL主节点的 Binlog日志,主要流程如下:

  1. Canal 服务端向 MySQL 的 Master 节点传输 Dump 协议
  2. MySQL 的 Master 节点接收到 Dump 请求后推送 Binlog日志给 Canal 服务端,解析 Binlog 日志对象(原始为字节流对象),然后转换成 JSON 数据格式
  3. Canal 客户端通过 TCP 协议或 MQ 形式监听 Canal 服务端,然后将同步数据到ES,到此,同步过程就完成了。

总结

1)数据双写是最简单的实现方式,可以最大程度的保证数据的同步写入,不过问题很明显,就是代码侵入性太强了,而且容易因为中间件故障导致写入失败。

2)**MQ 异步同步,**这个方案引入了消息队列,实现了业务的解耦合,而且性能较高,吞吐量也比较大,并且支持多数据源的数据同步,不过由于 MQ 是异步消费模型,所以可能出现数据同步延迟的情况,所以实时性要求比较高的场景可能没办法实现。

3)**基于 Binlog 日志实现,**主要原理就是通过监听 MySQL 的 Binlog 日志数据实现增量数据同步,这个方案其基本不会产生代码侵入,而且数据同步的实时性也有一定的保障,不过弊端也比较明显,就是 Binlog 系统的实现可能较为复杂,所以可以考虑使用第三方日志同步组件,最典型的实现就是 Canal 实现。

其他补充

鱼聪明 AI 的回答:

鱼聪明 AI 地址:https://www.yucongming.com/

使用 Canal 进行 MySQL 到 Elasticsearch 数据同步具有多方面的好处,同时也可能面临一些潜在的问题。让我们详细来看一下。

好处

  1. 实时性高: Canal 可以实时监听 MySQL 的 Binlog 日志变更,将变更数据迅速同步到 Elasticsearch。这种实时性能够满足许多对数据更新要求较高的场景,如搜索引擎、实时分析等。
  2. 无代码侵入: 使用 Canal 进行数据同步,不需要在应用程序中添加额外的写入逻辑或代码。它作为一个独立的服务监听 Binlog,对原有系统没有侵入性,不会修改原有的业务逻辑。
  3. 减少系统负担: 相比于直接在应用程序中实现数据双写或通过消息队列进行异步同步,Canal 可以减少数据库的负担。它直接监听 Binlog,而不需要额外的数据库读取操作,因此对数据库性能的影响较小。
  4. 支持增量同步: Canal 的核心功能是基于 MySQL 的增量日志(Binlog)进行数据同步。这意味着可以精确捕获每一次数据变更,避免了全量同步的性能瓶颈和数据一致性问题。
  5. 灵活性和可扩展性: Canal 支持多种数据源的同步,并且可以配置多个消费端,从而提高了系统的扩展性和灵活性。可以根据具体需求灵活配置同步的规则和目标。
  6. 开源社区支持: Canal 是阿里巴巴开源的项目,在社区中有较为活跃的维护和支持,可以从社区中获取到丰富的文档、问题解答和更新。

可能产生的问题

尽管使用 Canal 可以带来诸多好处,但也有一些可能的问题需要注意:

  1. 性能消耗: Canal 需要实时监听 MySQL 的 Binlog,并且将数据转发到目标系统(如 Elasticsearch)。在高并发或大数据量的情况下,可能会对服务器资源(CPU、内存、网络带宽)造成一定压力。
  2. 部署和维护复杂性: Canal 作为一个独立的服务需要单独部署和维护,这增加了系统的复杂性和运维成本。特别是在需要监控、调优和升级时,可能需要专门的运维人员或团队来管理。
  3. 数据一致性: 尽管 Canal 本身是为了实现数据同步而设计的,但在实际应用中,仍然需要注意数据一致性的问题。特别是在网络传输或数据处理过程中可能出现的中断、延迟或错误,都有可能导致数据同步的不一致。
  4. 版本兼容性: Canal 的版本更新可能会引入新的功能或修复问题,但同时也可能带来与现有环境不兼容的风险。在升级 Canal 版本时需要谨慎测试和规划,以确保不影响现有业务的稳定性。
  5. 安全性: Canal 需要连接到 MySQL 数据库获取 Binlog 日志,因此在安全设置方面需要注意,确保 Canal 的访问权限受到正确的限制和保护,避免因权限问题导致的安全风险。

综上所述,使用 Canal 进行 MySQL 到 Elasticsearch 的数据同步是一种高效、实时的解决方案,但需要在性能、部署复杂性、数据一致性和安全性等方面进行综合考量和管理。

欢迎交流

本文主要介绍 MySQL 同步数据到 ES,一些主流的解决方案,以及如何利用开源中间件去提高性能,在文末还有三个问题关于数据同步,欢迎小伙伴在评论区进行留言!近期面试鸭小程序已全面上线,想要刷题的小伙伴可以积极参与!

1)数据一致性问题是否会影响你的应用?

2)你的系统是否能够处理高吞吐量的数据同步?

3)你如何管理和调优数据同步解决方案的部署复杂性?

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

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

相关文章

JAVA导出数据库字典到Excel

文章目录 1、查询某张表字段信息2、TableVo接收sql查询得到的数据3、excel导出4、导出案例 1、查询某张表字段信息 select column_name as columnName, -- 字段名 COLUMN_DEFAULT as colDefault, -- 默认值 column_key as columnKey, -- PRI-主键,UNI-唯一键&…

新能源组合灶,一灶两用(电燃灶+电陶炉),电生明火,无需燃料

在科技日新月异的今天,厨房电器的创新不断为我们的生活带来便捷与惊喜。华火新能源电燃灶,以其独特的设计和卓越的性能,成为未来厨房的首选,为您打造全新的烹饪体验。 中国人的烹饪文化源远流长,讲究火候的掌控和明火烹…

linux centos tomcat 不安全的HTTP请求方法

1、页面查看 2、在linux主机可使用此命令查看 curl -v -X OPTIONS http://实际地址 3、进入tomcat conf目录vim web.xml&#xff0c;增加以下内容 <!-- close insecure http methods --> <security-constraint><web-resource-collection><web-resource…

Java SpringBoot MongoPlus 使用MyBatisPlus的方式,优雅的操作MongoDB

Java SpringBoot MongoPlus 使用MyBatisPlus的方式&#xff0c;优雅的操作MongoDB 介绍特性安装新建SpringBoot工程引入依赖配置文件 使用新建实体类创建Service测试类进行测试新增方法查询方法 官方网站获取本项目案例代码 介绍 Mongo-Plus&#xff08;简称 MP&#xff09;是一…

AI写作神器大揭秘:五款你不可错过的AI写作工具

在现实生活中&#xff0c;除了专业的文字工作者&#xff0c;各行各业都避免不了需要写一些东西&#xff0c;比如策划案、论文、公文、讲话稿、总结计划……等等。而随着科技的进步&#xff0c;数字化时代的深入发展&#xff0c;AI已经成为日常工作中必不可少的工具了&#xff0…

Cesium 立式雷达扫描

Cesium 立式雷达扫描 自定义 Primitive 实现支持水平和垂直交替扫描

WebKey备受瞩目的Web3.0新叙事,硬件与加密生态完美融合特性成为数字世界的新入口

在当今迅速发展的科技领域&#xff0c;Web3.0正在引领一场颠覆性的变革。而作为这一变革的先锋&#xff0c;WebKey无疑是备受瞩目的创新项目。它不仅代表了一种全新的技术趋势&#xff0c;更是数字世界中硬件与加密生态完美融合的典范。 硬件与加密生态的完美融合 WebKey的核心…

海豚调度监控:新增依赖缺失巡检,上游改动再也不用担心了!

&#x1f4a1; 本系列文章是 DolphinScheduler 由浅入深的教程&#xff0c;涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。 祝开卷有益:) 用过 DolphinScheduler 的小伙伴应该都知道&#xff0c;Dolphin…

Echarts中的折线图,多个Y轴集中在左侧(在Vue中使用多个Y轴的折线图)

简述&#xff1a;在 ECharts 中&#xff0c;创建一个带有多个 Y 轴的折线图&#xff0c;并且将这些 Y 轴都集中显示在图表的左侧&#xff0c;可以通过合理配置 yAxis 和 series 的属性来实现。简单记录 一. 函数代码 drawCarNumEcs() {// 初始化echarts图表,并绑定到id为"…

Vue组件如何“传话”?这里有个小秘诀!

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue-组件通信 目录 Vue组件通信 &#xff08;1&#xff09; props / $emit 1. 父组件向子组件传…

【HDC.2024】探索无限可能:华为云区块链+X,创新融合新篇章

6月23日&#xff0c;华为开发者大会2024&#xff08;HDC 2024&#xff09;期间&#xff0c; “「区块链X」多元行业场景下的创新应用”分论坛在东莞松山湖举行&#xff0c;区块链技术再次成为焦点。本次论坛以"区块链X"为主题&#xff0c;集结了行业专家、技术领袖、…

使用Scrapy进行网络爬取时的缓存策略与User-Agent管理

缓存策略的重要性 缓存策略在网络爬虫中扮演着至关重要的角色。合理利用缓存可以显著减少对目标网站的请求次数&#xff0c;降低服务器负担&#xff0c;同时提高数据抓取的效率。Scrapy提供了多种缓存机制&#xff0c;包括HTTP缓存和Scrapy内置的缓存系统。 HTTP缓存 HTTP缓…

【规范】Git分支管理,看看我司是咋整的

前言 &#x1f34a;缘由 Git分支管理好&#xff0c;走到哪里都是宝 &#x1f3c0;事情起因&#xff1a; 最近翻看博客中小伙伴评论时&#xff0c;发现文章【规范】看看人家Git提交描述&#xff0c;那叫一个规矩一条回复&#xff1a; 本狗亲测在我司中使用规范的好处&#xf…

vue实现左右拖动分屏

效果图如下&#xff1a; 封装组件 <template><div ref"container" class"container"><div class"left-content" :style"leftStyle">/**定义左侧插槽**/<slot name"left"></slot></div>…

接口测试工具Postman

Postman Postman介绍 开发API后&#xff0c;用于API测试的工具。在我们平时开发中&#xff0c;特别是需要与接口打交道时&#xff0c;无论是写接口还是用接口&#xff0c;拿到接口后肯定都得提前测试一下。在开发APP接口的过程中&#xff0c;一般接口写完之后&#xff0c;后端…

SPL-404:如何彻底改变Solana上的NFT与DeFi

在不断发展的数字资产领域中&#xff0c;非同质化Token&#xff08;NFT&#xff09;已成为一股革命性力量&#xff0c;彻底改变了我们对数字所有权的看法和互动方式。从艺术和收藏品到游戏和虚拟房地产&#xff0c;NFT吸引了创作者、投资者和爱好者的想象力。 本指南将带您进入…

【C++】解决 C++ 语言报错:Dangling Pointer

文章目录 引言 悬挂指针&#xff08;Dangling Pointer&#xff09;是 C 编程中常见且危险的错误之一。当程序试图访问指向已释放内存的指针时&#xff0c;就会发生悬挂指针错误。这种错误不仅会导致程序崩溃&#xff0c;还可能引发不可预测的行为和安全漏洞。本文将深入探讨悬…

既美观又方便的后台框架谁需要?进来就对了。

一套既美观又方便的后台框架可以大大幅节约开发时间和成本。 我们来一起看看几个明朗大气的管理控制台页面。 本文档会持续更新 模板编号&#xff1a;翠花_001模板编号&#xff1a;翠花_002模板编号&#xff1a;翠花_003

第3章.中央服务器的物联网模式--AI/ML集成

第3章.中央服务器的物联网模式 本章列出了由于存储和/或计算需求而部署在中央服务器上以及部署在边缘&#xff08;本地&#xff09;或云上的体系结构模式。 这些模式基于现场设备生成的数据提供见解&#xff0c;使用附加数据&#xff08;来自附加系统&#xff0c;如企业系统&am…

嵌入式Linux系统编程 — 6.4 信号集

目录​​​​​​​ 1 信号集概念 2 sigemptyset、sigfillset初始化信号集 3 sigaddset、sigdelset向信号集中添加/删除信号 4 sigismember函数测试信号是否在信号集中 1 信号集概念 在Linux系统中&#xff0c;信号集&#xff08;signal set&#xff09;用于表示一组信号…