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 持久化所有数据的主要内容,如果未能解决你的问题,请参考以下文章