Kafka容量规划

Kafka Capacity Planning

我的雇主有一个 Kafka 集群来处理有价值的数据。有什么方法可以让我们了解我们的集群 运行 的容量百分比是多少?我们的集群能否处理更大的流量?一个节点宕机能活一个小时还是一天?

我不确定确切你的意思,所以我将采用广泛传播的方法。

容量是指、"will my Kafka cluster hold all my logs?"。这是一个函数:

如果您有 2 周的保留期,没有日志压缩(当消息消失时它就消失了),没有日志压缩,并且在这两周内您希望推送 10,000 条消息(在这 2 周内)有 1k 大并且被复制了 3 次...你最好有 30,000k 的存储空间,或 30MB。

至于进一步的计算,集群的大小以及在出现问题之前可以关闭多少台机器,磁盘 space,IO,- 诸如此类的操作问题,这里有一些看起来很棒的链接主题:

如果你的意思是容量,"How much Kafka traffic can my Kafka cluster, aka the "我的 Kafka 集群中的物理“盒子处理?”:即 Kafka 在你的盒子上存储数据的速度有多快,那就是另一个问题。如果您想知道(例如)哪种 AWS 实例类型处理 Kafka 数据最快,或者为 JVM 提供多少内存/您还可以在该代理上 运行 什么,那么这是一件好事。

这里值得注意的是,从 Unix 的角度来看,more the Unix kernel can use for a file cache 上的可用内存越多(所以不要天真地把它全部交给 JVM ;))。网卡的类型/容量也很重要。

这里有一些有趣的东西要读:

考虑到理论最大值 ("more than you'll ever need"), 可能值得测试您的个人代理/安装。要么使用 Ranger,一个类似的工具,要么只是向它转储大量真实数据(也许同时测试你的数据管道,过渡到我的下一个点......)

如果您指的是容量,"How long, mean or median time, does it take for a message to pass through my data pipeline, getting produced into Kafka, consumed by a microservice, transformed, produced into a new topic, consumed again... and eventually landing at the end of the microservice cluster / data pipeline?"

这是一个函数:

  • 你有多少can partition the data
  • 如果您的消费者组中有足够的消费者来处理所有分区
  • 每个微服务处理需要多长时间

假设您有一个很好的分区级并发策略,我会向每条消息添加跟踪信息。如果您想保持简单,愚蠢,可以在您的消息中添加 "time of initial ingest" 字段。对于更复杂的跟踪,您可以为每条消息传递一个跟踪 ID(最初的生产者创建它,所有其他消费者只是传递它,或者如果您将消息拆分为位,则将其用于亲子关系等)。如果您有初始摄取时间,那么您的最后一个微服务可以检查当前时间并计算您的计算长度指标。

不同的微服务将花费不同的时间来处理它们的消息。如果你有一个跟踪 ID,你可以做一些有趣的事情,比如让每个微服务写入一个 Kafka 主题,说明当前服务处理当前消息所花费的时间。 (将更多的 Kafka 应用于您的 Kafka 问题!)。或者让每个主题都写入一个搜索数据存储,并在数据上设置一个小的 TTL:例如,使用 Elasticsearch 查询最近的 Kafka 数据,这样你就可以获得跨主题的搜索结果,这是我见过的一个巧妙的技巧。然后你可以看到微服务 5 很慢,你需要花一些时间对其进行性能调优。

编辑:你也可能有幸用LinkedIn's Burrow tool for Kafka监控你的生产管道(看起来它还在2017年积极获得爱),将监控看看是否您的消费者以及其他方面都落后了。

希望对您有所帮助。不幸的是,这是一个表面上出现的更广泛的问题。最终,它是 % disk space、% CPU 和 % 数据管道周围的 SLA 的函数……这有时归结为独特的因素,例如消息大小、类型您正在或想要 运行 的机器,以及您的微服务有多快。 Kafka 技术可以处理惊人的流量:LinkedIn 不是一个小网站,互联网上一些流量最大的网站都使用 Kafka。从理论上讲,一个构建良好的代理集群应该能够处理你扔给它的任何东西。实际部分是当涉及到您的工作流程时,您的需求是什么,您实际用它做什么等等。