top of page

将云存储与 Apache Kafka 结合使用以实现高效长期数据管理的最佳实践

Apache Kafka 以其高吞吐量和低延迟处理实时数据流的能力而闻名。但就长期数据存储而言,Kafka 的原生存储模型存在局限性。本文将探讨 Apache Kafka 如何管理长期数据,云存储桶作为一种替代方案的作用,以及如何将 Kafka 与云存储相结合以实现高效数据访问和检索的最佳实践。



从视线高度拍摄的云存储数据中心,可以看到成排的服务器和闪烁的指示灯。


Apache Kafka 如何处理长期数据存储

Apache Kafka 将数据存储在主题中,作为不可变日志存储在 Kafka broker 的本地磁盘上。这种设计支持流式处理场景下的快速读写。然而,由于以下原因,Kafka 的本地存储并未针对长期保留大量数据进行优化:


  • 存储限制:Kafka broker 的磁盘空间有限,因此无限期地保留数据成本高昂且复杂。

  • 保留策略:Kafka 通常使用基于时间或基于大小的保留策略来自动删除旧数据。

  • 恢复复杂性:对于非常大的数据集,在代理发生故障后从 Kafka 恢复数据可能具有挑战性。


Kafka 的存储模型非常适合短期到中期的数据保留,通常为几小时到几周。对于更长时间的数据保留,企业通常会考虑外部存储解决方案。


使用云存储桶代替 Kafka 队列

诸如 Amazon S3、Google Cloud Storage 或 Azure Blob Storage 之类的云存储桶为长期数据存储提供了可扩展、持久且经济高效的解决方案。许多架构不再仅仅依赖 Kafka 的内部存储,而是将较旧的 Kafka 数据卸载到云存储桶中。


云端对象和存储在存储桶中的对象

定位和检索信息的有效性

云存储桶是对象存储,而不是消息队列。这意味着:


  • 数据以文件或对象的形式存储,而不是以单个消息的形式存储。

  • 检索特定消息需要索引或分区策略。

  • 与 Kafka 本地存储相比,访问延迟更高。


为了提高检索效率,数据通常以支持快速查询和分区修剪的格式和结构存储。


数据格式和分区:Parquet 和 ORC

Apache Kafka 本身并不原生使用 Parquet 或 ORC 格式。这些列式存储格式因其压缩率高、查询效率高而在大数据生态系统中广受欢迎。


将 Kafka 数据导出到云存储时,许多团队会将消息转换为 Parquet 或 ORC 文件。这种方法具有以下优点:


  • 高效压缩可降低存储成本。

  • 列式布局通过仅读取相关列来加快查询速度。

  • 按时间、主题或其他键进行分区可以实现快速筛选。


例如,一种常见的做法是将 Kafka 消息批量处理成按日期和主题分区的每小时 Parquet 文件。这种结构便于下游分析工具快速定位和扫描相关数据。


将云存储与 Apache Kafka 结合使用的最佳实践


1. 将 Kafka Connect 与云存储接收器连接器结合使用

Kafka Connect 提供现成的连接器,用于将 Kafka 主题导出到云存储。这些连接器可自动处理批处理、文件格式转换和分区。


  • 选择支持 Parquet 或 ORC 输出的连接器。

  • 配置与查询模式一致的分区方案。

  • 设置合适的刷新间隔,以平衡延迟和文件大小。


2. 实施分层存储架构

分层存储将存储在 Kafka 代理中的热数据(最近、频繁访问的数据)与存储在云存储桶中的冷数据(较旧、不频繁访问的数据)分开。


  • 将最新数据保存在 Kafka 中,以实现快速流式传输和处理。

  • 将旧数据卸载到云存储,以实现经济高效的长期保留。

  • 使用 Apache Kafka 的分层存储功能(某些发行版中可用)或自定义管道等工具。


3. 仔细设计分区和命名规则

有效的分区是云存储中高效数据检索的关键。


  • 按日期/时间对数据进行分区,以支持基于时间的查询。

  • 在分区键中包含主题或事件类型以进行筛选。

  • 使用一致的文件命名规则可以简化索引。


4. 利用元数据和索引实现快速查找

由于云存储不是消息队列,因此对元数据进行索引至关重要。


  • 维护外部索引或目录(例如,AWS Glue、Apache Hive Metastore)。

  • 使用模式注册表来跟踪数据格式和版本。

  • 利用 Presto 或 Apache Spark 等与云存储和元数据集成的查询引擎。


5. 监控和管理数据生命周期

对云存储桶设置生命周期策略,以管理数据老化和成本。


  • 数据保留期限过后,可将其归档或删除。

  • 对于不常访问的数据,请使用存储类(例如 S3 Glacier)。

  • 自动清理以避免不必要的存储成本。


实际案例:流式分析管道

一家零售公司通过 Apache Kafka 流式传输交易数据。近期交易数据实时处理以进行欺诈检测。较早的交易数据则按小时以 Parquet 格式导出到 Amazon S3,并按日期和门店位置进行分区。


分析师使用 Amazon Athena 查询 S3 数据,Amazon Athena 可以高效地读取 Parquet 文件。这种配置减少了 Kafka broker 的存储需求,并提供了可扩展、经济高效的长期存储,同时保持了快速的查询性能。



bottom of page