MySQL与ES数据同步的四种方案及实践演示

文章目录

  • 一、同步双写
    • 优点
    • 缺点
    • 双写失败风险
    • 项目演示
    • 二、异步双写(MQ方式)
      • 优点
      • 缺点
      • 项目演示
      • 三、基于Datax同步
        • 核心组件
        • 架构图
        • 支持的数据源及操作
        • 项目演示
        • 四、基于Binlog实时同步
          • 实现原理
          • 优点
          • 缺点
          • 项目演示

            一、同步双写

            也就是同步调用,这是一种最为简单的方式,在将数据写到mysql时,同时将数据写到ES。

            优点

            1.业务逻辑简单

            2实时性高

            缺点

            1.硬编码,有需要写入mysql的地方都需要添加写入ES的代码

            2.业务强耦合

            3.存在双写失败丢数据风险

            4.性能较差:本来mysql的性能不是很高,再加一个ES,系统的性能必然会下降。

            双写失败风险

            ES系统不可用;

            程序和ES之间的网络故障;

            程序重启,导致系统来不及写入ES等。

            针对这种情况,有数据强一致性要求的,就必须双写放到事务中来处理,而一旦用上事物,则性能下降更加明显。

            项目演示

            请移步:MySQL与ES数据同步之同步调用

            二、异步双写(MQ方式)

            针对多数据源写入的场景,可以借助MQ实现异步的多源写入,这种情况下各个源的写入逻辑互不干扰,不会由于单个数据源写入异常或缓慢影响其他数据源的写入,虽然整体写入的吞吐量增大了,但是由于MQ消费是异步消费,所以不适合实时业务场景。

            优点

            性能高

            不易出现数据丢失问题,主要基于MQ消息的消费保障机制,比如ES宕机或者写入失败,还能重新消费MQ消息。

            多源写入之间相互隔离,便于扩展更多的数据源写入

            缺点

            硬编码问题,接入新的数据源需要实现新的消费者代码

            系统复杂度增加:引入了消息中间件

            可能出现延时问题:MQ是异步消费模型,用户写入的数据不一定可以马上看到,造成延时。

            项目演示

            请移步:MySQL与ES数据同步之异步调用

            三、基于Datax同步

            DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、DRDS 等各种异构数据源之间高效的数据同步功能。

            核心组件

            Reader:数据采集模块,负责从源采集数据

            Writer:数据写入模块,负责写入目标库

            Framework:数据传输通道,负责处理数据缓冲等

            以上只需要重写Reader与Writer插件,即可实现新数据源支持

            从一个JOB来理解datax的核心模块组件:

            datax完成单个数据同步的作业,称为Job,job会负责数据清理、任务切分等工作;

            任务启动后,Job会根据不同源的切分策略,切分成多个Task并发执行,Task就是执行作业的最小单元

            切分完成后,根据Scheduler模块,将Task组合成TaskGroup,每个group负责一定的并发和分配Task

            架构图

            支持的数据源及操作

            项目演示

            请移步:DataX实现Mysql与ElasticSearch(ES)数据同步

            四、基于Binlog实时同步

            实现原理

            具体步骤如下:

            读取mysql的binlog日志,获取指定表的日志信息;

            将读取的信息转为MQ;

            编写一个MQ消费程序;

            不断消费MQ,每消费完一条消息,将消息写入到ES中。

            优点

            没有代码侵入、没有硬编码;

            原有系统不需要任何变化,没有感知;

            性能高;

            业务解耦,不需要关注原来系统的业务逻辑。

            缺点

            构建Binlog系统复杂;

            如果采用MQ消费解析的binlog信息,也会像方案二一样存在MQ延时的风险。

            业界目前较为流行的方案:使用canal监听binlog同步数据到es

            项目演示

            请移步:

            Docker部署Canal监听MySQL binlog

            SpringBoot整合Canal实现MySQL与ES数据同步


            结束~