文章目录
上周听到公司新同事分享 MySQL 同步数据到 ES 的方案,发现很有意思,感觉有必要将这块知识点再总结提炼一下,就有了这篇文章。
1. 前言
在实际项目开发中,我们经常将 MySQL 作为业务数据库,ES 作为查询数据库,用来实现读写分离,缓解 MySQL 数据库的查询压力,应对海量数据的复杂查询。
这其中有一个很重要的问题,就是如何实现 MySQL 数据库和 ES 的数据同步,今天和大家聊聊 MySQL 和 ES 数据同步的各种方案。
我们先看看下面 4 种常用的数据同步方案。
2. 数据同步方案
2.1 同步双写
这是一种最为简单的方式,在将数据写到 MySQL 时,同时将数据写到 ES。
优点:
- 业务逻辑简单;
- 实时性高。
缺点: - 硬编码,有需要写入 MySQL 的地方都需要添加写入 ES 的代码;
- 业务强耦合;
- 存在双写失败丢数据风险;
- 性能较差,本来 MySQL 的性能不是很高,再加一个 ES,系统的性能必然会下降。
2.2 异步双写
针对多数据源写入的场景,可以借助 MQ 实现异步的多源写入。
优点:
- 性能高;
- 不易出现数据丢失问题,主要基于 MQ 消息的消费保障机制,比如 ES 宕机或者写入失败,还能重新消费 MQ 消息;
- 多源写入之间相互隔离,便于扩展更多的数据源写入。
缺点: - 硬编码问题,接入新的数据源需要实现新的消费者代码;
- 系统复杂度增加,引入了消息中间件;
- MQ是异步消费模型,用户写入的数据不一定可以马上看到,造成延时。
2.3 定时更新
上面两种方案中都存在硬编码问题,代码的侵入性太强,如果对实时性要求不高的情况下,可以考虑用定时器来处理:
- 数据库的相关表中增加一个字段为 timestamp 的字段,任何 CURD 操作都会导致该字段的时间发生变化;
- 原来程序中的 CURD 操作不做任何变化;
- 增加一个定时器程序,让该程序按一定的时间周期扫描指定的表&