DB 与 Elasticsearch 混合应用之数据离线同步

作者介绍

李猛,Elastic Stack 深度用户,通过 Elastic 工程师认证,2012年接触 Elasticsearch,对 Elastic Stack 技术栈开发、架构、运维等方面有深入体验,实践过多种大中型项目;为企业提供 Elastic Stack 咨询培训以及调优实施;多年实战经验,爱捣腾各种技术产品,擅长大数据,机器学习,系统架构。

序言

首先解释下 即时、实时与离线 概念定义,最近碰到很多的认知误区,需要纠正下。

即时概念

当数据变更之后马上就可以查询变更,内部采用事务隔离机制,查询的数据必须阻塞直到数据更新完毕,如单实例关系数据库数据发生变更后,然后马上可查询到。

实时概念

在数据同步场景中,包括异构数据源和同构数据源之间,泛指在可接受的很快时间范围内同步完成,一般的认知是秒级左右,也可以毫秒或者微秒,依据业务需求与实现能力定义。如 MySQL 主从同步也做不到即时性,只能实时性,业务系统如果做读写分离,也仅限非即时数据

离线概念

相比实时定义,离线没有很强的时间即时性要求,一般强调数据的吞吐量,一般常规定义分钟级、小时级、自然天。如大数据BI应用中,数据同步要求普遍T+1。

DB 与 Elasticsearch 混合应用之数据离线同步

前一篇文章《DB与ES混合应用之数据实时同步》,我们主要分享了实战项目中基于CDC机制构建的数据实时同步技术方案,整体技术栈链路长,中间环节多,需要复杂的代码编程,投入成本高,不利于快速投入生产应用。实际在多数业务系统场景中,离线同步需求占比最高,下面这篇文章,我们主要探讨DB到ES的数据离线同步问题。

背景要求

DB到Elasticsearch离线同步的业务应用场景有很多,相比实时同步业务应用场景,更能体现选择Elasticsearch替代DB作为查询引擎的优越性,以下介绍几个离线同步的业务场景。

历史数据查询

在电商或者物流行业,日均会产生很多订单数据,未完成的订单数据实时性查询频率高,需要做很多上下游的数据流转处理;相反已经完成的订单数据查询频率不高,但是日积月累的历史订单数据会增加很快,若系统架构设计将实时数据与历史数据合并一起等同对待,那么运行一段时间数据系统会出现很多致命的性能问题,如实时数据查询更新会变慢,用户体验下降,历史数据查询量大,一次查询可能会将系统严重阻塞。

常规的做法是将实时数据与历史数据分离设计,实时数据查询频率高,单次查询数据量小,系统响应快;历史数据查询频率低,单次查询的数据量多,系统响应稍慢,甚至可以接受慢一些。

介于传统关系型数据库的局限性,同样采用 Elasticsearch 应对此系统场景,实时数据查询走Elastic实时集群,历史数据走Elastic历史集群,实时数据同步可以使用CDC机制,历史数据同步得需要专用离线通道方法。

DB 与 Elasticsearch 混合应用之数据离线同步

业务技术重构

随着公司业务调整与业务发展,业务系统也需要相应持续的重构,不仅业务模型要重构,技术架构也需要重构,由于人的原因或者技术发展的原因,原有的数据库系统难以满足业务需求,此时需要更换到更合适的数据库系统。

如很多基于Mongodb存储的业务系统,其实切换到Elasticsearch更加合适,速度更快,成本更低(后续案例在编辑...),那么系统重构之后就需要将数据从Mongodb全量同步到Elasticsearch,这也属于离线同步场景。

关系性数据库局限性就不用说了,大名鼎鼎的Mongodb其实也有很多业务应用短板,或者应用误区,如很多基于Mongodb存储的业务系统,其实切换到Elasticsearch更加合适,速度更快,成本更低,切换成本也很低(详细见另一篇文章《为什么要从Mongodb迁移到Elastic》),那么系统重构之后就需要将数据从Mongodb全量同步到Elasticsearch,这也属于离线同步场景。

DB 与 Elasticsearch 混合应用之数据离线同步

技术产品

离线同步相比实时同步,技术复杂度降低很多,场景苛刻需求也要小很多,因此技术方案的选择度更多,有很多非常优秀的专用工具产品,只需要稍微配置即可启用,下面我们介绍几个当下很流行的产品(个人喜好问题),简要分析它们的优秀特性以及架构原理。

Logstash

Logstash是Elastic官方产品,掌握Elastic-stack必备之一

• 基于Jvm平台JRuby语言开发,开源免费
• 产品架构设计简洁优秀, 模块设计层次分明, input -> filter -> output
• 支持pipeline模型,且多个pipeline之间可以相互依赖
• 产品功能丰富,支持的数据源众多,也支持自定义编辑,其中包括Ruby脚本
• 支持泛JDBC协议,采用SQL表达式,从DB抽取数据到ES,支持CRON定时,可做实时同步
• 与Elastic-stack可集成一体,在Kibana可以查看监控数据
• 单实例运行模式,多实例之间无集群通信,不支持集群,易掌握部署
• 非平台型工具,轻量级

Logstash 在开发圈中流行度不大,但在运维圈流行度很高,主要得益于ELK组合的概念普及,其实在数据同步方面,是最简单的最实用的产品工具之一

DB 与 Elasticsearch 混合应用之数据离线同步

Data X

DataX是阿里出品的数据同步工具,定位多种数据库之间离线数据同步

• 基于Java开发,插件机制
• 产品架构设计简单,两大概念模块,reader->writer
• 支持DB到Elastic数据同步,采用SQL表达式,仅限制离线同步
• 单实例运行模型,多实例之间无集群通信,无集群模式支持,易掌握使用
• 非平台型工具,轻量级

DataX工具称不上优秀,得益于阿里巴巴的名气,使用简洁与性能吞吐好,获得开发圈很大的支持,在很多一次性离线数据同步项目中,应用很广。

DB 与 Elasticsearch 混合应用之数据离线同步

NiFi

NiFi是Apache的*产品项目之一,由美国军方早期开发捐献开源,定位数据同步领域。

• 基于Java语言开发,插件机制,支持自定义开发
• 产品架构设计优秀,Processor 核心模块概念,
• 功能强大,支持复杂的脚本功能,包括java,javascript,python,ruby等
• 支持DB到Elastic数据同步,可采用SQL表达式方式,也可以采用CDC机制
• 即可实时同步,也可离线同步,且可支持多种Processor组合
• 友好的操作界面,可视化配置
• 平台型产品,支持集群部署
• 入门简单,精通门槛高

NiFi虽然历史悠久,但在国内知名度却不高,不如Hadoop圈的Sqoop等,不过CDH已经在最新版中集成。个人非常喜欢这款产品,因为其平台化的系统架构,前面介绍的DataX与Logstash都属于雕虫小技的工具。

DB 与 Elasticsearch 混合应用之数据离线同步

Flink

Flink是当前大数据圈最有人气的流式处理产品,在实时计算领域应用最广。

• 基于Java语言编写,平台型产品
• 分布式架构设计,机制功能丰富,支持检查点机制,程序容灾、状态持久等
• 丰富的编程模型,层次分为 Streaming->Dataset->Table->SQL
• 支持流式计算与离线计算,其中支持泛JDBC数据源离线同步到Elastic
• 集群化运行模式,需要自主编写数据处理代码。

Flink虽然定位在实时计算领域,但由于其底层架构设计的特点,离线计算支持也非常好,提供了友好的编程模型,可快速开发部署,类似的产品还有Spark,这里就不做更多的展开讨论。

DB 与 Elasticsearch 混合应用之数据离线同步

ETL工具

专业ETL产品太多了,就不展开讨论了,由专业的BI从业人员讲述更合适...

• Kettle
• DataStage
• Informatica

技术平衡

以上我们介绍了好几种当下流行的数据同步工具,有的支持离线同步,有的也支持实时同步,其实还有更多其它不错的工具产品,每一种工具产品都有它的局限性与优越性,千万不可一概而论,也不可全都上,需要综合业务与技术平衡。

客观认知

每种工具产品都有它的定位,需要客观的认知评估。在业务系统中数据离线同步场景需求多种多样,没有一个完美的产品可以应对所有场景需求。

如DataX属于直接型同步工具,中间没有数据处理功能,其Mysql模块虽然支持所谓的增量型同步,但分批次的连续型同步方式需要借助人工触发,这会造成一些不方便,但是数据吞吐量很好。

有一次客户现场服务说Logstash居然不支持JDBC写入数据的插件,然后得出结论此工具产品做的不好,理由是不满足多个数据库之间数据同步,考虑到他们属于传统实体企业就没有做过多的讨论,实际上Logstash已经做的非常好,适合的数据同步场景很多,相比DataX多了一个分批次连续的定时机制,不知道要减少多少工作量。

DB 与 Elasticsearch 混合应用之数据离线同步

混搭组合

业务系统中数据离线同步场景多种多样,单一工具产品无法完成所有场景,需要混合多种工具产品完成。

如NiFi平台型产品 ,功能很强大很丰富,也支持从本地文件读取数据,但是此方式太重,程序包本身很大,需要好几个G磁盘容量,可能需要同步的数据量都没有NiFi安装包大,所以此时应该选择一些单机版本的工具产品,如Logstash等

DB 与 Elasticsearch 混合应用之数据离线同步

技术融合

每种产品工具都有它的架构设计理念,有它的独特技术特点,掌握并很好融合需要一定的精力和时间,否则会出现很多衍生问题。如Flink从开发层面来看 ,入门简单并可完成数据同步代码的开发,但是真正复杂的是架构运维掌控能力,Flink是平台型产品,本身复杂度很高。

DB 与 Elasticsearch 混合应用之数据离线同步

技术融合能力分层

• 开发层面, 了解产品各种Api特性,能够熟练响应各种需求
• 架构层面,深入了解产品基本原理,对其基本的能力有很客观的认知
• 运维层面,掌握产品的运维能力,各种异常情况有响应的保障手段

结语

经验总结

数据同步是一个仁者见仁,智者见智的话题,成熟的产品工具可以快速响应需求,重新编写程序可以更好的定制化需求,因人而异,因需求而异。
Elastic有很多优秀特性,即可以应对实时数据场景,也可以应对历史数据场景,有点儿几乎无所不能。“Elastic用的好,下班下的早”。

内容来源

本文内容来源在业务系统中大量运用DB与ES混合实战,得出的一些实战与思考,提供后来者借鉴参考,内容原创转载请注明。

专题课程

Elastic目前在国内几乎所有信息科技公司都在使用,无论是几个人的工作室,还是规模千人大型公司,应用的领域非常广,非常受欢迎。Elastic虽然入门简单,要想使用好,需要很长时间磨合,为此,我们专门特点设计了专题课程。帮助个多人或公司用好。
首先从数据同步开始,包括离线数据同步与实时数据同步,如何把DB的数据导入到Elastic,且能应付各种数据请关注我们的《DB与ES数据同步实战专题》,实战课程理论很少,主要是案例代码,课程系列如下:

• Logstash系列
• DataX系列
• NiFi系列
• Flink系列
• CDC系列

声明:本文由原文作者“李猛”授权转载,对未经许可擅自使用者,保留追究其法律责任的权利。


DB 与 Elasticsearch 混合应用之数据离线同步

阿里云Elastic Stack】100%兼容开源ES,独有9大能力,提供免费X-pack服务(单节点价值$6000)

相关活动


更多折扣活动,请访问阿里云 Elasticsearch 官网

阿里云 Elasticsearch 商业通用版,1核2G ,SSD 20G首月免费
阿里云 Logstash 2核4G首月免费


DB 与 Elasticsearch 混合应用之数据离线同步

DB 与 Elasticsearch 混合应用之数据离线同步

上一篇:DB 与 Elasticsearch 混合应用之数据实时同步


下一篇:从MongoDB迁移到Elasticsearch后,我们减少了80%的服务器