为什么不首选kafka集群中的单节点多代理?
Why single node multiple broker in kafka cluster not preferred?
我正在尝试将 kafka 实施到生产环境中。想知道为什么单节点、多代理 kafka 实例不是首选。很少有人建议如果在单个节点上使用多个代理,则应为它们分配单独的磁盘space,但这样做的原因尚不清楚。
有人可以解释单个节点上单个代理与多个代理 kafka 实例的影响。
如果您在具有单个磁盘的单个节点上有多个代理,则所有代理都必须读取和写入单个磁盘。这使得系统做大量的随机读和随机写,Kafka集群性能会很差。
相比之下,如果您在单个节点上有多个磁盘,并且每个代理从不同的磁盘读取和写入,那么您可以避免随机 read/write 问题。
更新
此外,如果一台机器上的代理太多,网络带宽可能会成为瓶颈。由于所有经纪人都必须共享网络带宽。
与大多数事情一样,这个问题的答案是 'it depends'。您的问题本质上是通用的。如果您可以更具体地说明您对系统的哪些属性感兴趣——性能、可用性等,这将会有所帮助。从性能的角度来看,如果它有很多资源,那么在盒子(节点)上有很多实例是很好的。但从可用性的角度来看,它对您没有帮助,即您的系统将出现单点故障,并且如果该节点恰好出现故障,则将面临巨大风险(除非您有多个如此高的资源节点供您使用:-))
如果您在同一个节点上有多个代理,那么最终可能只在单个节点中包含一个主题的所有分区。如果该节点失败,则特定主题将变得无响应。
每个主题,都是一个特定的数据流(类似于数据库中的table)。主题被分成 个分区 (任意多个),其中分区中的每条消息都有一个增量 ID,称为偏移量,如下所示。
分区 0:
+---+---+---+-----+
| 0 | 1 | 2 | ... |
+---+---+---+-----+
分区 1:
+---+---+---+---+----+
| 0 | 1 | 2 | 3 | .. |
+---+---+---+---+----+
现在一个Kafka集群是由多个broker组成的。每个代理都用一个 ID 标识,并且可以包含特定的主题分区。
2 个主题的示例(每个主题分别有 3 个和 2 个分区):
经纪人 1:
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 2 |
| Partition 1 |
+-------------------+
经纪人 2:
+-------------------+
| Topic 1 |
| Partition 2 |
| |
| |
| Topic 2 |
| Partition 0 |
+-------------------+
经纪人 3:
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
请注意,数据是分布式的(并且 Broker 3 不包含 topic 2 的任何数据)。
主题,应该有一个 replication-factor
> 1(通常是 2 或 3),这样当一个 broker 宕机时,另一个可以提供主题的数据。例如,假设我们有一个包含 2 个分区的主题,其中 replication-factor
设置为 2,如下所示:
经纪人 1:
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| |
+-------------------+
经纪人 2:
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 1 |
| Partition 1 |
+-------------------+
经纪人 3:
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
+-------------------+
现在假设 Broker 2 失败了。 代理 1 和 3 仍然可以为主题 1 提供数据。因此 replication-factor
3 始终是一个好主意,因为它允许为了维护目的而关闭一个代理还有另一个意外被取消。 因此,Apache-Kafka 提供了强大的持久性和容错保证。
我正在尝试将 kafka 实施到生产环境中。想知道为什么单节点、多代理 kafka 实例不是首选。很少有人建议如果在单个节点上使用多个代理,则应为它们分配单独的磁盘space,但这样做的原因尚不清楚。
有人可以解释单个节点上单个代理与多个代理 kafka 实例的影响。
如果您在具有单个磁盘的单个节点上有多个代理,则所有代理都必须读取和写入单个磁盘。这使得系统做大量的随机读和随机写,Kafka集群性能会很差。
相比之下,如果您在单个节点上有多个磁盘,并且每个代理从不同的磁盘读取和写入,那么您可以避免随机 read/write 问题。
更新
此外,如果一台机器上的代理太多,网络带宽可能会成为瓶颈。由于所有经纪人都必须共享网络带宽。
与大多数事情一样,这个问题的答案是 'it depends'。您的问题本质上是通用的。如果您可以更具体地说明您对系统的哪些属性感兴趣——性能、可用性等,这将会有所帮助。从性能的角度来看,如果它有很多资源,那么在盒子(节点)上有很多实例是很好的。但从可用性的角度来看,它对您没有帮助,即您的系统将出现单点故障,并且如果该节点恰好出现故障,则将面临巨大风险(除非您有多个如此高的资源节点供您使用:-))
如果您在同一个节点上有多个代理,那么最终可能只在单个节点中包含一个主题的所有分区。如果该节点失败,则特定主题将变得无响应。
每个主题,都是一个特定的数据流(类似于数据库中的table)。主题被分成 个分区 (任意多个),其中分区中的每条消息都有一个增量 ID,称为偏移量,如下所示。
分区 0:
+---+---+---+-----+
| 0 | 1 | 2 | ... |
+---+---+---+-----+
分区 1:
+---+---+---+---+----+
| 0 | 1 | 2 | 3 | .. |
+---+---+---+---+----+
现在一个Kafka集群是由多个broker组成的。每个代理都用一个 ID 标识,并且可以包含特定的主题分区。
2 个主题的示例(每个主题分别有 3 个和 2 个分区):
经纪人 1:
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 2 |
| Partition 1 |
+-------------------+
经纪人 2:
+-------------------+
| Topic 1 |
| Partition 2 |
| |
| |
| Topic 2 |
| Partition 0 |
+-------------------+
经纪人 3:
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
| |
+-------------------+
请注意,数据是分布式的(并且 Broker 3 不包含 topic 2 的任何数据)。
主题,应该有一个 replication-factor
> 1(通常是 2 或 3),这样当一个 broker 宕机时,另一个可以提供主题的数据。例如,假设我们有一个包含 2 个分区的主题,其中 replication-factor
设置为 2,如下所示:
经纪人 1:
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| |
+-------------------+
经纪人 2:
+-------------------+
| Topic 1 |
| Partition 0 |
| |
| |
| Topic 1 |
| Partition 1 |
+-------------------+
经纪人 3:
+-------------------+
| Topic 1 |
| Partition 1 |
| |
| |
| |
+-------------------+
现在假设 Broker 2 失败了。 代理 1 和 3 仍然可以为主题 1 提供数据。因此 replication-factor
3 始终是一个好主意,因为它允许为了维护目的而关闭一个代理还有另一个意外被取消。 因此,Apache-Kafka 提供了强大的持久性和容错保证。