11月03, 2020

最新性能测试:Kafka、Pulsar 和 Pravega 哪个最强?

1简介

流式系统持续地从一系列数据源注入并处理数据。这些系统建立在只追加(Append-Only)数据结构之上,实现高效的读写访问,目标在于达到较低的端到端延迟。随着5G/IoT边缘计算的客户端数量的不断增长,持续不断产生数据的容量一直在以指数级爆炸性增加[1][2]。这种增长给流式系统带来了很大压力,不仅要求这些系统能够以低延迟处理所有客户端生成的工作负载,还要能够以高吞吐量容纳大容量(PB/EB级别)数据。

Pravega(梵文“迅速”)是一套我们从头构建的开源流式存储系统,能够持续从数据源注入数据并满足此类流式工作负载的苛刻要求。它通过分层存储为每一个Stream(对流式数据的抽象,类比Kafka topic)提供存储无界数据的能力,同时达到弹性持久性一致性。Pravega的读写路径都被精心设计,以满足事件流生产和消费的低延迟和高吞吐。此外,Pravega还提供诸如长期保留(Retention)和扩展等特性。本文会对Pravega进行性能评估,重点关注读写性能。

为了对比不同的设计选择,我们还额外展示了来自其它系统的性能结果:Apache KafkaApache Pulsar。Pulsar和Kafka最初都被作为优秀的消息系统而为人熟知,但它们最近都做出了很大努力向存储系统方向发展,这两个系统最近都新增了分层存储的特性。然而,它们的设计选择具有根本性的不同,并导致了不同的行为以及性能特点。我们将会在本文探索这些不同点。

本文的主要的实验参数和结果亮点如下:

  • 整体注入性能。单个Pravega的Writer可以每秒产生超过一百万小型事件(100字节),以及为大型事件(10,000字节)保持350MB/s的吞吐量,并且在这两个场景下都能保持个位数毫秒数级的延迟(95%分位数,95th percentile)。
  • 持久性。Pravega总是在发回确认时保证数据的持久性。对于单Segment(类比 Kafka partition)的Stream,Kafka的写吞吐量至少比Pravega低40%,无论是否对每个消息进行刷新(flush)操作。对于16 Segment的Stream,Pravega的Writer与每消息进行刷新的Kafka Writer的吞吐量相仿,但Pravega的延迟 更低(几毫秒相比于Kafka的超过1秒)。
  • 能够动态调整的批处理。Pravega并不要求为客户端的批处理进行任何复杂配置。Pulsar可以达到低延迟或者高吞吐,但不能二者兼具。对于Kafka,当应用程序使用路由键(Routing Key)分区的时候,较大的批对吞吐量的影响很大(对于16 Segment的Stream,吞吐量降低了80%)。在这两种情况下,强制要求用户静态配置批处理都不是理想的解决方案。
  • 当存在大事件时,注重高吞吐量工作负载的行为。对于16 Segment的Stream和10kB大小的事件,Pravega取得了高达350MB/s的吞吐量。这一吞吐量比Pulsar在同配置下高40%,并与Kafka旗鼓相当(约有6%的差异)。然而,Kafka在这一配置下的延迟高达800毫秒,而Pravega却仅有几毫秒。
  • 端到端的延迟。当处于Stream的尾部时,Pravega的Reader同样提供仅数毫秒的端到端延迟,同时保持相当高的吞吐量。对于单Segment的Stream,它比Kafka的吞吐量更高(大约高80%)。对于Pulsar,增加Partition和Reader使得性能下降(单Partition用例所取得的吞吐量是16 Partition用例的3.6倍)。
  • 路由键(Routing Key)的使用。无论使用还是不使用路由键,Pravega并未表现出显著的性能差异。对于中高吞吐量的用例,当使用路由键时,Kafka和Pulsar表现出超过两倍的端到端延迟,尤其是对于Kafka,最大读取吞吐量降低了超过37%。
  • 追赶(Catch-up)读取和历史读取的分层存储。Pravega可以在具有100GB历史数据并且同时进行100MB/s新数据注入的情况下动态进行追赶读取。在相同场景下,Pulsar开启了分层存储后不能很好地进行追赶读取,表现为积压无限增长。
  • 自动扩展的性能。自动扩展是Pravega独有的特性,扩展一个Stream可以提供更高的注入性能。我们可以看到,在使用100MB/s恒定注入速率的情况下, Stream自动扩展使得写入延迟下降。

除了在展示时间序列的时候,我们都绘制了延迟随吞吐量的变化曲线。在现有的公开文章中,我们发现了一个普遍问题:它们要么只绘制延迟曲线,要么只绘制吞吐量曲线,然而对于流式负载,这二者其实是相互关联的。例如,当某个配置所得到的最大吞吐量看起来很优秀时,它的延迟很可能已经达到了几百毫秒甚至数秒的数量级。我们通过绘制延迟-吞吐量图像来避免这种具有误导性的结论。此外,我们还提供图表数据点所对应的表格数据作为补充。从完备性方面说,表格数据比图提供了更多信息(例如不同的百分等级)。

2背景

Pravega是一个复杂的系统,因此我们推荐读者深入阅读我们的文档,包括先前的博客文章。在这里,我们仅提供关于读写路径的简要概括,同时还有Kafka和Pulsar的一些要点。

点击查看原文>

本文链接:https://blog.jnliok.com/post/fp1TLWAUROkOXxq15qGf.html

-- EOF --

Comments