【问题标题】:Handling a Large Kafka topic处理大型 Kafka 主题
【发布时间】:2019-10-26 02:22:41
【问题描述】:

我有一个非常大(消息数)的Kafka主题,每秒可能有超过20M的消息,但是,消息大小很小,只是一些纯文本,每个不到1KB,我可以使用多个分区每个主题,而且我可以使用多台服务器来处理一个主题,它们将使用主题中的一个分区...... 如果我需要 +100 台服务器来处理一个庞大的主题怎么办?

在单个主题上创建 +100 个或更多分区是否合乎逻辑?

【问题讨论】:

  • 这么多分区没什么问题。但是,您不需要服务器,只需要进程/线程

标签: apache-kafka partition


【解决方案1】:

在提及 Kafka 主题时,您应该定义“大”:

  • 就卷大小而言,大意味着大量数据。
  • 消息太大,需要时间从队列发送消息到客户端进行处理?
  • 对该主题的密集写作?在这种情况下,您是否需要尽可能快地处理读取? (即:我们能否将流程数据延迟大约 1 小时)
  • ...

在任何一种情况下,您都应该更好地从消费者方面考虑,以获得更好的设计主题和分区。例如:

  • 每条消息的处理时间很慢,消息之间的处理速度更快:在这种情况下,您应该创建许多分区。这就像负载平衡器和服务器的关系,您创建了许多工作人员来完成您的工作。
  • 如果只有一些消息类型,时间处理很慢,你应该考虑转移到一个新的主题。有一篇很好的文章:Should you put several event types in the same Kafka topic 解释了这个决定。
  • 消息的顺序重要吗?例如,消息 A 在消息 B 之前发生,则应首先处理消息 A。在这种情况下,您应该让所有相同类型的消息都进入同一个分区(只有同一个分区才能保持消息顺序),或者移动到单独的主题(只有一个分区)。
  • ...

在你对主题和分区进行了适当的设计之后,就会出现一个问题:每个主题应该有多少个分区。增加总分区会增加吞吐量,但同时也会影响可用性或延迟。有一些很好的主题 herehere 仔细解释了每个主题的总分区将如何影响性能。我认为,您应该直接在系统上进行基准测试以选择正确的值。这取决于您系统的许多因素:服务器机器的处理能力、网络容量、内存...

最后一部分,100 个分区不需要 100 台服务器。 Kafka 将尝试平衡服务器之间的所有分区,但这只是可选的。例如,如果您有 1 个主题和 7 个分区在 3 个服务器上运行,则将有 2 个服务器存储 2 个分区,1 个服务器存储 3 个分区。 (所以 2*2 + 3*1 = 7)。在较新版本的 Kafka 中,分区和服务器信息之间的映射将存储在 zookeeper 上。

【讨论】:

    【解决方案2】:

    如果您更具体并提供一些数字,例如您的预期每秒负载以及每条消息的大小等,您将获得更好的帮助,

    总的来说,Kafka 非常强大,在降神会之后,它将数据写入缓冲区并定期将数据刷新到磁盘。根据 Confluent 不久前所做的基准测试,具有 6 个节点的 Kafka 集群每秒支持大约 80 万条消息,下面是基准标记图片

    【讨论】:

      【解决方案3】:

      我们的朋友是对的,我推荐你看这本书

      卡夫卡,权威指南 内哈·纳赫德、格温·夏皮拉和托德·帕利诺

      你可以在47页找到答案

      如何选择分区数

      在选择数量时需要考虑几个因素 分区:

      • 您希望针对该主题实现的吞吐量是多少?

        例如,您希望每秒写入 100 KB 还是每次写入 1 GB 第二个?

      • 从单个分区消费时,您期望达到的最大吞吐量是多少?您将始终拥有最多一个消费者 从分区读取,所以如果你知道你的消费者速度较慢 将数据写入数据库,该数据库永远不会处理更多 每个线程写入它的速度超过每秒 50 MB,那么你知道 从分区消费时,您的吞吐量限制为 60MB。
      • 您可以通过相同的练习来估计单个分区的每个生产者的最大吞吐量,但由于生产者 通常比消费者快得多,跳过通常是安全的 这个。
      • 如果您根据键向分区发送消息,稍后添加分区可能非常具有挑战性,因此请计算吞吐量 基于您预期的未来使用情况,而不是当前使用情况。
      • 考虑您将在每个代理上放置的分区数量以及每个代理的可用磁盘空间和网络带宽。
      • 避免高估,因为每个分区都使用了broker上的内存和其他资源,并且会增加leader的时间 选举。考虑到这一切,很明显你想要很多 分区但不要太多。如果您对 主题的目标吞吐量和 con- 的预期吞吐量 sumers,您可以将目标吞吐量除以预期消耗 sumer 吞吐量并以这种方式得出分区数。所以如果我 希望能够从主题中写入和读取 1 GB/秒,我知道 每个消费者只能处理 50 MB/s,那么我知道我至少需要 20 分区。这样,我可以让 20 个消费者阅读该主题 并达到 1 GB/秒。如果您没有这些详细信息,我们的 经验表明,限制分区的大小 每天保留少于 6 GB 的磁盘通常会令人满意 结果。

      【讨论】:

        猜你喜欢
        • 2021-11-16
        • 2018-09-30
        • 2016-03-29
        • 2016-04-18
        • 1970-01-01
        • 2020-11-06
        • 2021-05-15
        • 2019-04-28
        • 1970-01-01
        相关资源
        最近更新 更多