章
目
录
本文主要讲解关于五,如何如何保证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),学习愉快哦!