MySQL 和 Elasticsearch 之间的数据同步

MySQL 和 Elasticsearch 之间的数据同步是常见的需求,通常用于将结构化数据从关系型数据库同步到 Elasticsearch 以实现高效的全文搜索、聚合分析和实时查询。以下是几种常用的同步方案及其实现方法:


1. 应用层双写(双写模式)

原理

在业务代码中同时向 MySQL 和 Elasticsearch 写入数据,保证两者数据一致。

实现步骤

  1. 在写入 MySQL 的事务中,同步或异步写入 Elasticsearch。
  2. 需处理可能的写入失败问题(如 Elasticsearch 宕机),通过重试机制或补偿机制(如消息队列)确保最终一致性。

优点

  • 实现简单,对架构改动较小。
  • 实时性强,写入即生效。

缺点

  • 双写可能引入数据不一致风险(如 MySQL 成功但 Elasticsearch 失败)。
  • 业务逻辑耦合度高,维护成本增加。

适用场景

  • 小规模数据同步,对实时性要求高。
  • 业务逻辑简单,可接受双写风险。

2. 使用 Logstash 定时同步

原理

通过 Logstash 的 jdbc 插件定期轮询 MySQL,将增量或全量数据同步到 Elasticsearch。

实现步骤

  1. 配置 Logstash 输入(Input):使用 jdbc 插件连接 MySQL,定义 SQL 查询(如按时间戳增量拉取)。
  2. 配置 Logstash 输出(Output):将数据写入 Elasticsearch。
  3. 定时任务:通过 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 为例)

  1. 开启 MySQL Binlog

    # 在 MySQL 配置文件中启用 Binlog
    server-id = 1
    log_bin = /var/log/mysql/mysql-bin.log
    binlog_format = ROW  # 必须为 ROW 模式
    
  2. 部署 Canal Server

    • Canal 伪装为 MySQL 从库,订阅 Binlog 变更。
    • 解析 Binlog 并转发到消息队列(如 Kafka)或直接调用 Elasticsearch API。
  3. 数据消费与写入 Elasticsearch

    • 编写消费者程序(如 Java/Python),将 Binlog 中的增删改事件转换为 Elasticsearch 的写入/更新/删除操作。

优点

  • 实时性高(毫秒级延迟)。
  • 对业务代码无侵入。

缺点

  • 部署复杂度较高,需维护中间件(如 Canal、Kafka)。
  • 需处理数据格式转换(如关系表到 JSON 文档)。

适用场景

  • 大规模数据实时同步。
  • 对数据一致性要求高的场景。

4. 使用消息队列解耦

原理

将 MySQL 的变更事件发送到消息队列(如 Kafka、RabbitMQ),由消费者异步写入 Elasticsearch。

实现步骤

  1. 捕获 MySQL 变更
    • 使用 Binlog 工具(如 Debezium)将变更事件发送到 Kafka。
  2. 消费 Kafka 消息
    • 编写消费者程序,处理消息并写入 Elasticsearch。

示例架构

MySQL → Debezium → Kafka → Consumer → Elasticsearch

优点

  • 高可靠性,消息队列提供持久化和重试机制。
  • 解耦生产者和消费者,扩展性强。

缺点

  • 架构复杂度高,需维护多个组件。

适用场景

  • 高并发、高可靠性的生产环境。
  • 需要灵活扩展和数据缓冲的场景。

5. 第三方工具

工具推荐

  • Go-MySQL-Elasticsearch:基于 Go 开发的工具,直接读取 MySQL Binlog 并同步到 Elasticsearch。
  • Elasticsearch River(已弃用):旧版 Elasticsearch 插件,不建议使用。

实现步骤(以 Go-MySQL-Elasticsearch 为例)

  1. 配置 MySQL 连接信息和 Elasticsearch 地址。
  2. 定义表到索引的映射规则。
  3. 启动服务,自动监听 Binlog 并同步数据。

优点

  • 开箱即用,无需开发代码。

缺点

  • 灵活性和可定制性较差。

总结与选型建议

方案实时性复杂度可靠性适用场景
应用层双写小规模,强实时性
Logstash 定时同步离线分析,非实时场景
Binlog 同步(Canal)大规模,实时性要求高
消息队列(Kafka)高并发,需解耦和扩展
第三方工具快速实现,无需定制开发

注意事项

  1. 数据结构转换:需将 MySQL 的行数据转换为 Elasticsearch 的 JSON 文档,可能涉及嵌套对象或父子关系处理。
  2. 幂等性:确保同步操作的幂等性(如通过唯一ID),避免重复写入。
  3. 错误处理:监控同步失败的情况,提供重试或人工干预机制。
  4. 性能优化
    • 批量写入 Elasticsearch(使用 _bulk API)。
    • 调整 Elasticsearch 的刷新间隔(refresh_interval)提升写入性能。

通过合理选择方案并配合监控工具(如 Kibana、Prometheus),可实现高效可靠的 MySQL 到 Elasticsearch 数据同步。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

萌新学 Python 之闭包函数

闭包函数:在一个函数体内嵌套函数,是一个函数对象,允许在内部函数中修改或引用外部函数的变量 闭包函数对数据有封存功能 闭包函数需要满足以下几个条件: 1.函数必须有一个嵌套函数,在定义函数时,内部再…

【Python修仙编程】(二) Python3灵源初探(2)

第一部分:林羽的修仙之旅——字符串与布尔类型的修炼 林羽站在练气期一阶的起点,望着手中的《Python无极心法》秘籍,心中充满了期待。师傅玄天真人在一旁微笑着说道:“林羽,今天我们要修炼的是‘字符串’和‘布尔类型…

AI大模型(四)基于Deepseek本地部署实现模型定制与调教

AI大模型(四)基于Deepseek本地部署实现模型定制与调教 DeepSeek开源大模型在榜单上以黑马之姿横扫多项评测,其社区热度指数暴涨、一跃成为近期内影响力最高的话题,这个来自中国团队的模型向世界证明:让每个普通人都能…

2.部署kafka:9092

官方文档:http://kafka.apache.org/documentation.html (虽然kafka中集成了zookeeper,但还是建议使用独立的zk集群) Kafka3台集群搭建环境: 操作系统: centos7 防火墙:全关 3台zookeeper集群内的机器,1台logstash 软件版本: …

IO进程 day05

IO进程 day05 9. 进程9. 9. 守护进程守护进程的特点守护进程创建步骤 10. 线程10.1. 线程的概念10.2. 进程和线程的区别10.2. 线程资源10.3. 线程的函数接口1. pthread_create-创建线程线程函数和普通函数的区别 2. pthread_exit3.线程资源回收函数join和detach的区别 获取线程…

数字IC低功耗后端设计实现之power gating和isolation技术

考虑低功耗设计需求,下图中间那个功能模块是需要做power domain的,即这个模块需要插MTCMOS。需要开启时,外面的VDD会和这个模块的LOCAL VDD形成通路,否则就是断开即power off状态。 这些低功耗设计实现经验,你真的懂了…

使用 Open3D 批量渲染并导出固定视角点云截图

一、前言 在三维点云处理与可视化中,固定视角批量生成点云渲染截图是一个常见的需求。例如,想要将同一系列的点云(PCD 文件)在同样的视角下生成序列图片,以便后续合成为视频或进行其他可视化演示。本文将介绍如何使用…

c++的继承

封装、继承和多态是c的三大特性,他们的关系甚为紧密 封装的概念简单易懂,其实就是将数据和操作数据的方法结合在一起,形成一个独立的单元(类),通过访问控制符(如private、protected和public&…

3dtiles平移旋转工具制作

3dtiles平移旋转缩放原理及可视化工具实现 背景 平时工作中,通过cesium平台来搭建一个演示场景是很常见的事情。一般来说,演示场景不需要多完善的功能,但是需要一批三维模型搭建,如厂房、电力设备、园区等。在实际搭建过程中&…

我是如何从 0 到 1 找到 Web3 工作的?

作者:Lotus的人生实验 关于我花了一个月的时间,从 0 到 1 学习 Web3 相关的知识和编程知识。然后找到了一个 Web3 创业公司实习的远程工作。 👇👇👇 我的背景: 计算机科班,学历还可以(大厂门槛水平) 毕业工…

进程状态(R|S|D|t|T|X|Z)、僵尸进程及孤儿进程

文章目录 一.进程状态进程排队状态:运行、阻塞、挂起 二.Linux下的进程状态R 运行状态(running)S 睡眠状态(sleeping)D 磁盘休眠状态(Disk sleep)t 停止、暂停状态(tracing stopped)T 停止、暂停状态(stopp…

为什么要将PDF转换为CSV?CSV是Excel吗?

在企业和数据管理的日常工作中,PDF文件和CSV文件承担着各自的任务。PDF通常用于传输和展示静态的文档,而CSV因其简洁、易操作的特性,广泛应用于数据存储和交换。如果需要从PDF中提取、分析或处理数据,转换为CSV格式可能是一个高效…

Starlink卫星动力学系统仿真建模第十讲-基于SMC和四元数的卫星姿态控制示例及Python实现

基于四元数与滑模控制的卫星姿态控制 一、基本原理 1. 四元数姿态表示 四元数运动学方程: 3. 滑模控制设计 二、代码实现(Python) 1. 四元数运算工具 import numpy as npdef quat_mult(q1, q2):"""四元数乘法""…

CSS—引入方式、选择器、复合选择器、文字控制属性、CSS特性

目录 CSS 1.引入方式 2.选择器 3.复合选择器 4.文字控制属性 5.CSS特性 CSS 层叠样式表,是一种样式表语言,用来描述HTML文档的呈现 书写时一般按照顺序:盒子模型属性—>文字样式—>圆角、阴影等修饰属性 1.引入方式 引入方式方…

OpenHarmony-4.基于dayu800 GPIO 实践(2)

基于dayu800 GPIO 进行开发 1.DAYU800开发板硬件接口 LicheePi 4A 板载 2x10pin 插针,其中有 16 个原生 IO,包括 6 个普通 IO,3 对串口,一个 SPI。TH1520 SOC 具有4个GPIO bank,每个bank最大有32个IO:  …

win11 24h2 远程桌面 频繁断开 已失去连接 2025

一、现象 Windows11自升级2025年2月补丁后版本号为系统版本是26100.3194,远程桌面频繁断开连接,尝试连接,尤其在连接旧的server2012 二、临时解决方案 目前经测试,在组策略中,远程桌面连接客户端,关闭客户…

rust学习笔记6-数组练习704. 二分查找

上次说到rust所有权看看它和其他语言比有什么优势,就以python为例 # Python3 def test():a [1, 3, -4, 7, 9]print(a[4])b a # 所有权没有发生转移del b[4]print(a[4]) # 由于b做了删除,导致a再度访问报数组越界if __name__ __main__:test() 运行结…

Windows安装NVIDIA显卡CUDAD调用GPU,适用于部署deepseek r1

显卡、显卡驱动、CUDA之间的关系 显卡:(GPU),主流是NVIDIA的GPU,因为深度学习本身需要大量计算。GPU的并行计算能力,在过去几年里恰当地满足了深度学习的需求。AMD的GPU基本没有什么支持,可以不…

基于无人机遥感的烟株提取和计数研究

一.研究的背景、目的和意义 1.研究背景及意义 烟草作为我国重要的经济作物之一,其种植面积和产量的准确统计对于烟草产业的发展和管理至关重要。传统的人工烟株计数方法存在效率低、误差大、难以覆盖大面积烟田等问题,已无法满足现代烟草种植管理的需求…

《深度学习实战》第3集:循环神经网络(RNN)与序列建模

第3集:循环神经网络(RNN)与序列建模 引言 在深度学习领域,处理序列数据(如文本、语音、时间序列等)是一个重要的研究方向。传统的全连接网络和卷积神经网络(CNN)难以直接捕捉序列中…