记Mysql ES 数据一致性问题及方案
业务中使用了mysql和ElasticSearch。Mysql作为主仓库,ES作为索引,实际上包含了接近全集的数据。问题:Mysql和Es未做事务,出现了并非场景下:A线程从MySql读,写到ESB线程从mysql、ES删除结果是最终ES中出现了A线程写入的数据,出现了数据不一致的问题。解决方案:1。 对数据加锁,但是此场景为分布式场景,需要使用redis锁,需要考虑性能开销和公平队列问题。锁的粒
·
业务中使用了mysql和ElasticSearch。Mysql作为主仓库,ES作为索引,实际上包含了接近全集的数据。
问题:
Mysql和Es未做事务,出现了并非场景下:
A线程从MySql读,写到ES
B线程从mysql、ES删除
结果是最终ES中出现了A线程写入的数据,出现了数据不一致的问题。
解决方案:
1。 对数据加锁,但是此场景为分布式场景,需要使用redis锁,需要考虑性能开销和公平队列问题。锁的粒度要从写线程的读开始。
2。最终一致性:发生改变时,通过消息队列发送此次改变,消费时验证数据是否一直,不一致则修改到一致,消费成功。如果消费时再发送改变,在下次消息消费中再次验证。
3。解析mysql binlog,直接同步到es,可以在中间使用消息队列削峰。
更多推荐
已为社区贡献1条内容
所有评论(0)