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

后端 潘老师 6个月前 (11-23) 158 ℃ (0) 扫码查看

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

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

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

1,双写

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

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

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

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

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

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

2,MQ 异步消费

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

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

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

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

3,扫表定时同步

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

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

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

4,监听binlog

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

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

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

拓展:

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

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


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/back/11769.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】