MySQL 和 Elasticsearch 之间的数据同步

news/2025/3/1 23:46:33/

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.ppmy.cn/news/1575899.html

相关文章

Ecode前后端传值

说明 在泛微 E9 系统开发过程中,使用 Ecode 调用后端接口并进行传值是极为常见且关键的操作。在上一篇文章中,我们探讨了 Ecode 调用后端代码的相关内容,本文将深入剖析在 Ecode 中如何向后端传值,以及后端又该如何处理接收这些值…

FastAPI 学习与使用

一、基本要求: 1.python版本3.6支持异步编程与类型提示 type hints 2. http基础了解(get/post/put/delete)、状态码、请求协议等 3.推荐使用python虚拟环境进行开发环境隔离 python -m venv myenv source myenv/bin/activate # Linux/Mac myenv\Scripts\activat…

MS SQL 2008 技术内幕:T-SQL 语言基础

《MS SQL 2008 技术内幕:T-SQL 语言基础》是一部全面介绍 Microsoft SQL Server 2008 中 T-SQL(Transact-SQL)语言的书籍。T-SQL 是 SQL Server 的扩展版本,增加了编程功能和数据库管理功能,使得开发者和数据库管理员能…

MySQL 8.4 SQL 全攻略:所有知识点与实战场景

一、引言 MySQL 作为一款广泛使用的开源关系型数据库管理系统,在数据存储和管理领域占据着重要地位。MySQL 8.4 版本在性能、功能和安全性等方面都有了显著的提升。本文将全面介绍 MySQL 8.4 中 SQL 的各种知识点,并结合实战场景进行详细讲解&#xff0…

Spring Boot Admin 踩坑

记一次SpringBoot升级2.x以后遇到的一个小坑&#xff1a; 以前采用1.x的时候&#xff0c;在服务发现中心点击单个服务&#xff0c;可以查看当前服务的详细信息&#xff0c;配置文件只需要简单的配置&#xff0c; &#xff1a; 父级&#xff1a; <parent><groupId>…

雷军力荐学 AI,背后隐藏着怎样的时代密码?

本文围绕雷军力荐学 AI 展开&#xff0c;剖析 AI 发展现状、核心技术&#xff0c;阐述 C 在 AI 的应用&#xff0c;分析 AI 带来的机遇与挑战&#xff0c;还指明学习路径&#xff0c;强调个人学 AI 顺应时代且意义重大&#xff1b;欢迎大家阅读丫&#xff01;&#xff01;&…

【愚公系列】《Python网络爬虫从入门到精通》033-DataFrame的数据排序

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

Linux操作系统:基于ELK栈的日志分析系统与数据爬虫的设计与实现

基于ELK栈的日志分析系统与数据爬虫的设计与实现 摘要 随着信息技术的飞速发展&#xff0c;服务器运维和数据采集在现代企业中扮演着越来越重要的角色。日志分析系统能够帮助运维人员快速定位问题&#xff0c;提高系统稳定性&#xff1b;数据爬虫则可以用于采集互联网上的公开…