我的雇主有一个处理有价值数据的Kafka集群。有什么方法可以了解我们的集群以多少百分比运行容量?我们的集群能否处理更大的流量?如果单个节点出现故障,我们能存活一个小时或一天吗?
我不确定你到底是什么意思,所以我将采取一种广泛的方法。
容量是指"我的 Kafka 集群会保存我所有的日志吗?这是以下功能:
- 主题的保留期
- 您的日志压缩策略
- 卡夫卡消息的平均大小
- 您希望通过系统推送的消息量。
- 您的复制因子
- 您是否打开了压缩。另请参阅:Cloudflare's Squeezing The Firehose 文章
如果您有 2 周的保留期,没有日志压缩(当消息消失时,它就消失了),没有日志压缩,并且在这两周内,您希望推送 10,000 条消息(在这 2 周内),这些消息很大 1k 并复制了 3 次......您最好拥有30,000k的存储空间,即30MB。
至于进一步的计算,关于集群的大小以及在您遇到问题、磁盘空间、IO 之前可以关闭多少台计算机, - 诸如此类的操作问题,这里有一些关于该主题的很棒的链接:
- SO:卡夫卡拓扑最佳实践(答案)
- SO:如何决定卡夫卡集群大小(答案)
- Hortonworks:Kafka 0.9 配置最佳实践(我认为在过渡几年中在这方面没有太大变化)。
如果容量是指"我的 Kafka 集群(也就是我的 Kafka 集群中的"物理"盒子)可以处理多少 Kafka 流量?":即 Kafka 在盒子上存储数据的速度有多快,那么这是另一个问题。如果您想知道(例如)哪种 AWS 实例类型处理 Kafka 数据最快,或者为 JVM 提供多少内存/您可以在该代理上运行哪些其他内容,那么这是一件好事。
这里值得注意的是,从Unix的角度来看,盒子上的可用内存越多,Unix内核可用于文件缓存的就越多(所以不要天真地把它全部交给JVM;))。网卡的类型/容量也非常重要。
这里有一些有趣的东西可以阅读:
- Jay Kreps:基准测试Apache Kafka:在廉价机器上每秒写入200万次
- 使用游侠对卡夫卡进行负载测试
有了这个理论最大值("超过你需要的")的想法,测试你的个人经纪人/安装可能是值得的。要么使用Ranger,一个类似的工具,要么只是转储大量真实数据(也许测试你的数据管道,同时,过渡到我的下一点......
如果您所说的容量是指,"消息通过我的数据管道、生成到 Kafka、被微服务使用、转换、生成为新主题、再次使用需要多长时间、平均或中位数时间......并最终登陆微服务集群/数据管道的末端?
这是一个围绕以下方面的功能:
- 可以对数据进行多少分区
- 如果您的使用者组中有足够的使用者来处理所有分区
- 每个微服务需要多长时间来处理
假设您有一个关于分区级并发的良好策略,我会向每条消息添加跟踪信息。如果你想保持简单,愚蠢,也许在你的消息中添加"初始摄取时间"字段。对于更复杂的跟踪,您可以随每条消息一起传递一个跟踪 ID(初始生产者创建它,所有其他使用者只是传递它,或者如果您将消息拆分为位,则将其用于父子关系等)。如果有初始引入时间,则最后一个微服务可以检查当前时间并计算计算长度指标。
不同的微服务需要不同的时间来处理其消息。如果你有一个跟踪 ID,你可以做一些有趣的事情,比如让每个微服务写入 Kafka 主题,说明当前服务处理当前消息所花费的时间。(将更多的卡夫卡应用于你的卡夫卡问题!或者让每个主题都写入搜索数据存储,并在数据上有一个小的TTL:例如,使用Elasticsearch查询最近的Kafka数据,以便您可以跨主题获得搜索结果,这是我见过的一个巧妙的技巧。然后你可以看到微服务 5 很慢,你需要花一些时间调整它的性能。
编辑:你也可以运气好用LinkedIn的Kafka的Burrow工具监控你的生产管道(看起来它仍然在2017年积极获得爱),将监控你的消费者是否落后,以及其他事情。
我希望这有所帮助。不幸的是,这是一个表面上出现的更广泛的问题。归根结底,它是磁盘空间百分比、CPU 百分比和数据管道周围 SLA 百分比的函数......这有时归结为独特的因素,例如消息大小、您是或想要运行的计算机类型以及微服务的速度。Kafka 该技术可以处理惊人的流量:LinkedIn不是一个小网站,而 Kafka 被互联网上一些流量最大的网站使用。从理论上讲,一个结构良好的代理集群应该能够处理你扔给它的任何东西。实际部分是当涉及到您的工作流程时,您的需求是什么,您实际用它做什么等。