如何保障流式处理的数据一致性

背景

相对于传统的Hadoop这样的batch分析平台,流式分析的优点就是实时性, 即可以在秒级别延迟上得到分析结果 。
当然缺点是, 很难保证强一致性,即Exactly-Once语义 (在海量数据的前提下,为了保障吞吐量,无法使用类似事务的强一致性的方案)。
一般流式分析平台都会promise较弱的一致性,即Least-Once语义,保证数据不丢但允许数据重复。

但这只是在正常的情况下,当流式分析的任一环节发生故障,整个流被堵塞时,会导致层层队列被打满,最终仍然是会丢数据的。

所以对于流式分析平台,如果要保证一致性,必须借助外部的Replay的能力。

Lamda架构

Storm的作者Nathan在How to beat the CAP theorem文中提出著名的Lamda架构来解决实时系统的一致性问题。

原理其实很简单,既然流式分析没法保证一致性,那么我们就用Hadoop存全量数据,通过batch数据分析来保证强一致性。
流式分析只用来计算实时热数据,而冷数据由离线计算来做,用户查询的时候,只需要把两份数据做下merge。

从严格意义上讲,这个不能算beat CAP,因为只是结合Batch分析的强一致性和流式分析的高可用性而形成的架构。
但确实给流式分析如何保证一致性,提出了一个非常有建设性的方案。

Lamda架构的缺陷也很明显,太复杂,太重,需要搭建实时和离线两套系统,对运维而言成本过高。
更麻烦的是,分析逻辑需要实现两次,虽然现在有类似Summingbird这样的方案,但还是比较理想化,面对海量数据的现实,还是很骨感的。

Linkedin的架构

针对这个问题,Linkedin的架构师Jay Kreps在Questioning the Lambda Architecture文中,提出一种单纯基于Kakfa和流式分析的架构,

原理也不复杂,就是充分利用Kafka的replay能力,只要磁盘足够,用kafka可以保存足够久的数据 。
并且由于kafka的数据存在磁盘上,是可以被重复读取的,这也是Kafka在流式场景下更优于其他队列中间件的原因。

1. 用流式job_n去实时计算热数据,结果存入table_n,可以用于用户实时查询 。
2. 在需要的时候(发生故障数据部分丢失或处理逻辑发生变化)开启流式job_n+1来处理全量数据,存入table_n+1,当数据catch up的时候,把用户流量切到table_n+1 。
3. 删除job_n和table_n。

这个架构比较轻,并且确实可以在很大程度上解决流式分析平台的一致性问题,也可以用做参考。

 

Tradeoff方案

但是对于我们的场景,这个方法太理想化:

原因是数据量太大,存储7天的日志需要近2PB的磁盘空间(kafka需要做replica)。

如果要在可接受时间范围内replay完这些数据,所需要的分析资源也是很难满足。

并且线上业务做数据源的切换也不是那么简单的事。

所以我们的思路是,补全丢失的数据,而非replay全量数据。

步骤1. 重置线上job至kafka latest offset,读最新的数据。
用线上Job去补旧数据,会很影响用户的体验,因为实时流量本身就很大,catchup的速度会比较慢,会导致用户长时间看不到最新日志。

步骤2. 找出需要补全数据。
这步方法有很多,我们的方法是,
用monitorBolt提供实时业务监控,我们可以知道服务什么时候异常,什么时候恢复(秒级别)。

步骤3. 启动Catchup Job,从earliest offset开始读。
通过配置在处理bolt里设置时间过滤条件,只处理规定时间范围内的数据,其余的数据全部丢弃。

步骤4. 数据恢复后,停止Catchup Job。

这个方案可以解决数据不丢的需求,当然这个方案也并不完美,问题如下,

1. 无法保证Exactly-Once,只能保证Least-Once
因为发生异常的10小时中,还是有比较少量的日志数据是被成功写入的, replay时,这部分数据会重复。

2. 读取了部分不需要被replay的数据
为了简单处理,我们的catchup Job是从earliest offset开始读的,并在业务bolt里面进行过滤。
更好的方式,是定期在kafkaspout中对已处理的offset做checkpoint(比如分钟级别),
然后恢复的时候,可以从某个checkpoint开始读,这样更精确些,但方案上会复杂很多。

我们最终通过这种方案找回了丢失的用户Sql日志,可以作为一种思路给大家借鉴。

总结

CAP理论对于流式处理仍然奏效,并没有被beat。
对于流式处理这样强调高数据可用性的场景,要保证数据的强一致性是需要依赖于外部系统的Replay能力的,并且对于海量数据是要付出很大的资源代价的(存储和处理)。

实战中,我们通过一定tradeoff,可以做到在有限资源的情况下,保证流式处理中发生故障时,仍然可以保证Least-Once的一致性。

时间: 2024-10-29 20:45:16

如何保障流式处理的数据一致性的相关文章

流式处理框架对比

分布式流处理是对无边界数据集进行连续不断的处理.聚合和分析的过程,与MapReduce一样是一种通用计算框架,期望延迟在毫秒或者秒级别.这类系统一般采用有向无环图(DAG).DAG是任务链的图形化表示,用它来描述流处理作业的拓扑.在选择不同的流处理系统时,通常会关注以下几点: 运行时和编程模型:平台框架提供的编程模型决定了许多特色功能,编程模型要足够处理各种应用场景. 函数式原语:流处理平台应该能提供丰富的功能函数,比如,map或者filter这类易扩展.处理单条信息的函数;处理多条信息的函数a

翻译-In-Stream Big Data Processing 流式大数据处理

相当长一段时间以来,大数据社区已经普遍认识到了批量数据处理的不足.很多应用都对实时查询和流式处理产生了迫切需求.最近几年,在这个理念的推动下,催生出了一系列解决方案,Twitter Storm,Yahoo S4,Cloudera Impala,Apache Spark和Apache Tez纷纷加入大数据和NoSQL阵营.本文尝试探讨流式处理系统用到的技术,分析它们与大规模批量处理和OLTP/OLAP数据库的关系,并探索一个统一的查询引擎如何才能同时支持流式.批量和OLAP处理. 在Grid Dy

从Storm和Spark Streaming学习流式实时分布式计算系统的设计要点

0. 背景 最近我在做流式实时分布式计算系统的架构设计,而正好又要参见CSDN博文大赛的决赛.本来想就写Spark源码分析的文章吧.但是又想毕竟是决赛,要拿出一些自己的干货出来,仅仅是源码分析貌似分量不够.因此,我将最近一直在做的系统架构的思路整理出来,形成此文.为什么要参考Storm和Spark,因为没有参照效果可能不会太好,尤其是对于Storm和Spark由了解的同学来说,可能通过对比,更能体会到每个具体实现背后的意义. 本文对流式系统出现的背景,特点,数据HA,服务HA,节点间和计算逻辑间

流式处理框架storm浅析

前言前一段时间参与哨兵流式监控功能设计,调研了两个可以做流式计算的框架:storm和spark streaming,我负责storm的调研工作.断断续续花了一周的时间看了官网上的doc和网络上的一些资料.我把所学到的总结成一个文档,发出来给对storm感兴趣的同事做入门引导. storm背景随着互联网的更进一步发展,从Portal信息浏览型到Search信息搜索型到SNS关系交互传递型,以及电子商务.互联网旅游生活产品等将生活中的流通环节在线化.对效率的要求让大家对于实时性的要求进一步提升,而信

流式计算形态下的大数据分析

1 介 绍 1.1 流式计算介绍 流式大数据计算主要有以下特征: 1)实时性.流式大数据不仅是实时产生的,也是要求实时给出反馈结果.系统要有快速响应能力,在短时间内体现出数据的价值,超过有效时间后数据的价值就会迅速降低. 2)突发性.数据的流入速率和顺序并不确定,甚至会有较大的差异.这要求系统要有较高的吞吐量,能快速处理大数据流量. 3)易失性.由于数据量的巨大和其价值随时间推移的降低,大部分数据并不会持久保存下来,而是在到达后就立刻被使用并丢弃.系统对这些数据有且仅有一次计算机会. 4)无限性

含有过滤功能的android流式布局

FilterFlowLayout 含有过滤功能的流式布局, 参考FlowLayout 可以去除宽度不在范围(比例或真实值)内的子view 可以设置最大行数 可以添加组件间水平间距 可以添加行间距 系统要求 Android 4.0以上 快速使用 <me.codeboy.android.lib.FilterFlowLayout xmlns:cb="http://schemas.android.com/apk/res-auto" android:id="@+id/filter

Calcite中的流式SQL

Calcite中的流式SQL Calcite中的流式SQL总体设计思路 总体语法应该兼容SQL,这个是和目前流处理SQL的发展趋势是一致的. 如果部分功能标准SQL中没有包含,则尽量采用业界标杆(Oracle).比如模式匹配的功能,目前流处理中还没有针对语法达成共识,那么在设计上,就采用Oracle data warehouse的Match Recognize的方式.还有滑窗功能. 如果还有功能目前业界标杆都没有,那么就通过函数的方式拓展,翻滚窗口和跳动窗口,这两个窗口在标准SQL中都是不包含的

静态、自适应、流式、响应式四种网页布局有什么区别?

响应式与自适应的原理是相似的,都是检测设备,根据不同的设备采用不同的css,而且css都是采用的百分比的,而不是固定的宽度. 不同点是响应式的模板 在不同的设备上看上去是不一样的,会随着设备的改变而改变展示样式. 而自适应不会,所有的设备看起来都是一套的模板,不过是长度或者图片变小了,不会根据设备采用不同的展示样式. 流式就是采用了一些设置,当宽度大于多少时怎么展示,小于多少时怎么展示,而且展示的方式向水流一样,一部分一部分的加载. 静态的就是采用固定宽度的了.

Android自定义之流式布局

流式布局,好处就是父类布局可以自动的判断子孩子是不是需要换行,什么时候需要换行,可以做到网页版的标签的效果.今天就是简单的做了自定义的流式布局. 具体效果: 原理: 其实很简单,Measure  Layout.只需要这两个步骤就可以搞定了.完全的手动去Measure  Layout. 我们看一下代码. 解释就在代码里面做注释了,因为使用为知笔记写的博客,格式不符合代码格式.大家可以看具体的源码.最后又源码下载地址. 1.Measure  测量 @Override protected void o