MySQL 和 Elasticsearch 之间的数据同步
MySQL 和 Elasticsearch 之间的数据同步是常见的需求,通常用于将结构化数据从关系型数据库同步到 Elasticsearch 以实现高效的全文搜索、聚合分析和实时查询。以下是几种常用的同步方案及其实现方法:
1. 应用层双写(双写模式)
原理
在业务代码中同时向 MySQL 和 Elasticsearch 写入数据,保证两者数据一致。
实现步骤
- 在写入 MySQL 的事务中,同步或异步写入 Elasticsearch。
- 需处理可能的写入失败问题(如 Elasticsearch 宕机),通过重试机制或补偿机制(如消息队列)确保最终一致性。
优点
- 实现简单,对架构改动较小。
- 实时性强,写入即生效。
缺点
- 双写可能引入数据不一致风险(如 MySQL 成功但 Elasticsearch 失败)。
- 业务逻辑耦合度高,维护成本增加。
适用场景
- 小规模数据同步,对实时性要求高。
- 业务逻辑简单,可接受双写风险。
2. 使用 Logstash 定时同步
原理
通过 Logstash 的 jdbc 插件定期轮询 MySQL,将增量或全量数据同步到 Elasticsearch。
实现步骤
- 配置 Logstash 输入(Input):使用
jdbc插件连接 MySQL,定义 SQL 查询(如按时间戳增量拉取)。 - 配置 Logstash 输出(Output):将数据写入 Elasticsearch。
- 定时任务:通过
schedule参数设置轮询间隔(如每分钟一次)。
示例 Logstash 配置
input {jdbc {jdbc_driver_library => "mysql-connector-java-8.0.26.jar"jdbc_driver_class => "com.mysql.cj.jdbc.Driver"jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"jdbc_user => "root"jdbc_password => "password"schedule => "* * * * *" # 每分钟执行一次statement => "SELECT * FROM products WHERE updated_at > :sql_last_value"use_column_value => truetracking_column => "updated_at"tracking_column_type => "timestamp"}
}
output {elasticsearch {hosts => ["http://localhost:9200"]index => "products"document_id => "%{id}"}
}
优点
- 配置简单,无需修改业务代码。
- 支持增量同步。
缺点
- 实时性较差(依赖轮询间隔)。
- 频繁轮询可能对 MySQL 造成压力。
适用场景
- 对实时性要求不高(如 T+1 数据同步)。
- 数据量较小,无需复杂转换的场景。
3. 基于 Binlog 的实时同步
原理
通过解析 MySQL 的 Binlog 日志(记录数据变更),将变更事件实时同步到 Elasticsearch。
常用工具:
- Canal(阿里开源工具)
- Debezium(基于 Kafka Connect)
- Maxwell
实现步骤(以 Canal 为例)
-
开启 MySQL Binlog:
# 在 MySQL 配置文件中启用 Binlog server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog_format = ROW # 必须为 ROW 模式 -
部署 Canal Server:
- Canal 伪装为 MySQL 从库,订阅 Binlog 变更。
- 解析 Binlog 并转发到消息队列(如 Kafka)或直接调用 Elasticsearch API。
-
数据消费与写入 Elasticsearch:
- 编写消费者程序(如 Java/Python),将 Binlog 中的增删改事件转换为 Elasticsearch 的写入/更新/删除操作。
优点
- 实时性高(毫秒级延迟)。
- 对业务代码无侵入。
缺点
- 部署复杂度较高,需维护中间件(如 Canal、Kafka)。
- 需处理数据格式转换(如关系表到 JSON 文档)。
适用场景
- 大规模数据实时同步。
- 对数据一致性要求高的场景。
4. 使用消息队列解耦
原理
将 MySQL 的变更事件发送到消息队列(如 Kafka、RabbitMQ),由消费者异步写入 Elasticsearch。
实现步骤
- 捕获 MySQL 变更:
- 使用 Binlog 工具(如 Debezium)将变更事件发送到 Kafka。
- 消费 Kafka 消息:
- 编写消费者程序,处理消息并写入 Elasticsearch。
示例架构
MySQL → Debezium → Kafka → Consumer → Elasticsearch
优点
- 高可靠性,消息队列提供持久化和重试机制。
- 解耦生产者和消费者,扩展性强。
缺点
- 架构复杂度高,需维护多个组件。
适用场景
- 高并发、高可靠性的生产环境。
- 需要灵活扩展和数据缓冲的场景。
5. 第三方工具
工具推荐
- Go-MySQL-Elasticsearch:基于 Go 开发的工具,直接读取 MySQL Binlog 并同步到 Elasticsearch。
- Elasticsearch River(已弃用):旧版 Elasticsearch 插件,不建议使用。
实现步骤(以 Go-MySQL-Elasticsearch 为例)
- 配置 MySQL 连接信息和 Elasticsearch 地址。
- 定义表到索引的映射规则。
- 启动服务,自动监听 Binlog 并同步数据。
优点
- 开箱即用,无需开发代码。
缺点
- 灵活性和可定制性较差。
总结与选型建议
| 方案 | 实时性 | 复杂度 | 可靠性 | 适用场景 |
|---|---|---|---|---|
| 应用层双写 | 高 | 低 | 中 | 小规模,强实时性 |
| Logstash 定时同步 | 低 | 低 | 中 | 离线分析,非实时场景 |
| Binlog 同步(Canal) | 高 | 高 | 高 | 大规模,实时性要求高 |
| 消息队列(Kafka) | 高 | 高 | 高 | 高并发,需解耦和扩展 |
| 第三方工具 | 中 | 中 | 中 | 快速实现,无需定制开发 |
注意事项
- 数据结构转换:需将 MySQL 的行数据转换为 Elasticsearch 的 JSON 文档,可能涉及嵌套对象或父子关系处理。
- 幂等性:确保同步操作的幂等性(如通过唯一ID),避免重复写入。
- 错误处理:监控同步失败的情况,提供重试或人工干预机制。
- 性能优化:
- 批量写入 Elasticsearch(使用
_bulkAPI)。 - 调整 Elasticsearch 的刷新间隔(
refresh_interval)提升写入性能。
- 批量写入 Elasticsearch(使用
通过合理选择方案并配合监控工具(如 Kibana、Prometheus),可实现高效可靠的 MySQL 到 Elasticsearch 数据同步。
相关文章:
MySQL 和 Elasticsearch 之间的数据同步
MySQL 和 Elasticsearch 之间的数据同步是常见的需求,通常用于将结构化数据从关系型数据库同步到 Elasticsearch 以实现高效的全文搜索、聚合分析和实时查询。以下是几种常用的同步方案及其实现方法: 1. 应用层双写(双写模式) 原…...
PS裁剪工具
裁剪: 多张图同一标准裁剪:裁剪–》前面的图像–》选择其他图像–》 确定 选区–》裁剪工具–》确定:选区制作矩形裁剪 裁剪–》拉直 裁剪–》内容识别:当裁剪大于图片大小,会自动填充空白区域 (栅格化图层…...
[Web 安全] PHP 反序列化漏洞 —— PHP 序列化 反序列化
关注这个专栏的其他相关笔记:[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客 0x01:PHP 序列化 — Serialize 序列化就是将对象的状态信息转化为可以存储或传输的形式的过程,在 PHP 中,通常使用 serialize() 函数来完成序列化的操作…...
QT入门--QMainWindow
从上向下依次是菜单栏,工具栏,铆接部件(浮动窗口),状态栏,中心部件 菜单栏 创建菜单栏 QMenuBar* mybar1 menuBar(); 将菜单栏放到窗口中 setMenuBar(mybar1); 创建菜单 QMenu *myfilemenu mybar1-…...
C++ | 高级教程 | 信号处理
👻 概念 信号 —— 操作系统传给进程的中断,会提早终止程序有些信号不能被程序捕获,有些则可以被捕获,并基于信号采取适当的动作 信号描述SIGABRT程序的异常终止,如调用 abortSIGFPE错误的算术运算,比如除…...
最新前端框架选型对比与建议(React/Vue/Svelte/Angular)
前端框架选型对比与建议(React/Vue/Svelte/Angular) 一、核心框架技术特性对比(基于最新版本) 维度React 19 25Vue 3.5 12Svelte 5 25Angular 19 5核心理念函数式编程、JSX语法、虚拟DOM渐进式框架、组合式API、模板语法编译时框…...
游戏引擎学习第123天
仓库:https://gitee.com/mrxiao_com/2d_game_3 黑板:线程同步/通信 目标是从零开始编写一个完整的游戏。我们不使用引擎,也不依赖任何库,完全自己编写游戏所需的所有代码。我们做这个节目不仅是为了教育目的,同时也是因为编程本…...
计算机网络:从底层原理到前沿应用,解锁数字世界的连接密码
计算机网络:从底层原理到前沿应用,解锁数字世界的连接密码 在信息如洪流般奔涌的时代,计算机网络宛如无形的脉络,贯穿于我们生活的每一个角落。它不仅是数据传输的通道,更是连接全球、驱动创新的核心力量。从日常的网络…...
grafana K6压测
文章目录 install and runscript.jsoptions最佳实践 report 解析 https://grafana.com/docs/k6/latest/get-started install and run install # mac brew install k6当前目录下生成压测脚本 # create file script.js k6 new [filename] # create file ‘script.js’ in …...
Vue的组合式API和选项式API有什么区别
Vue3的组合式API(Composition API)和选项式API(Options API)是两种不同的组件编写方式,主要区别如下: 1. 代码组织方式 选项式API: 按照选项(如data、methods、computed等࿰…...
ubuntu 安全策略(等保)
windows 三个帐号屏保设置组策略,密码超时次数/审计记录; linux 应具有登录失败处理功能,应配置并启用结束会话、限制非法登录次数和当登录连接超时自动退出等相关措施。 1、在系统中新建测试用户,使用此用户登录时多次输入错误密码&…...
c/c++蓝桥杯经典编程题100道(22)最短路径问题
最短路径问题 ->返回c/c蓝桥杯经典编程题100道-目录 目录 最短路径问题 一、题型解释 二、例题问题描述 三、C语言实现 解法1:Dijkstra算法(正权图,难度★★) 解法2:Bellman-Ford算法(含负权边&a…...
AI工具集合
设计相关 1. mastrtgo(暂时免费) :可以根据自然语言生成UI设计稿和前端代码 MasterGo 莫高设计 - AI 时代的数字界面生产平台 2. reddy.ai(暂时免费): 国外类似mastrtgo的平台 Readdy 3. midjourney (…...
CSDN 博客:CC++ 内存管理详解
CSDN 博客:C/C 内存管理详解 在软件开发过程中,内存管理是一个非常重要的环节。对于 C 和 C 这两种编程语言,它们都拥有独特的内存管理机制,理解这些机制对于编写高效、健壮的程序至关重要。本文将详细讲解 C/C 内存管理相关的内…...
表单制作代码,登录动画背景前端模板
炫酷动效登录页 引言 在网页设计中,按钮是用户交互的重要元素之一。一个炫酷的按钮特效不仅能提升用户体验,还能为网页增添独特的视觉吸引力。今天,我们将通过CSS来实现一个“表单制作代码,登录动画背景前端模板”。该素材呈现了数据符号排版显示出人形的动画效果,新颖有…...
嵌入式项目:STM32刷卡指纹智能门禁系统
本文详细介绍基于STM32的刷卡指纹智能门禁系统。 获取资料/指导答疑/技术交流/选题/帮助,请点链接: https://gitee.com/zengzhaorong/share_contact/blob/master/stm32.txt 1 系统功能 1.1 功能概述 本系统由STM32硬件端(下位机)…...
LeetCode 热题100 141. 环形链表
LeetCode 热题100 | 141. 环形链表 大家好,今天我们来解决一道经典的算法题——环形链表。这道题在 LeetCode 上被标记为简单难度,要求我们判断一个链表中是否存在环。下面我将详细讲解解题思路,并附上 Python 代码实现。 题目描述 给定一个…...
以绘图(绘制点、直线、圆、椭圆、多段线)为例子 通过设计模式中的命令模式实现
为了在命令模式的基础上实现撤销(Undo)和回退(Redo)功能,我们可以在每个命令类中记录一些必要的状态,允许我们撤销之前的操作,并在需要时回退操作。常见的做法是使用一个命令堆栈来存储历史命令…...
鹏哥c语言数组(初阶数组)
前言: 对应c语言视频54集 内容: 一维数组的创建 数组是一组相同元素的集合, 数组的创建方式 type_t就是数组的元素类型,const_n是一个常量表达式,用来指定数组的大小 c99标准之前的,数组的大小必须是…...
利用go-migrate实现MySQL和ClickHouse的数据库迁移
1. 背景 在使用gorm时 , 尽管已经有了自动建表和钩子函数 . 但是在面临希望了解到数据库的变更 , 和插入一些系统字段时 , 以及最关键的数据库迁移的工作 . gorm显得稍微有点不便 . 在了解到migrate这项技术后 , 就使用go-migrate开发了一个可以迁移MySQL和ClickHouse数据库的…...
Mac Mouse Fix:5分钟让你的普通鼠标在Mac上超越苹果原生体验
Mac Mouse Fix:5分钟让你的普通鼠标在Mac上超越苹果原生体验 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 还在为Mac上第三方鼠标…...
告别密码:VSCode + OpenSSH实现Windows服务器一键免密登录
1. 为什么你需要免密登录Windows服务器? 作为一名开发者,我每天至少要登录远程服务器十几次。每次输入密码不仅浪费时间,还容易出错。特别是在自动化部署场景下,密码验证简直就是绊脚石。去年我在做一个持续集成项目时࿰…...
STM32CubeMX实战:用IIC驱动JY61P六轴陀螺仪(附完整工程文件)
STM32CubeMX实战:用IIC驱动JY61P六轴陀螺仪(附完整工程文件) 在嵌入式开发中,姿态传感器是实现运动追踪、平衡控制等功能的常见组件。JY61P作为一款高性价比的六轴陀螺仪模块,通过IIC接口与STM32微控制器通信ÿ…...
SpringBoot 全局异常处理 + 参数校验,企业级规范写法(代码直接复制)
一、前言 在 SpringBoot 前后端分离项目里,这两个东西几乎是必写基础: 1.接口参数乱传,直接报错到前端 2.异常满天飞,前端各种无法解析 3.每个接口都写 try-catch,代码又臭又长 4.参数校验逻辑重复,维护成…...
从VINS-Mono到ORB-SLAM3:主流视觉惯性里程计(VIO)算法到底该怎么选?附实测数据对比
视觉惯性里程计实战选型指南:VINS-Mono与ORB-SLAM3深度对比 当你的无人机需要在无GPS的仓库内自主盘点库存,或是移动机器人必须在昏暗隧道中保持厘米级定位精度时,视觉惯性里程计(VIO)技术就成为了关键突破口。市场上主…...
YonSuite如何用“本体智能”破解企业AI落地困局
2026年4月10日,2026成长型企业数智化创新峰会北京站顺利启幕,核心主题就是“本体智能 成长无界——YonSuite让AI在企业落地”。这场由用友YonSuite主办的峰会,聚集了不少行业专家、技术达人以及数百位企业管理者,趁着AI从“演示试…...
从理论到实践:利用Smith预估器解决网络控制系统中的双延迟问题(含Matlab/Simulink案例)
1. 网络控制系统中的双延迟问题 想象一下你在玩远程操控的赛车游戏,按下手柄按键后赛车总要延迟半秒才响应——这就是典型的控制延迟。而在工业自动化领域,这种延迟可能造成更严重的后果:机械臂失控撞毁设备、化工反应釜温度失控引发事故。网…...
AWS 账单查看与付款方式设置指南(企业支持实用手册)
一文搞定 AWS 发票下载、费用明细查询和电汇付款配置,适合企业财务和运维人员快速上手。 前言 使用 AWS 的企业经常会遇到这几个问题:月底了发票在哪下载?费用明细怎么导出给财务?公司要用银行电汇付款怎么设置? 这篇文章把这三件事讲清楚,都是控制台操作,不需要写代码…...
人工智能艺术新范式:忍者像素绘卷:天界画坊在AIGC领域的应用探索
人工智能艺术新范式:忍者像素绘卷:天界画坊在AIGC领域的应用探索 1. 像素艺术的新纪元 当传统像素艺术遇上人工智能,一场视觉革命正在悄然发生。忍者像素绘卷:天界画坊作为AIGC领域的新锐力量,正在重新定义像素艺术的…...
第一范式是关系型数据库设计的最基本要求,核心规则是**关系模式的所有属性都是不可再分的原子数据项**
第一范式是关系型数据库设计的最基本要求,核心规则是关系模式的所有属性都是不可再分的原子数据项,即表中每一列的取值都是单一值,不存在组合值或多值情况。 1NF的典型问题 以教材中的FIRST关系表为例(供应商-零件供应关系&#x…...
