Kafka压缩编解码器对比:Zstd vs. Snappy vs. Gzip

比较Kafka中Zstd、Snappy和Gzip压缩在延迟、CPU成本、网络使用、存储及生产者设置方面的表现。

Kafka压缩编解码器对比:Zstd vs. Snappy vs. Gzip

Kafka压缩改变了瓶颈所在:减少网络和磁盘流量,增加生产者和消费者的CPU工作。虽然Kafka擅长处理海量数据,但优化性能通常需要调整几个关键参数。在需要高吞吐量或网络受限的环境中,消息压缩是最关键的调优领域之一。

最佳的Kafka压缩编解码器取决于你的瓶颈是CPU、网络带宽、代理磁盘还是消费者容量。

理解Kafka中的压缩

Kafka允许生产者在将消息发送到代理之前对其进行压缩。代理存储压缩后的批次,消费者检索并解压数据。这个过程将计算负载从网络/磁盘层转移到CPU层。编解码器的选择至关重要,因为它决定了这些资源之间的平衡。

Kafka通常支持nonegzipsnappylz4zstd,但具体支持取决于代理和客户端版本。

配置压缩

压缩通常在生产者端通过compression.type属性进行配置。代理必须能够读取生产者使用的编解码器。

# 示例生产者配置
compression.type=zstd

深入探讨Kafka压缩编解码器

我们将根据典型的性能特征比较三种主要且常用的编解码器:Gzip、Snappy和Zstd。

1. Gzip(GNU Zip)

Gzip是一种成熟的通用压缩算法,基于DEFLATE算法。它通常提供强大的压缩能力,但在许多事件负载上,Zstd可以根据级别和数据形状与之匹配或超越。

  • 压缩比: 高,尤其适用于文本密集型负载。
  • CPU使用率: 高(压缩和解压都需要大量CPU时间)。
  • 延迟影响: 由于CPU使用率高,可能会引入明显延迟,尤其是在压缩大批次时。

最佳用途:存储节省和网络带宽节约至关重要,且CPU资源充足,或消息吞吐量要求相对较低的场景。

2. Snappy

Snappy由Google开发,旨在追求速度而非最大压缩比。它优先考虑非常快的压缩和解压速度,即使生成的文件大小比Gzip或Zstd更大。

  • 压缩比: 中等到低。
  • CPU使用率: 低(执行速度非常快)。
  • 延迟影响: 最小。Snappy以其对端到端延迟几乎无影响而闻名。

最佳用途: 高吞吐量系统中,低延迟是绝对首要任务。它通常是许多Kafka部署的默认选择,因为它最小化了计算瓶颈,同时仍提供一些网络节省。

3. Zstandard(Zstd)

Zstandard最初由Facebook(Meta)开发,是现代竞争者。Zstd旨在提供优于Snappy的性能,同时实现接近或优于Gzip的压缩比,具体取决于所选的压缩级别。

Zstd支持可调的压缩级别。Kafka客户端通过支持它的客户端中的编解码器特定配置来暴露这一点。

  • 级别1(快速): 在速度上通常优于Snappy,同时提供比Snappy更好的压缩。

  • 级别3-5(平衡): 常见的平衡点,在低CPU开销下提供良好的压缩比。

  • 级别10+(高): 接近Gzip的压缩比,但通常解压速度更快。

  • 压缩比: 可变(从中等到非常高)。

  • CPU使用率: 根据所选级别变化很大(可以低或高)。

  • 延迟影响: 在较低级别下通常非常低;与Snappy相当。

最佳用途: 几乎所有现代Kafka部署。Zstd提供了精确调整平衡的灵活性。如果需要低延迟,使用级别1或3。如果需要存储节省,使用更高级别(例如9或11)。

比较分析:选择你的编解码器

最佳编解码器完全取决于特定集群架构中的瓶颈。

编解码器 压缩比 压缩速度 解压速度 CPU开销 理想用例
Snappy 非常快 非常快 最低 延迟敏感、高吞吐量
Zstd(级别1-3) 中等 非常快 非常低 现代、平衡性能
Zstd(级别5-11) 中等 中等 灵活的存储/性能权衡
Gzip 最高 最高 存储归档、低吞吐量

实用决策指南

使用以下指南将你的需求映射到编解码器:

  1. 如果延迟至关重要(例如实时金融数据流): 选择SnappyZstd级别1。这些提供最少的CPU阻力。
  2. 如果存储成本至关重要(例如保留数据数月): 选择GzipZstd高级别(15+)。准备分配更多CPU资源。
  3. 对于通用高吞吐量系统: 强烈推荐Zstd(级别3或5)。它通常比Snappy提供更好的效率(每字节压缩的CPU更少),而不会牺牲太多速度。

示例配置:优化速度(Zstd)

如果你使用Zstd并希望获得接近Snappy的性能和稍好的压缩,可以在生产者配置中显式设置级别:

# 使用Zstd优先考虑速度的生产者配置
compression.type=zstd
compression.zstd.level=3

关于压缩级别的警告: Kafka客户端在支持的情况下暴露编解码器特定的级别设置,如compression.zstd.levelcompression.gzip.level;Snappy不能以相同方式调整级别。请注意,增加级别会显著增加压缩时间,这发生在批次发送之前

生产者和消费者的性能考虑

务必记住,压缩影响连接的两端:

生产者影响(压缩时间)

生产者必须等待整个记录批次准备好,然后压缩并发送。如果压缩时间超过linger.ms,生产者可能会过早或过晚发送批次。非常慢的压缩(如高级别Gzip)可能迫使生产者更频繁地发送更小的批次,增加请求开销。

消费者影响(解压时间)

消费者必须在处理数据之前花费CPU周期解压数据。如果消费者CPU满载,解压可能成为瓶颈,导致消费者滞后,即使网络吞吐量足够。解压速度通常比压缩速度更关键,因为它直接影响消费者延迟。

因此,像Snappy和Zstd(具有异常快速的解压例程)这样的编解码器比Gzip更受青睐,因为Gzip的解压例程相对较慢。

总结

对于新的Kafka工作负载,从Zstd的低或中等级别开始,然后用实际负载进行基准测试。当生产者或消费者CPU紧张且延迟最重要时,使用Snappy。仅在兼容性或存储减少超过额外CPU成本时使用Gzip。