业务中使用了mysql和ElasticSearch。Mysql作为主仓库,ES作为索引,实际上包含了接近全集的数据。

问题:

Mysql和Es未做事务,出现了并非场景下:

A线程从MySql读,写到ES

B线程从mysql、ES删除

结果是最终ES中出现了A线程写入的数据,出现了数据不一致的问题。

解决方案:

1。 对数据加锁,但是此场景为分布式场景,需要使用redis锁,需要考虑性能开销和公平队列问题。锁的粒度要从写线程的读开始。

2。最终一致性:发生改变时,通过消息队列发送此次改变,消费时验证数据是否一直,不一致则修改到一致,消费成功。如果消费时再发送改变,在下次消息消费中再次验证。

3。解析mysql binlog,直接同步到es,可以在中间使用消息队列削峰。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐