如何保证ES与数据库数据的一致性

IT 文章2年前 (2023)发布 小编
0 0 0

本文主要讲解关于五,如何如何保证ES与数据库数据的一致性相关内容,让我们来一起学习下吧!

在使用es 的场景中,我们通常不会单单只用es,数据库存储也同时在用。 那么如何保证数据库和ES 的一致性呢?

我们通常有以下几种做法:

ad

程序员导航

优网导航旗下整合全网优质开发资源,一站式IT编程学习与工具大全网站

1,双写

Java代码中,对数据库和 ES进行双写,并且先操作 数据库,后操作ES,而且还需要把两个操作放到同一个事务中去。

@Transactional (rollbackFor = Exception)
public void update (Dta dta){
   updateDb(dta);
   updateEs(dta);
}

在以上逻辑中,如果ES 同步失败 事务会回滚。

如果写数据库成功,ES  超时,实际上ES 成功,这时候数据库回滚,导致数据不一致。这时候需要重试来保证最终一致性。

优点: 简单,容易实现,并且实时性比较高。

ad

AI 工具导航

优网导航旗下AI工具导航,精选全球千款优质 AI 工具集

缺点: 需要改代码,有侵入性,存在不一致情况。  本地事务中发生了外部调用 使得事务拉长,占用数据库连接,影响整体吞吐。

2,MQ 异步消费

在应用中,如果我们更新数据库了,那么就发一个mq 消息,然后数据库和Es 各自有个消费者, 各自进行消费,如果失败了 mq 有重试机制。

或者先入库,入库成功后,发个消息给es 消费。

优点:使用了mq ,进行了解耦。 异步操作提升性能。

缺点:mq 存在延迟,引入中间件增加系统复杂性。

3,扫表定时同步

如果数据实时性要求不高,可以定时扫表批量更新es.

ad

免费在线工具导航

优网导航旗下整合全网优质免费、免注册的在线工具导航大全

优点:没有入侵性,不耦合。

缺点:实时性差,轮询可能影响性能。给数据库查询带来压力。

4,监听binlog

通过监听数据库实时产生的binlog 来更新es ,目前市面上已经有成熟的架构可以使用。例如使用canal +kafka 对binlog 进行监听 消息队列进行消费。控制一致性。

优点:没有侵入性,解耦。对数据库也没什么压力。

缺点:需要引入第三方架构,增加系统复杂性。

拓展:

除了ES 与 数据库(mysql)数据一致性问题可以通过 cannal + Kafka 进行同步。 Redis 缓存也可以采用同样的方法。用于缓存与业务代码解耦。

以上就是关于如何保证ES与数据库数据的一致性相关的全部内容,希望对你有帮助。欢迎持续关注潘子夜个人博客(www.panziye.com),学习愉快哦!

© 版权声明

相关文章

暂无评论

暂无评论...