首页 > 解决方案 > apache kafka的硬件要求

问题描述

我正在构建一个生产环境,我将在其中使用 Apache Kafka。我想知道最好的硬件组合以获得更好的性能。我将有 5000 笔交易/秒。

标签: apache-kafkainfrastructure

解决方案


您需要提供有关您的用例的更多详细信息,例如消息的平均大小等,但无论如何这是我的 2 美分:

Confluent 的文档可能会有所启发:

CPU
大多数 Kafka 部署往往对 CPU 要求相当轻。因此,确切的处理器设置比其他资源更重要。请注意,如果启用 SSL,CPU 要求可能会显着提高(具体细节取决于 CPU 类型和 JVM 实现)。

您应该选择具有多核的现代处理器。普通集群使用 24 台核心机器。

如果您需要在更快的 CPU 或更多内核之间进行选择,请选择更多内核。多核提供的额外并发性将远远超过稍快的时钟速度。

如何计算吞吐量计算吞吐量
也可能会有所帮助。例如,如果您每秒有 800 条消息,每条 500 字节,那么您的吞吐量为800*500/(1024*1024) = ~0.4MB/s. 现在,如果您的主题已分区,并且您有 3 个代理启动并运行,其中 3 个副本将导致0.4/3*3=0.4MB/s每个代理。

有关您的架构的更多详细信息,请参阅 Confluent 的白皮书Apache Kafka 和 Confluent 参考架构。这是内存使用部分,

ZooKeeper使用 JVM 堆,通常 4GB RAM 就足够了。由于不断的垃圾收集,堆太小会导致 CPU 过高,而堆太大可能会导致垃圾收集暂停时间过长和 ZooKeeper 集群内的连接丢失。

卡夫卡经纪人同时使用 JVM 堆和 OS 页面缓存。JVM 堆用于代理之间的分区复制和日志压缩。对于代理上的每个分区,复制需要 1MB(默认的 replica.max.fetch.size)。在 Apache Kafka 0.10.1 (Confluent Platform 3.1) 中,我们添加了一个新配置 (replica.fetch.response.max.bytes),将用于复制的总 RAM 限制为 10MB,以避免在复制时出现内存和垃圾收集问题。代理上的分区很高。对于日志压缩,计算所需内存比较复杂,如果您使用此功能,我们建议您参考 Kafka 文档。对于中小型部署,4GB 堆大小通常就足够了。此外,强烈建议消费者始终从记忆中读取,即 来自写入 Kafka 且仍存储在操作系统页面缓存中的数据。这需要的内存量取决于写入此数据的速率以及您期望消费者获得多远。如果您每个代理每小时写入 20GB 并且您允许代理在正常情况下落后 3 小时,您将需要为操作系统页面缓存保留 60GB。在消费者被迫从磁盘读取的情况下,性能将显着下降

Kafka Connect本身并不使用太多内存,但一些连接器在内部缓冲数据以提高效率。如果您运行多个使用缓冲的连接器,您需要将 JVM 堆大小增加到 1GB 或更高。

消费者每个消费者至少使用 2MB,在来自代理的大量响应(通常用于突发流量)的情况下最多使用 64MB。 每个生产者将有一个 64MB 的缓冲区。首先分配 1GB RAM,然后为每个生产者添加 64MB,为每个消费者计划添加 16MB。

在调整架构配置时,需要考虑许多不同的因素。我建议仔细阅读上述文档,监控您现有的集群和资源,最后相应地调整它们。


推荐阅读