关于ElasticSearch与Mysql之间数据一致性的理解

MySQL 作为业务数据库,ES 作为查询数据库,用来实现读写分离,缓解 MySQL 数据库的查询压力,可以应对海量数据的复杂查询。

而当选择es与mysql同时使用的时候,就不得不考虑他们之间数据的一致性问题,

1、同步双写

这是一种最为简单的方式,在将数据写到 MySQL 时,同时将数据写到 ES。

优点: 业务逻辑简单、实时性高。

缺点: 硬编码、业务强耦合、存在双写失败丢数据风险、性能较差等等

2、异步双写

针对多数据源写入的场景,可以借助 MQ 实现异步的多源写入

优点: 性能高、不易出现数据丢失问题,比如 ES 宕机或者写入失败,还能重新消费 MQ 消息; 多个写入相互隔离,便于扩展更多的数据源写入。

缺点: 硬编码问题,接入新的数据源需要实现新的消费者代码。 系统复杂度增加、异步消费具有一定的延时性

3、基于 Binlog 实时同步

步骤如下

  1. 读取 MySQL 的 Binlog 日志,获取指定表的日志信息;
  2. 将读取的信息转为 MQ;
  3. 编写一个 MQ 消费程序;
  4. 不断消费 MQ,每消费完一条消息,将消息写入到 ES 中。

优点: 没有代码侵入、原有系统不需要任何变化、性能高、业务解耦

缺点: 构建 Binlog 系统复杂、如果采用 MQ 消费解析的 Binlog 信息,也会像方案二一样存在 MQ 延时的风险。

4、代码定时器

还有一种居于sql处理的代码定时器方式,这里不做过多叙述,用处很少

总结

基于 Binlog 实时同步方案是目前最常用的

而很多的数据迁移工具都是基于 Binlog 订阅的方式实现,模拟一个 MySQL Slave 订阅 Binlog 日志,从而实现 CDC(Change Data Capture),将已提交的更改发送到下游,包括 INSERT、DELETE、UPDATE。

后续会学习其中一个叫Cannel的数据迁移工具,并将学习过程记录下