Apache Kafka 持久化所有数据

Posted

技术标签:

【中文标题】Apache Kafka 持久化所有数据【英文标题】:Apache Kafka persist all data 【发布时间】:2016-10-27 01:34:24 【问题描述】:

使用Kafka as an event store时,如何配置日志永不丢失数据(v0.10.0.0)?

我见过(旧的?)log.retention.hours,我一直在考虑使用compaction keys,但是kafka 是否有一个选项永远不会删除消息?

或者是为保留期设定一个高得离谱的价值的最佳选择?

【问题讨论】:

【参考方案1】:

没有比使用高得离谱的保留期值更好的选择了。

公平警告:使用无限留存可能会对您造成一点伤害。

例如,默认行为只允许新订阅者从主题的开头或结尾开始,这至少从事件溯源的角度来看会很烦人。

此外,如果大规模使用 Kafka(假设每秒数万条消息),高性能存储将大大受益,如果采用永久保留策略,其成本将高得离谱。

仅供参考,Kafka 提供工具(例如 Kafka Connect)来轻松地将数据持久保存在廉价数据存储中。

【讨论】:

我不知道“仅从开始或结束”行为,这肯定是个问题。是否有解决方法来制作“阅读最后 100 条消息”之类的内容? 据我所知,您最好的选择是根据某些标准过滤掉消息(我猜您的数据中有一个基于时间的字段?)。【参考方案2】:

更新:It’s Okay To Store Data In Apache Kafka

如果您将保留时间设置为“永远”,这显然是可能的 或在主题上启用日志压缩,然后将保留所有数据 时间。但我认为人们真正要问的问题是 这是否可行,以及更多是否可行 完全疯了。

简短的回答是,这并不疯狂,人们一直这样做, 卡夫卡实际上是为这种用途而设计的。但首先,为什么 你可能想这样做吗?实际上有很多用例, 这里有一些:

【讨论】:

虽然这绝对是一篇有见地的文章,但我觉得它没有解决我对磁盘成本和实际数据重放的担忧。有这方面的信息吗?【参考方案3】:

关心数据重放和永久消息磁盘成本的人,只是想分享一些东西。

数据回放: 您可以将您的消费者消费者寻找到给定的偏移量。甚至可以查询给定时间戳的偏移量。然后,如果您的消费者不需要从一开始就知道所有数据,但数据的一个子集就足够了,您可以使用它。

我使用 kafka java 库,例如:kafka-clients。看: https://kafka.apache.org/0101/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#offsetsForTimes(java.util.Map)

和 https://kafka.apache.org/0101/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#seek(org.apache.kafka.common.TopicPartition,%20long)

磁盘成本:

您至少可以通过使用 Avro (https://avro.apache.org/docs/current/) 之类的东西并打开压缩来最大限度地减少磁盘空间的使用。

也许有一种方法可以使用符号链接来分隔文件系统。但这只是一个未经尝试的想法。

【讨论】:

以上是关于Apache Kafka 持久化所有数据的主要内容,如果未能解决你的问题,请参考以下文章

Kafka精华问答 | Kafka的主要应用场景有哪些?

Kafka持久化机制

kafka快速入门

kafka 技术介绍

Apache Kafka:下一代分布式消息系统

译文|选择 Apache Pulsar 而非 Kafka 的 10 个理由