也就是同步调用,这是一种最为简单的方式,在将数据写到mysql时,同时将数据写到ES。
1.业务逻辑简单
2实时性高
1.硬编码,有需要写入mysql的地方都需要添加写入ES的代码
2.业务强耦合
3.存在双写失败丢数据风险
4.性能较差:本来mysql的性能不是很高,再加一个ES,系统的性能必然会下降。
ES系统不可用;
程序和ES之间的网络故障;
程序重启,导致系统来不及写入ES等。
针对这种情况,有数据强一致性要求的,就必须双写放到事务中来处理,而一旦用上事物,则性能下降更加明显。
针对多数据源写入的场景,可以借助MQ实现异步的多源写入,这种情况下各个源的写入逻辑互不干扰,不会由于单个数据源写入异常或缓慢影响其他数据源的写入,虽然整体写入的吞吐量增大了,但是由于MQ消费是异步消费,所以不适合实时业务场景。
性能高
不易出现数据丢失问题,主要基于MQ消息的消费保障机制,比如ES宕机或者写入失败,还能重新消费MQ消息。
多源写入之间相互隔离,便于扩展更多的数据源写入
硬编码问题,接入新的数据源需要实现新的消费者代码
系统复杂度增加:引入了消息中间件
可能出现延时问题:MQ是异步消费模型,用户写入的数据不一定可以马上看到,造成延时。
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)数据同步
具体步骤如下:
读取mysql的binlog日志,获取指定表的日志信息;
将读取的信息转为MQ;
编写一个MQ消费程序;
不断消费MQ,每消费完一条消息,将消息写入到ES中。
没有代码侵入、没有硬编码;
原有系统不需要任何变化,没有感知;
性能高;
业务解耦,不需要关注原来系统的业务逻辑。
构建Binlog系统复杂;
如果采用MQ消费解析的binlog信息,也会像方案二一样存在MQ延时的风险。
业界目前较为流行的方案:使用canal监听binlog同步数据到es
请移步:
Docker部署Canal监听MySQL binlog
SpringBoot整合Canal实现MySQL与ES数据同步
结束~