4

我的雇主有一个 Kafka 集群来处理有价值的数据。有什么方法可以让我们了解我们的集群运行的容量百分比是多少?我们的集群可以处理更大的流量吗?如果单个节点出现故障,我们可以存活一个小时或一天吗?

4

1 回答 1

22

我不确定你的意思是什么,所以我将采取广泛的方法。

容量是指“我的 Kafka 集群会保存我所有的日志吗?”。这是一个函数:

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

就进一步的计算而言,围绕集群的大小以及在出现问题、磁盘空间、IO 之前可以关闭多少台机器 - 诸如此类的操作问题,这里有一些关于该主题的很棒的链接:

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

这里值得注意的是,从 Unix 的角度来看,您在机器上拥有的空闲内存越多,Unix 内核就越能将其用于文件缓存(所以不要天真地把它全部交给 JVM ;))。而且网卡的类型/容量也很重要。

这里有几件有趣的事情要读:

有了理论上的最大值(“比你需要的更多”)的想法,测试你的个人经纪人/安装可能值得的。使用 Ranger,一个类似的工具,或者只是在其中转储大量真实数据(也许同时测试您的数据管道,过渡到我的下一点......)

如果用容量来表示,“一条消息通过我的数据管道、生成到 Kafka、被微服务消费、转换、生成到新主题、再次消费需要多长时间、平均或中值时间...... . 并最终登陆微服务集群/数据管道的末端?”

这是一个功能:

  • 您可以对数据进行多少分区
  • 如果您的消费者组中有足够的消费者来处理所有分区
  • 每个微服务需要多长时间处理

假设您有一个很好的分区级并发策略,我会在每条消息中添加跟踪信息。如果您想保持简单,傻瓜,可以在您的消息中添加“初始摄取时间”字段。对于更复杂的跟踪,您可以将跟踪 ID 与每条消息一起传递(初始生产者创建此 ID,所有其他消费者只需将其传递,或者如果您将消息拆分为比特,则将其用作父辈等)。如果您有初始摄取时间,那么您的最后一个微服务可以检查当前时间并计算您的计算长度指标。

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

编辑:您还可能有幸使用LinkedIn 的 Burrow Kafka 工具监控您的生产管道(看起来它仍在 2017 年积极获得爱),将监控您的消费者是否落后,以及其他事情。

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

于 2018-03-20T14:06:50.270 回答