Apache kafka 为什么kafka集群中的单节点多代理不是首选?

Apache kafka 为什么kafka集群中的单节点多代理不是首选?,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,我正试图将卡夫卡应用到生产中。想知道为什么单节点、多代理kafka实例不是首选。很少有人建议,如果在单个节点上使用多个代理,则应为它们分配单独的磁盘空间,但这样做的原因尚不清楚 有人能解释一下单个代理与多代理kafka实例对单个节点的影响吗。如果您在一个节点上有多个代理,并且只有一个磁盘,那么所有代理都必须从一个磁盘读写。这使得系统进行大量的随机读取和随机写入,而Kafka集群的性能会很差 相反,如果在一个节点上有多个磁盘,并且每个代理都从不同的磁盘读写,那么就可以避免随机读写问题 更新 此外,

我正试图将卡夫卡应用到生产中。想知道为什么单节点、多代理kafka实例不是首选。很少有人建议,如果在单个节点上使用多个代理,则应为它们分配单独的磁盘空间,但这样做的原因尚不清楚


有人能解释一下单个代理与多代理kafka实例对单个节点的影响吗。

如果您在一个节点上有多个代理,并且只有一个磁盘,那么所有代理都必须从一个磁盘读写。这使得系统进行大量的随机读取和随机写入,而Kafka集群的性能会很差

相反,如果在一个节点上有多个磁盘,并且每个代理都从不同的磁盘读写,那么就可以避免随机读写问题

更新


此外,如果一台机器上有太多代理,网络带宽可能是一个瓶颈。由于所有代理都必须共享网络带宽。

与大多数事情一样,这个问题的答案是“视情况而定”。你的问题是一般性的。如果您能够更具体地了解您感兴趣的系统属性(性能、可用性等),这将有所帮助。从性能的角度来看,如果box(node)上有大量的资源,那么在box(node)上有大量的实例是很好的。但从可用性的角度来看,这对您没有帮助,即,如果一个节点发生故障,您的系统将出现单点故障,并且面临巨大的风险(除非您有多个这样的高资源节点可供使用:-))

如果在同一个节点上有多个代理,则可能只在一个节点上完成一个主题的所有分区。如果该节点出现故障,则特定主题将变得无响应。

每个主题都是特定的数据流(类似于数据库中的表)。主题被分为多个分区(可以任意多个),分区中的每条消息都会获得一个增量id,称为偏移量,如下所示

分区0:

+---+---+---+-----+
| 0 | 1 | 2 | ... |
+---+---+---+-----+
+---+---+---+---+----+
| 0 | 1 | 2 | 3 | .. |
+---+---+---+---+----+
分区1:

+---+---+---+-----+
| 0 | 1 | 2 | ... |
+---+---+---+-----+
+---+---+---+---+----+
| 0 | 1 | 2 | 3 | .. |
+---+---+---+---+----+
现在,卡夫卡集群由多个代理组成。每个代理都用一个ID标识,并且可以包含某些主题分区

2个主题的示例(每个主题分别有3个和2个分区):

经纪人1:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 2       |
|   Partition 1     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 2    |
|                   |
|                   |
|     Topic 2       |
|   Partition 0     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 1       |
|   Partition 0     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
经纪人2:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 2       |
|   Partition 1     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 2    |
|                   |
|                   |
|     Topic 2       |
|   Partition 0     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 1       |
|   Partition 0     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
经纪人3:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 2       |
|   Partition 1     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 2    |
|                   |
|                   |
|     Topic 2       |
|   Partition 0     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 1       |
|   Partition 0     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
请注意,数据是分布式的(Broker 3不保存主题2的任何数据)

主题应该有一个
复制因子
>1(通常为2或3),这样当一个代理关闭时,另一个代理可以提供主题的数据。例如,假设一个主题有两个分区,其中
复制因子设置为2,如下所示:

经纪人1:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 2       |
|   Partition 1     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 2    |
|                   |
|                   |
|     Topic 2       |
|   Partition 0     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 1       |
|   Partition 0     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
经纪人2:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 2       |
|   Partition 1     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 2    |
|                   |
|                   |
|     Topic 2       |
|   Partition 0     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 1       |
|   Partition 0     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
经纪人3:

+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 2       |
|   Partition 1     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 2    |
|                   |
|                   |
|     Topic 2       |
|   Partition 0     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|                   |
|                   |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 0    |
|                   |
|                   |
|     Topic 1       |
|   Partition 0     |
+-------------------+
+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

现在假设Broker 2失败了。代理1和3仍然可以为主题1提供数据。因此,
复制因子
为3始终是一个好主意,因为它允许出于维护目的关闭一个代理,也允许意外关闭另一个代理因此,Apache Kafka提供了强大的耐用性和容错保证。

感谢您的回复。我所读到的和观察到的是,kafka代理的CPU密集度较低,正如您所说,读/写工作量较大。因此,与其让多个代理分别在不同的机器上运行,不如添加磁盘并使用一台功能强大的机器,而不需要更多的内核。这样我将不得不使用更少的物理机器。这是一个好方法吗???@Aditya如果一台机器上有太多代理(即使有多个磁盘),网络带宽可能是一个瓶颈。因为这些代理必须共享网络带宽。因此,这是否是一种好方法取决于您的生产环境,您必须进行基准测试。