开发者社区> 问答> 正文

Sync ES是如何保证mysql中与es中的数据是一致的呢?

环境信息

canal 1.1.3 mysql 5.7 kafka 2.0

问题描述

将mysql中的数据同步至es中是如何保证两者之间数据是一致的呢?

我现在使用canal将mysql中的binlog同步至 kafka 中,然后java client从kafka中取出binlog使用es的bulk方式向es的一个索引中进行同步。

mysql中使用canal监听4张表,es中将这4张表所有的字段组合成1个索引,凡是涉及到这4张表的binlog都写入到kafka。

现在设想,如果从kafka中取出binlog向es同步的过程中出现了异常,就导致mysql和es的数据不一致,请问各位大神是否也在做mysql同步es呢?你们是怎么解决的呢?

感谢各位大神的分享

原提问者GitHub用户shubiao-yao

展开
收起
古拉古拉 2023-05-08 15:04:21 183 0
2 条回答
写回答
取消 提交回答
  • 通过 _id 啊

    原回答者GitHub用户rewerma

    2023-05-09 18:06:55
    赞同 展开评论 打赏
  • 对于数据一致性的问题,可以从以下几个方面考虑:

    1. Canal的同步机制:Canal作为一个基于MySQL binlog的增量数据同步工具,提供了多种同步模式和事务支持,并通过内置的ACK机制实现了binlog的幂等性,可以保证同一份binlog在重复消费时不会导致数据重复。

    2. 消费者的ACK机制:对于Kafka消费者来说,也需要通过ACK机制确保消息的幂等性和一致性,即消费了消息后要向Kafka集群发送ACK确认消息已经处理成功。如果消费者没有ACK或ACK失败,Kafka会将消息重新分配给其他未处理的消费者。

    3. ES写入的机制:在ES中,写入采用了版本控制和乐观锁机制。当写入一个文档时,会指定一个版本号,如果该版本号已经存在,则认为是更新操作,否则是新增操作。通过乐观锁机制,可以保证同时写入多个客户端的文档不会互相覆盖。

    以上三个机制的相互配合,可以保证数据的一致性。在应用实践中,还可以采用一些其他的策略来强制保证数据一致性,例如使用事务在MySQL和ES中同时提交或回滚,使用分布式事务管理器如Atomikos等来确保跨库的事务一致性等。

    2023-05-08 15:08:01
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
One Box: 解读事务与分析一体化数据库 HybridDB for MySQL 立即下载
One Box:解读事务与分析一体化数据库HybridDB for MySQL 立即下载
如何支撑HTAP场景-HybridDB for MySQL系统架构和技术演进 立即下载

相关镜像