前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL同步ES的6种方案!

MySQL同步ES的6种方案!

作者头像
苏三说技术
发布于 2025-05-06 05:49:24
发布于 2025-05-06 05:49:24
52600
代码可运行
举报
文章被收录于专栏:苏三说技术苏三说技术
运行总次数:0
代码可运行

大家好,我是苏三,又跟大家见面了。

引言

在分布式架构中,MySQLElasticsearch(ES)的协同已成为解决高并发查询与复杂检索的标配组合。

然而,如何实现两者间的高效数据同步,是架构设计中绕不开的难题。

这篇文章跟大家一起聊聊MySQL同步ES的6种主流方案,结合代码示例与场景案例,帮助开发者避开常见陷阱,做出最优技术选型。

方案一:同步双写

场景:适用于对数据实时性要求极高,且业务逻辑简单的场景,如金融交易记录同步。

在业务代码中同时写入MySQL与ES。

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Transactional  
public void createOrder(Order order) {  
    // 写入MySQL  
    orderMapper.insert(order);  
    // 同步写入ES  
    IndexRequest request = new IndexRequest("orders")  
        .id(order.getId())  
        .source(JSON.toJSONString(order), XContentType.JSON);  
    client.index(request, RequestOptions.DEFAULT);  
}

痛点

  1. 硬编码侵入:所有涉及写操作的地方均需添加ES写入逻辑。
  2. 性能瓶颈:双写操作导致事务时间延长,TPS下降30%以上。
  3. 数据一致性风险:若ES写入失败,需引入补偿机制(如本地事务表+定时重试)。

方案二:异步双写

场景:电商订单状态更新后需同步至ES供客服系统检索。

我们可以使用MQ进行解耦。

架构图如下

代码示例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 生产者端  
public void updateProduct(Product product) {  
    productMapper.update(product);  
    kafkaTemplate.send("product-update", product.getId());  
}  

// 消费者端  
@KafkaListener(topics = "product-update")  
public void syncToEs(String productId) {  
    Product product = productMapper.selectById(productId);  
    esClient.index(product);  
}

优势

  • 吞吐量提升:通过MQ削峰填谷,可承载万级QPS。
  • 故障隔离:ES宕机不影响主业务链路。

缺陷

  • 消息堆积:突发流量可能导致消费延迟(需监控Lag值)。
  • 顺序性问题:需通过分区键保证同一数据的顺序消费。

方案三:Logstash定时拉取

场景:用户行为日志的T+1分析场景。

该方案低侵入但高延迟。

配置示例如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
input {
jdbc{
    jdbc_driver=>"com.mysql.jdbc.Driver"
    jdbc_url=>"jdbc:mysql://localhost:3306/log_db"
    schedule=>"*/5 * * * *"# 每5分钟执行  
    statement=>"SELECT * FROM user_log WHERE update_time > :sql_last_value"
}
}
output{
elasticsearch{
    hosts=>["es-host:9200"]
    index=>"user_logs"
}
}

适用性分析

  • 优点:零代码改造,适合历史数据迁移
  • 致命伤
    • 分钟级延迟(无法满足实时搜索)
    • 全表扫描压力大(需优化增量字段索引)

方案四:Canal监听Binlog

场景:社交平台动态实时搜索(如微博热搜更新)。 技术栈:Canal + RocketMQ + ES

该方案高实时,并且低侵入。

架构流程如下

关键配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# canal.properties  
canal.instance.master.address=127.0.0.1:3306  
canal.mq.topic=canal.es.sync

避坑指南

  1. 数据漂移:需处理DDL变更(通过Schema Registry管理映射)。
  2. 幂等消费:通过_id唯一键避免重复写入。

方案五:DataX批量同步

场景:将历史订单数据从分库分表MySQL迁移至ES。

该方案是大数据迁移的首选。

配置文件如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{  
"job":{
    "content":[{
      "reader":{
        "name":"mysqlreader",
        "parameter":{"splitPk":"id","querySql":"SELECT * FROM orders"}
      },
      "writer":{
        "name":"elasticsearchwriter",
        "parameter":{"endpoint":"http://es-host:9200","index":"orders"}
      }
    }]
}
}

性能调优

  • 调整channel数提升并发(建议与分片数对齐)
  • 启用limit分批查询避免OOM

方案六:Flink流处理

场景:商品价格变更时,需关联用户画像计算实时推荐评分。

该方案适合于复杂的ETL场景。

代码片段如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();  
env.addSource(new CanalSource())  
   .map(record -> parseToPriceEvent(record))  
   .keyBy(event -> event.getProductId())  
   .connect(userProfileBroadcastStream)  
   .process(new PriceRecommendationProcess())  
   .addSink(new ElasticsearchSink());

优势

  • 状态管理:精准处理乱序事件(Watermark机制)
  • 维表关联:通过Broadcast State实现实时画像关联

总结:

对于文章上面给出的这6种技术方案,我们在实际工作中,该如何做选型呢?

下面用一张表格做对比:

方案

实时性

侵入性

复杂度

适用阶段

同步双写

秒级

小型单体项目

MQ异步

秒级

中型分布式系统

Logstash

分钟级

离线分析

Canal

毫秒级

高并发生产环境

DataX

小时级

历史数据迁移

Flink

毫秒级

极高

实时数仓

苏三的建议

  1. 若团队无运维中间件能力 → 选择Logstash或同步双写
  2. 需秒级延迟且允许改造 → MQ异步 + 本地事务表
  3. 追求极致实时且资源充足 → Canal + Flink双保险
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 苏三说技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【技术选型】Mysql和ES数据同步方案汇总
在实际项目开发中,我们经常将Mysql作为业务数据库,ES作为查询数据库,用来实现读写分离,缓解Mysql数据库的查询压力,应对海量数据的复杂查询。
终有救赎
2023/12/14
2.1K0
【技术选型】Mysql和ES数据同步方案汇总
MySQL数据实时同步到Elasticsearch的高效解决方案
在实际的项目开发与运维过程中,MySQL 常常扮演着业务数据库的核心角色,以其强大的事务处理能力和数据完整性保障,支撑着系统的稳定运行。然而,随着数据量的急剧增长和查询复杂度的不断提升,单一依赖 MySQL 进行高效的数据检索显得日益吃力,尤其是在面对海量数据的复杂查询场景时,性能瓶颈愈发凸显。
用户1220090
2025/02/05
2470
MySQL数据实时同步到Elasticsearch的高效解决方案
基于 Flink SQL CDC 的实时数据同步方案
Flink 1.11 引入了 Flink SQL CDC,CDC 能给我们数据和业务间能带来什么变化?本文由 Apache Flink PMC,阿里巴巴技术专家伍翀 (云邪)分享,内容将从传统的数据同步方案,基于 Flink CDC 同步的解决方案以及更多的应用场景和 CDC 未来开发规划等方面进行介绍和演示。
Spark学习技巧
2020/11/09
3.9K0
基于 Flink SQL CDC 的实时数据同步方案
优秀的技术选型(摘选)
1. 优秀的技术选型(摘选) 1.1. 缓存 redis因为是单线程,不适合高耗时操作,对数据量比较大的缓存还是memcached比较合适 1.2. 分库分表 sharding-jdbc,驱动层,不需要额外机器 mycat,代理层,如果有运维团队,又舍得机器可以用这个 1.3. 数据同步 mysql在分库分表时,要做的一个重要操作,数据迁移 对mysql来说,canal是国内用的最多的方案,其次databus canal、maxwell等支持将要同步的数据写入mq,后续处理方便 ETL(抽取,清洗,转换),
老梁
2019/09/11
6840
开源数据同步神器——canal
如今大型的IT系统中,都会使用分布式的方式,同时会有非常多的中间件,如redis、消息队列、大数据存储等,但是实际核心的数据存储依然是存储在数据库,作为使用最广泛的数据库,如何将mysql的数据与中间件的数据进行同步,既能确保数据的一致性、及时性,也能做到代码无侵入的方式呢?如果有这样的一个需求,数据修改后,需要及时的将mysql中的数据更新到elasticsearch,我们会怎么进行实现呢?
itmifen
2019/03/06
2.4K0
开源数据同步神器——canal
ActionOMS | 从 OceanBase 到实时数仓:数据同步如何助力业务优化
在当今数字化时代,实时数仓技术已广泛应用于众多企业,成为支持业务决策的关键因素。金融机构需实时监控风险,电商平台要动态推荐商品,制造业则依靠实时数据优化生产链。在这些场景中,及时获取数据库增量记录至关重要,其同步效率直接影响分析的实时性和精准度。
爱可生开源社区
2024/11/26
2200
ActionOMS | 从 OceanBase 到实时数仓:数据同步如何助力业务优化
MySQL数据同步Elasticsearch的4种方法!
今天给大家分享一个电商中常见的场景——MySQL数据同步Elasticsearch。
Jensen_97
2023/07/20
7620
MySQL数据同步Elasticsearch的4种方法!
MySQL同步数据到Elasticsearch
随着平台的业务日益增多,基于数据库的全文搜索查询速度较慢,已经无法满足需求。所以,决定基于Elasticsearch 做一个全文搜索平台,支持业务相关的搜索需求。那么第一个问题就是:如何从MySQL同步数据到Elasticsearch?
iiopsd
2022/12/23
5.5K0
MySQL同步数据到Elasticsearch
希望一个数据同步,包治百病
大多数情况下,应用架构设计不好,引入什么新存储,引入什么DDD,治标不治本,都是扯淡。
xjjdog
2019/07/10
1.9K1
希望一个数据同步,包治百病
基于CDC技术的ElasticSearch索引同步机制
ElasticSearch作为一个基于Lucene的搜索引擎被广泛应用于各种应用系统,比如电商、新闻类、咨询类网站。在使用ElasticSearch开发应用的过程中,一个非常重要的过程是将数据导入到ElasticSearch索引中建立文档。在一开始系统规模比较小时,我们可以使用logstash来同步索引。logstash的好处是开方量少,只要进行编写简单的索引模板和同步sql,就能快速搭建索引同步程序。但是随着应用数据规模的变大,索引变化变得非常频繁。logstash的缺点也随着暴露,包括(1)不支持删除,只能通过修改字段属性软删除,随着应用使用时间的增长,ElasticSearch中会留存大量的无用数据,拖慢搜索速度。(2)sql分页效率低,sql查询慢。logstash的分页逻辑是先有一个大的子查询,然后再从子查询中分页获取数据,因此效率低下,当数据库数据量大时,一个分页查询就需要几百秒。同步几千万数据可能需要1天时间。因此我们决定放弃使用logstash,而改用使用canal来搭建基于CDC技术的ElasticSearch索引同步机制。
用户2781897
2020/11/02
1.2K0
大厂咋做多系统数据同步方案的?
业务线与系统越来越多,系统或业务间数据同步需求也越频繁。当前互联网业务系统大多MySQL数据存储与处理方案:
JavaEdge
2024/05/26
2.2K0
大厂咋做多系统数据同步方案的?
基于 Kafka 与 Debezium 构建实时数据同步
在进行架构转型与分库分表之前,我们一直采用非常典型的单体应用架构:主服务是一个 Java WebApp,使用 Nginx 并选择 Session Sticky 分发策略做负载均衡和会话保持;背后是一个 MySQL 主实例,接了若干 Slave 做读写分离。在整个转型开始之前,我们就知道这会是一块难啃的硬骨头:我们要在全线业务飞速地扩张迭代的同时完成架构转型,因为这是实实在在的”给高速行驶的汽车换轮胎”。
PHP开发工程师
2021/05/08
2.7K0
基于 Kafka 与 Debezium 构建实时数据同步
58同城 Elasticsearch 应用及平台建设实践
导读:Elasticsearch是一个分布式的搜索和分析引擎,可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch基于Lucene开发,现在是使用最广的开源搜索引擎之一。Elasticsearch可以应用于在/离线日志流水、用户标签画像、数据库二级缓存、安全风控行为数据、图数据库索引、监控数据、Wiki文档检索等应用场景。58同城有自己的主搜,而一些内部创新搜索业务和大规模的数据实时OLAP ( On-Line Analytical Processing,联机分析处理 ) 则是使用Elasticsearch。
week
2020/07/20
9580
58同城 Elasticsearch 应用及平台建设实践
.NET 5.0 快速开发框架 千万级数据处理 解决方案
源码github:https://github.com/linbin524/yc.boilerplate
郑子铭
2021/10/26
1.1K0
.NET 5.0 快速开发框架 千万级数据处理 解决方案
常见的10种 CDC 组件和方案
总结一下,本文介绍了10种常见的 CDC 组件和方案,个人觉得还不错,如果还有其他好用的 CDC 组件,欢迎在评论区分享分享。
lyb-geek
2024/04/18
3.6K0
常见的10种 CDC 组件和方案
一文带你玩转数据同步方案
停机迁移包括停服迁移与非停服迁移,停服迁移是选择某一时间点流量最少时停止所有服务,并在最短时间内完成数据迁移,此时需要注意停服时间;非停服迁移,即停止所有写数据服务,查询服务并不停止,同样要注意停服时间,防止对生产环境有较大影响。停机迁移完成后,还需要进行数据核对,通常首先要校验迁移前后数据量是否一致,其次还可对迁移前后数据逐条进行校验,还可进行流量回放,保证迁移前后业务表现完全一致。
lyb-geek
2024/04/18
6220
一文带你玩转数据同步方案
各种开源数据库同步工具汇总
Oracle GoldenGate 是一款实时访问、基于日志变化捕捉数据,并且在异构平台之间迚行数据传输的产品。GoldenGate TDM是一种基于软件的数据复制方式,它从数据库的日志解析数据的变化(数据量只有日志的四分之一左右)。GoldenGate TDM将数据变化转化为自己的格式,直接通过TCP/IP网络传输,无需依赖于数据库自身的传递方式,而且可以通过高达10:1的压缩率对数据迚行压缩,可以大大降低带宽需求。在目标端,GoldenGate TDM可以通过交易重组,分批加载等技术手段大大加快数据投递的速度和效率,降低目标系统的资源占用,可以在亚秒级实现大量数据的复制,并且目标端数据库是活动的。
全栈程序员站长
2022/07/21
10.7K1
MySQL如何实时同步数据到ES?试试这款阿里开源的神器!
canal主要用途是对MySQL数据库增量日志进行解析,提供增量数据的订阅和消费,简单说就是可以对MySQL的增量数据进行实时同步,支持同步到MySQL、Elasticsearch、HBase等数据存储中去。
用户4172423
2020/11/11
3.5K1
MySQL如何实时同步数据到ES?试试这款阿里开源的神器!
应用接入ES(二)-数据同步ES
上一篇文章《应用接入ES(一)-Springboot集成ES》我们讲述了应用集成ES的方式,以及实现各种查询和更新操作,那么问题就来了,既然是查询和更新,肯定要有数据,数据哪里来?怎么来?
叔牙
2020/11/19
2.1K0
应用接入ES(二)-数据同步ES
基于DTS的大数据同步,如何选择最佳方案?
在《腾讯云数据库DTS发布全新数据集成方案:全增量无缝同步,快速构建实时数仓》一文中,我们介绍了如何使用DTS的「数据同步」服务,将MySQL数据同步到Ckafka并应用于大数据场景中。读者可能会产生疑问:DTS的「数据订阅」服务也提供了类似的功能,那么这两者有何区别,实际使用时应如何选择?为此,本文将为您详细介绍相关内容。
腾讯云数据库 TencentDB
2023/08/03
1.3K0
基于DTS的大数据同步,如何选择最佳方案?
相关推荐
【技术选型】Mysql和ES数据同步方案汇总
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验