MySQL数据高效同步到Elasticsearch的四大方案
目录
引言
一、为什么需要MySQL到ES的同步?
二、四大同步方案对比
三、方案详解与代码实战
1. 应用层双写:简单但强耦合
2. 定时任务同步:可控的准实时
3. Logstash JDBC:离线迁移利器
4. Binlog监听:生产级实时同步(推荐)
四、避坑指南:关键注意事项
五、总结
引言
Elasticsearch(ES)凭借其强大的全文搜索和实时分析能力,已成为现代应用的核心组件。但当数据存储在MySQL时,如何实现高效、可靠的双向同步?本文将深入解析四种主流同步方案,涵盖从简单双写到生产级实时同步的全场景,并提供可落地的代码实现。
官网
一、为什么需要MySQL到ES的同步?
1. 全文搜索:ES支持分词、模糊匹配,弥补MySQL LIKE查询性能差的缺陷
2. 复杂聚合:ES Bucket和Metric聚合实现毫秒级多维分析
3. 数据异构:ES支持嵌套文档、向量搜索等灵活的数据结构
4. 读写分离:将复杂查询流量从MySQL卸载到ES,提升系统整体性能
二、四大同步方案对比
方案 | 实时性 | 数据一致性 | 开发成本 | 适用场景 |
---|---|---|---|---|
应用层双写 | 实时 | 难保证 | 低 | 小型项目,数据量小 |
定时任务同步 | 分钟级 | 最终一致 | 中 | 允许延迟,增量同步场景 |
Logstash JDBC | 小时级 | 最终一致 | 低 | 离线历史数据迁移 |
Binlog监听 | 秒级 | 强一致 | 高 | 生产环境高实时性要求 |
三、方案详解与代码实战
1. 应用层双写:简单但强耦合
原理:在业务代码中同步写入MySQL和ES,适合初创项目快速验证。
// Node.js 示例(注意事务回滚!)
async function createOrder(orderData) {// 1. MySQL写入const [mysqlResult] = await mysql.query('INSERT INTO orders SET ?', orderData);// 2. ES同步try {await elasticClient.index({index: 'orders',id: mysqlResult.insertId.toString(),body: orderData});} catch (e) {// ES写入失败则回滚MySQLawait mysql.query('DELETE FROM orders WHERE id = ?', [mysqlResult.insertId]);throw e;}
}
缺陷:
•业务侵入性强,需维护两套数据模型
•分布式事务难题(建议本地事务表+补偿机制)
2. 定时任务同步:可控的准实时
核心步骤:
1. MySQL表添加`updatedat`字段
2. 定时扫描增量数据批量推送到ES
// 使用Node.js定时任务(示例:每10分钟)
const schedule = require('node-schedule');
let lastSyncTime = new Date('2024-01-01');
schedule.scheduleJob('*/10 * * * *', async () => {const results = await mysql.query(`SELECT * FROM orders WHERE updated_at > ?`, [lastSyncTime]);// 构造ES Bulk API请求体const bulkBody = results.flatMap(doc => [{ index: { _index: 'orders', _id: doc.id } },{ ...doc, timestamp: new Date() } // 可追加自定义字段]);if (bulkBody.length > 0) {await elasticClient.bulk({ body: bulkBody });lastSyncTime = new Date(); // 持久化存储时间戳防宕机}
});
优化技巧:
•使用`trackingcolumn`记录断点(如Redis存储`lastSyncTime`)
•分页查询避免内存溢出
3. Logstash JDBC:离线迁移利器
配置要点:
•安装MySQL驱动到Logstash的`/logstash-core/lib/jars/`
•定时轮询策略
# mysql-to-es.conf
input {jdbc {jdbc_driver_class => "com.mysql.cj.jdbc.Driver"jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"jdbc_user => "admin"jdbc_password => "Passw0rd!"schedule => "*/30 * * * *" # 每30分钟statement => "SELECT * FROM products WHERE updated_at > :sql_last_value"tracking_column => "updated_at"tracking_column_type => "timestamp"last_run_metadata_path => "/tmp/products_last_run.time"}
}
output {elasticsearch {hosts => ["http://es-node1:9200"]index => "products"document_id => "%{id}"}
}
启动命令:
bin/logstash -f mysql-to-es.conf
4. Binlog监听:生产级实时同步(推荐)
架构:
`MySQL -> Canal/Debezium -> Kafka -> ES Consumer`
Debezium实战步骤:
1. 启动Kafka集群
docker-compose up -d zookeeper kafka schema-registry
2. 部署Debezium MySQL Connector
curl -X POST http://localhost:8083/connectors -H "Content-Type: application/json" -d '{"name": "mysql-connector","config": {"connector.class": "io.debezium.connector.mysql.MySqlConnector","database.hostname": "mysql","database.user": "debezium","database.password": "dbz","database.server.name": "inventory","table.include.list": "inventory.products","database.history.kafka.bootstrap.servers": "kafka:9092"}
}'
3. 编写ES消费者
const { Kafka } = require('kafkajs');
const kafka = new Kafka({ brokers: ['kafka:9092'] });
const consumer = kafka.consumer({ groupId: 'es-sync' });
consumer.connect().then(() => {consumer.subscribe({ topic: 'inventory.products' });consumer.run({eachMessage: async ({ message }) => {const event = JSON.parse(message.value);switch (event.op) {case 'c':case 'u':await esClient.index({index: 'products',id: event.after.id,body: event.after});break;case 'd':await esClient.delete({ index: 'products', id: event.before.id });break;}}});
});
四、避坑指南:关键注意事项
1. 数据一致性
- 使用`version`字段实现乐观锁(ES的`ifseqno`和`ifprimaryterm`)
- 幂等写入:确保重复消费消息不会导致数据错误
2. 性能优化
- ES批量写入使用`Bulk API`,建议每批1000-5000条
- 调整MySQL的Binlog格式为`ROW`,确保Debezium正确解析
3. 错误处理
- 死信队列(DLQ)存储同步失败的数据
- 监控延迟:通过Kafka的`consumer lag`检测同步进度
五、总结
•初创项目:从应用层双写快速起步
•存量数据迁移:Logstash JDBC + 定时任务组合拳
•生产环境:必选Binlog监听方案,保障实时性与可靠性
技术选型建议:根据团队技术栈选择中间件——熟悉Java生态选Canal,云原生环境用Debezium+Kafka。
通过本文的代码示例和架构解析,您可快速构建适合自身业务的MySQL到ES同步管道。同步方案无银弹,合理权衡实时性、复杂度与运维成本是关键。
相关文章:
MySQL数据高效同步到Elasticsearch的四大方案
目录 引言 一、为什么需要MySQL到ES的同步? 二、四大同步方案对比 三、方案详解与代码实战 1. 应用层双写:简单但强耦合 2. 定时任务同步:可控的准实时 3. Logstash JDBC:离线迁移利器 4. Binlog监听:生产级实…...
Docker详解
云是一种服务理念。在云里docker是业务的最小载体 doker是管理容器的引擎,为应用打包、部署平台、而非单纯的虚拟化技术 1.轻量级虚拟化 2.一致性 4.高效的资源利用 5.易于部署和扩展 docker和虚拟机的区别: 虚拟机:真机需要一个操作系…...
清晰易懂的Maven安装教程(含自定义依赖包位置)
初学者也能看懂的 Maven 安装教程(含自定义依赖包位置) Maven 是一个强大的项目管理和构建工具,广泛用于 Java 项目的依赖管理和构建自动化。本教程将手把手教你如何在 Windows 系统上安装 Maven,并配置环境变量,同时…...
王道数据结构6.3
顶点x的第一个邻接点以及下一个邻接点 int first_neighbor(Algraph G, int x){if(G.vertices[x].firstarc! nullptr){return G.vertices[x].firstarc->adjvex;}else return -1; }int next_neighbor(Algraph G,int x,int y){ArcNode *pG.vertices[x].firstarc;while(p! null…...
【Linux操作系统——学习笔记二】Linux简单导航命令操作
一、前言 学习Linux,本质上是学习在命令行下熟练使用Linux的各类命令。 命令行:是一种通过输入命令和参数与计算机系统进行交互的方式,可以使用各种字符化命令对系统发出操作指令,打开Linux终端,进入命令行界面。 …...
贪心算法——c#
贪心算法通俗解释 贪心算法是一种"每一步都选择当前最优解"的算法策略。它不关心全局是否最优,而是通过局部最优的累积来逼近最终解。优点是简单高效,缺点是可能无法得到全局最优解。 一句话秒懂 自动售货机找零钱:用最少数量的…...
SPI 总线协议
1、协议介绍 SPI,是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。 SPI,是一种高速的,全双工,同步的通信总线。主节点或子节点的数据在…...
单片机开发资源分析的实战——以STM32G431RBT6为例子的单片机资源分析
目录 第一点:为什么叫STM32G431RBT6 从资源手册拿到我们的对STM32G431RBT6的资源描述 第二件事情,关心我们的GPIO引脚输出 第三件事情:去找对应外设的说明部分 第一点:为什么叫STM32G431RBT6 对于命名规则不太熟悉的朋友看这里…...
物联网(IoT)架构中,平台层的应用与技术
在物联网(IoT)架构中,平台层是连接物理设备(感知层)和应用服务(应用层)的核心部分。它负责数据的采集、处理、存储、分析以及设备管理等功能,是物联网系统的“大脑”。以下是平台层的主要功能及其技术实现手段: 平台层的主要功能 设备管理: 功能:管理物联网设备的注…...
大语言模型的压缩技术
尽管人们对越来越大的语言模型一直很感兴趣,但MistralAI 向我们表明,规模只是相对而言的,而对边缘计算日益增长的兴趣促使我们使用小型语言获得不错的结果。压缩技术提供了一种替代方法。在本文中,我将解释这些技术,并…...
JVM 2015/3/15
定义:Java Virtual Machine -java程序的运行环境(java二进制字节码的运行环境) 好处: 一次编写,到处运行 自动内存管理,垃圾回收 数组下标越界检测 多态 比较:jvm/jre/jdk 常见的JVM&…...
DeepSeek辅助学术写作中期能力及提示词分享
目录 确立三论 收集资料 选取论据 展开论证 大家好这里是AIWritePaper官方账号!更多内容👉AIWritePaper~在如今这个学术圈的“快车道”上,时间就像是一场永不停歇的赛跑,而论文质量则是那颗我们拼命追逐的“金苹果”。最近一款…...
Git 实战指南:本地客户端连接 Gitee 全流程
本文将以 Gitee(码云)、系统Windows 11 为例,详细介绍从本地仓库初始化到远程协作的全流程操作 目录 1. 前期准备1.1 注册与配置 Gitee1.2 下载、安装、配置客户端1.3 配置公钥到 Gitee2. 本地仓库操作(PowerShell/Git Bash)2.1 初始化本地仓库2.2 关联 Gitee 远程仓库3. …...
汇编基础知识
机器语言 1、机器语言是机器指令的集合,机器指令就是机器可以正确执行的命令,由二进制数组成 2、当今我们常用的是pc机,由一个芯片完成上述功能,即CPU是一种微处理器,每一种微处理器由于自身硬件设计和内部构造不同都…...
线程池的拒绝策略适用场景思考
ThreadPoolExecutor有四种拒绝策略。刚开始学习线程池的时候我就觉得,就是应该当任务饱和(达到拒绝策略)时,就应该拒绝任务,抛出异常。最近仔细思考了下,既然线程池这么设计,也应该有一定的道理…...
on-policy对比off-policy
目录 持续更新。。。 on-policy与off-policy的定义 Q-learning属于on-policy算法还是off-policy算法? 为什么off-policy适用于从离线经验或多种探索策略中学习,明明 On-policy 也可以基于探索学习的啊? 重要性权重方法 off-policy方法可…...
如何记录Matlab程序运行过程中所占用的最大内存(续)
在上一篇博客中,我们讨论了如何记录Matlab程序运行过程中所占用的最大内存。 博客原文:如何记录Matlab程序运行过程中所占用的最大内存-CSDN博客 但经过测试发现,这与实际有非常大的差异。运行如下例子: clear;clc; profile on…...
解决MySQL字符集冲突引发的“Illegal mix of collations”错误
引言 在开发过程中,我们常常会遇到数据库层面的字符集兼容性问题。本文将通过一个典型的案例,分析因字符集不匹配导致的 Illegal mix of collations 错误,并提供完整的解决方案,帮助开发者彻底规避此类问题。 问题现象 假设我们…...
Vue3:F12后,页面弹出runtime errors及提示的解决办法
解决: vue.config.jsdevServer: {client: {overlay: false}, },关闭提示 main.js // 定义特性标志 window.__VUE_PROD_DEVTOOLS__ false window.__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ false...
学习笔记:黑马程序员JavaWeb开发教程(2025.3.17)
11.5 案例-文件上传-阿里云OSS-入门 出现报错:Process exited with an error: 1 (Exit value: 1),点击exec那一行,出现错误原因:Command execution failed. 在CSDN上找到了解决方法: 之后出现新的报错&…...
EDAS:投稿经验-word版本-问题解决
1. 字体不对,字体未嵌入问题 问题:word转PDF后,总是显示有字体格式不对(忘记截图了)。 办法:1. EDAS投稿PDF格式问题-CSDN博客-PDF上修改 IEEE论文检测的字体未嵌入问题Times New Ro…...
【数据结构初阶第十九节】八大排序系列(下篇)—[详细动态图解+代码解析]
hello,好久不见! 云边有个稻草人-CSDN博客 上篇内容,回顾一下吧【数据结构初阶第十八节】八大排序系列(上篇)—[详细动态图解代码解析]-CSDN博客 今天我们来学习下篇 目录 (2)快速排序 【挖坑法】 —思路 —思路…...
不可不知的分布式数据库-TiDB
不可不知的分布式数据库-TiDB 介绍TiDb架构TiDb与Mysql的区别功能特性性能表现数据可靠性运维管理成本 Docker部署TiDB1. 获取 TiDB 配置文件2. 启动 TiDB 集群3. 连接到 TiDB4. 停止和清理 TiDB 集群注意事项 实用案例TiDB实现分布式事务实现原理实现方式SQL 方式编程方式 注意…...
BUUCTF Pwn babyheap_0ctf_2017 Unsorted bin attack部分
checksec exeinfo 开启了全保护 64位 查看函数: 堆题 增删查改齐了 可以在编辑堆的时候重新设置大小 存在堆溢出 delete函数的指针清零了 无UAF 想法是通过unsorted bin泄露libc基址: from pwn import *p process(./babyheap) #p remote("node…...
AI绘画软件Stable Diffusion详解教程(11):图生图进阶篇(局部用上传蒙版重绘)
总的功能与上一篇相似,但是在Stable Diffusion网页上手工涂绘的方法,有可能会因不够精细,导致重绘的效果不佳,涂绘区与非涂绘区的衔接有可能会出问题。这个时候可以用photoshop来制作蒙版,精确的圈出需要重绘的地方&am…...
SAP的WPS导出找不到路径怎么办;上载报错怎么办
一.打开注册编辑器 二.输入以下地址 计算机\HKEY_CLASSES_ROOT\ExcelWorksheet\Protocol\StdFileEditing\Server 去除掉EXE后面的命令即可 二:WPS上载文件没反应怎么办 如何切换整合模式或多组件模式-WPS学堂 根据官方操作把整合模式改成多组件模式...
Go语言不定长参数使用详解
不定长参数(Variadic Parameters)使用详解 核心概念 语法特性:...T 表示函数可接受任意数量的T类型参数底层实现:不定长参数在函数内部实际存储为切片类型 []T展开操作符:调用时使用 slice... 可将切片展开为独立参数…...
django如何配置使用asgi
以下是 Django 配置使用 ASGI 的完整指南: 一、配置前提 Django 版本:确保使用 Django 3.0(原生支持 ASGI)必要依赖:pip install daphne channels二、基础配置步骤 1. 创建/修改 ASGI 入口文件 在 Django 项目根目录…...
在C语言基础上学Java【Java】【一】
众所周知,Java是C风格的语言,对于学过C语言的人学Java可以快速适应。 废话不多说,直接边看代码边学。 数据类型,输入和输出 public class a1 {//a1是类名,就是文件名,所有的可执行代码需要写在这个里面 /…...
使用 Promise 和 .then() 解决同异步问题
在购物车功能中,用户点击“加入购物车”或“删除购物车”时,可能会遇到数据同步问题。例如,当用户快速连续点击“删除”按钮时,可能会导致删除操作基于过时的数据,从而引发错误。为了解决这个问题,我们可以…...
defineExpose函数
在软件开发中,特别是在像 Vue.js 这样的框架中,defineExpose 是一个函数,用于显式地将组件的某些属性或方法暴露给其父组件或其他组件。这在你想控制组件的内部状态或功能对外部可见性时非常有用。 Vue.js 3 中的示例: <scri…...
LabVIEW烟气速度场实时监测
本项目针对燃煤电站烟气流速实时监测需求,探讨了静电传感器结构与速度场超分辨率重建方法,结合LabVIEW多板卡同步采集与实时处理技术,开发出一个高效的烟气速度场实时监测系统。该系统能够在高温、高尘的复杂工况下稳定运行,提供高…...
台式机电脑组装---电源
台式机电脑组装—电源 22 33 主板供电是聚集了12V,5V,3.3V的24pin CPU供电的话主要是12V的44pin供电 44pin合并之后,就是8pin 55 SATA硬盘会使用饼io口取电,从电源获取12v,5v,3.3v的电 33...
中小型企业大数据平台全栈搭建:Hive+HDFS+YARN+Hue+ZooKeeper+MySQL+Sqoop+Azkaban 保姆级配置指南
目录 背景一、环境规划与依赖准备1. 服务器规划(3节点集群)2. 系统与依赖3. Hadoop生态组件版本与下载路径4. 架构图二、Hadoop(HDFS+YARN)安装与配置1. 下载与解压(所有节点)2. HDFS高可用配置3. YARN资源配置4. 启动Hadoop集群三、MySQL安装与Hive元数据配置…...
2023年蓝桥杯 省赛 ————特殊日期
2.特殊日期 - 蓝桥云课 错误原因: 分不清大小月,将闰年的2月天数当成了28天,非闰年当成了27天,因此出错 错误代码如下: package Lanqiao;import java.util.Scanner;/*** author zb* date2025/3/16 13:22*/ public …...
电动车出入库管理软件,电动车维修保养售后服务管理系统,佳易王电动车店管理系统操作教程
一、概述 本实例以 佳易王电动车店管理系统 为例说明,其他版本可参考本实例。试用版软件资源可到文章最后了解,下载的文件为压缩包文件,请使用免费版的解压工具解压即可试用。 软件特点: 操作便捷性高 软件功能实用且…...
计算机网络-综合布线系统
工作区子系统:由信息插座、插座盒、连接跳线和适配器组成 水平子系统:由一个工作区的信息插座开始,经水平布置到管理区的内测配线架的线缆所组成 管理子系统:由交连、互连配线架组成。管理子系统为连接其它子系统提供连接手段 …...
【蓝桥杯】24省赛:数字串个数
思路 本质是组合数学问题: 9个数字组成10000位数字有9**10000可能 不包括3的可能8**10000 不包括7的可能8**10000 既不包括3也不包括77**10000 根据容斥原理:结果为 9 ∗ ∗ 10000 − 8 ∗ ∗ 10000 − 8 ∗ ∗ 10000 7 ∗ ∗ 10000 9**10000 - 8**10…...
手写一些常见算法
手写一些常见算法 快速排序归并排序Dijkstra自定义排序交替打印0和1冒泡排序插入排序堆排序欧几里得算法求最大公约数 快速排序 public class Main {public static void main(String[] args) {int nums[] {1,3,2,5,4,6,8,7,9};quickSort(nums,0,nums.length - 1);}private st…...
AI自动生成数据
文章目录 概要案例生成简单的文本数据 概要 合成数据是人工生成的数据而不是从现实世界事件中收集的数据。它用于模拟真实数据,而不会泄露隐私或遇到现实世界的限制 安装依赖:pip install langchain_experimental 合成数据的优势: 1.隐私…...
【STM32】从新建一个工程开始:STM32 新建工程的详细步骤
STM32 开发通常使用 Keil MDK、STM32CubeMX、IAR 等工具来创建和管理工程。此处是 使用 Keil MDK5 STM32CubeMX 创建 STM32 工程的详细步骤。 新建的标准库工程文件已上传至资源中,下载后即可直接使用。 标准库新建 STM32 工程的基本目录结构:STD_STM…...
【Go语言圣经3.6】
目标 概念 常量与变量的主要区别在于: 不可变性:常量在声明后其值就固定下来,不能再被修改。这保证了程序运行时不会因意外修改而导致错误。 使用不可变数据(例如数学常数 π)可以避免意外修改带来的问题 编译期计算…...
[IP]UART
UART 是一个简易串口ip,用户及配置接口简单。 波特率从9600至2000000。 该 IP 支持以下特性: 异步串行通信:标准 UART 协议(1 起始位,8 数据位,1 停止位,无奇偶校验)。 参数化配置…...
Windows主机、虚拟机Ubuntu、开发板,三者之间文件互传
以下内容源于日常学习的整理,欢迎交流。 下图是Windows主机、虚拟机Ubuntu、开发者三者之间文件互传的方式示意图: 注意,下面谈及的所有方式,都要求两者的IP地址处于同一网段,涉及到的软件资源见felm。 一、Windows主…...
4.好事多磨 1
前言 我们已经学习了创建套接字和向套接字分配地址,接下来正式讨论通过套接字收发数据。 之前介绍套接字时举例说明了面向连接的套接字和面向消息的套接字这2种数据传输方式,特别是重点讨论了面向连接的套接字。这次将具体讨论这种面向连接的服务器端/客…...
AI预测体彩排3新模型百十个定位预测+胆码预测+杀和尾+杀和值2025年3月18日第22弹
前面由于工作原因停更了很长时间,停更期间很多彩友一直私信我何时恢复发布每日预测,目前手头上的项目已经基本收尾,接下来恢复发布。当然,也有很多朋友一直咨询3D超级助手开发的进度,在这里统一回复下。 由于本人既精…...
相机标定之DLT算法学习
文章目录 1.针孔相机模型2.各个坐标系的定义1)世界坐标系(world coordinate)2)相机坐标系(camera coordinate)3)图像坐标系(film coordinate)4)像素坐标系&am…...
Flask实时监控:打造智能多设备在线离线检测平台(升级版)
前言 武林之中,最讲究的便是“掌控”。若是手下弟子忽然失踪,若是江湖好友生死未卜,岂不令人寝食难安?今日,吾等化身技术侠客,祭出Flask实时监控大法,打造一款智能多设备在线离线检测平台&…...
【计算机网络】一二章
一 二 非常棒的例子 相同的传播时延,带宽越大,该链路上所能容纳的比特数越多 相同的传播时延,带宽越大,该链路上所能容纳的比特数越多 往返时间(Round-Trip Time,RTT)s是指从发送端发送数据分组…...
003-掌控命令行-CLI11-C++开源库108杰
首选的现代C风格命令行参数解析器! (本课程包含两段教学视频。) 以文件对象监控程序为实例,五分钟实现从命令行读入多个监控目标路径;区分两大时机,学习 CLI11 构建与解析参数两大场景下的异常处理;区分三…...