MySQL同步ES的6种方案!
引言
在分布式架构中,MySQL与Elasticsearch(ES)的协同已成为解决高并发查询与复杂检索的标配组合。
然而,如何实现两者间的高效数据同步,是架构设计中绕不开的难题。
这篇文章跟大家一起聊聊MySQL同步ES的6种主流方案,结合代码示例与场景案例,帮助开发者避开常见陷阱,做出最优技术选型。
方案一:同步双写
场景:适用于对数据实时性要求极高,且业务逻辑简单的场景,如金融交易记录同步。
在业务代码中同时写入MySQL与ES。
代码如下:
@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);
}
痛点:
- 硬编码侵入:所有涉及写操作的地方均需添加ES写入逻辑。
- 性能瓶颈:双写操作导致事务时间延长,TPS下降30%以上。
- 数据一致性风险:若ES写入失败,需引入补偿机制(如本地事务表+定时重试)。
方案二:异步双写
场景:电商订单状态更新后需同步至ES供客服系统检索。
我们可以使用MQ进行解耦。
架构图如下:

代码示例如下:
// 生产者端
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分析场景。
该方案低侵入但高延迟。
配置示例如下:
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
该方案高实时,并且低侵入。
架构流程如下:

关键配置:
# canal.properties
canal.instance.master.address=127.0.0.1:3306
canal.mq.topic=canal.es.sync
避坑指南:
- 数据漂移:需处理DDL变更(通过Schema Registry管理映射)。
- 幂等消费:通过
_id唯一键避免重复写入。
方案五:DataX批量同步
场景:将历史订单数据从分库分表MySQL迁移至ES。
该方案是大数据迁移的首选。
配置文件如下:
{
"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场景。
代码片段如下:
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 | 毫秒级 | 低 | 极高 | 实时数仓 |
苏三的建议:
- 若团队无运维中间件能力 → 选择Logstash或同步双写
- 需秒级延迟且允许改造 → MQ异步 + 本地事务表
- 追求极致实时且资源充足 → Canal + Flink双保险
最后说一句(求关注,别白嫖我)
如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。
求一键三连:点赞、转发、在看。
关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的50万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。
MySQL同步ES的6种方案!的更多相关文章
- 组建MySQL集群的几种方案
组建MySQL集群的几种方案LVS+Keepalived+MySQL(有脑裂问题?但似乎很多人推荐这个)DRBD+Heartbeat+MySQL(有一台机器空余?Heartbeat切换时间较长?有脑裂 ...
- MySQL集群的几种方案
组建MySQL集群的几种方案LVS+Keepalived+MySQL(有脑裂问题?但似乎很多人推荐这个)DRBD+Heartbeat+MySQL(有一台机器空余?Heartbeat切换时间较长?有脑裂 ...
- mysql 同步数据到 ElasticSearch 的方案
MySQL Binlog 要通过 MySQL binlog 将 MySQL 的数据同步给 ES, 我们只能使用 row 模式的 binlog.如果使用 statement 或者 mixed forma ...
- MySQL冗余数据的三种方案
一,为什么要冗余数据 互联网数据量很大的业务场景,往往数据库需要进行水平切分来降低单库数据量. 水平切分会有一个patition key,通过patition key的查询能够直接定位到库,但是非pa ...
- MySQL 同步复制及高可用方案总结
1.前言 mysql作为应用程序的数据存储服务,要实现mysql数据库的高可用.必然要使用的技术就是数据库的复制,如果主节点出现故障可以手动的切换应用到从节点,这点相信运维同学都是知道,并且可以实现的 ...
- 浅谈MySQL同步到ElasticSearch的几种方式及其优缺点
同步双写 优点:业务逻辑简单. 缺点: 硬编码,有需要写入mysql的地方都需要添加写入ES的代码: 业务强耦合: 存在双写失败丢数据风险: 性能较差:本来mysql的性能不是很高,再加一个ES,系统 ...
- 京东云开发者|mysql基于binlake同步ES积压解决方案
1 背景与目标 1.1 背景 国际财务泰国每月月初账单任务生成,或者重算账单数据,数据同步方案为mysql通过binlake同步ES数据,在同步过程中发现计费事件表,计费结果表均有延迟,ES数据与My ...
- 防止服务器宕机时MySQL数据丢失的几种方案
这篇文章主要介绍了防止服务器宕机时MySQL数据丢失的几种方案,结合实践介绍了Replication和Monitor以及Failover这三个项目的应用,需要的朋友可以参考下. 对于多数应用来说,My ...
- MySQL 到 ES 数据实时同步技术架构
MySQL 到 ES 数据实时同步技术架构 我们已经讨论了数据去规范化的几种实现方式.MySQL 到 ES 数据同步本质上是数据去规范化多种实现方式中的一种,即通过"数据迁移同步" ...
- kettle 多表全删全插同步数据 两种方案
背景: 接到上级指示,要从外网某库把数据全部导入到内网,数据每天更新一次即可,大约几百万条数据,两个库结构一样,mysql的,两台数据库所在服务器都是windows server的,写个java接口实 ...
随机推荐
- Luogu P3177 树上染色 [ 蓝 ] [ 树形 dp ] [ 贡献思维 ]
一道很好的树形 dp !!!!! 树上染色. 错误思路 定义 \(dp[u][i]\) 表示以 \(u\) 为根的子树中,把 \(i\) 个点染成黑色的最大收益. 但这样写,就在转移的时候必须枚举每一 ...
- HT-014 Div3 扫雷 题解 [ 绿 ] [ 二维差分 ]
分析 观察到是曼哈顿距离 \(\le r\) 的范围可以扫到,联想到如下图形: 左边是 \(r=1\) 可以扫到的范围,右边是 \(r=2\) 可以扫到的范围. 于是,我们只要对这样的图形在 \(10 ...
- 保持Android Service在手机休眠后继续运行的方法
保持Android Service在手机休眠后继续运行的方法 下面小编就为大家分享一篇保持Android Service在手机休眠后继续运行的方法,具有很好的参考价值,希望对大家有所帮助.一起跟随 ...
- 饥荒联机版 mod
Extra Equip Slots Extra Equip Slots 额外装备槽:护甲.背包.护符各用各的插槽 Wormhole Marks [DST] Wormhole Marks DST] 相通 ...
- AI回答:一个简洁的php中间件类
<?php class MiddlewareStack { private $middlewares = []; private $request; private $response; /** ...
- Failed to start MySQL 8.0 database server.
原因 在mysql错误日志里出现:The innodb_system data file 'ibdata1' must be writable,字面意思:ibdata1必须可写 查看日志报错,文件夹无 ...
- 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1
环境准备 硬件环境 CPU:intel四代至强及以上,AMD参考同时期产品 内存:800GB以上,内存性能越强越好,建议DDR5起步 显卡:Nvidia显卡,单卡显存至少24GB(用T4-16GB显卡 ...
- Redis 是什么?
Redis 的定义? 百度百科: Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.K ...
- 智能Agent如何改造传统工作流:从搜索到全能助手
智能Agent如何改造传统工作流:从搜索到全能助手 引言:当AI遇上工作流 还记得我们以前搜索信息的方式吗?输入关键词,浏览大量结果,筛选有用内容,再整合成我们需要的答案.这个过程不仅耗时,还常常让人 ...
- 【Web】前端框架对微软老旧浏览器的支持
零.原因 最近要做一个项目,要能在学校机房运行的,也要在手机上运行.电脑和手机,一次性开发,那最好的就是响应式前端框架了.手机和正常的电脑兼容性问题应该都不大,但是学校机房都是Win7的系统,自带的都 ...