当集群中的3个经纪人中有3个经纪人时,kafka主题创建失败

时间:2018-10-31 07:06:56

标签: apache-kafka kafka-consumer-api kafka-producer-api

在以下情况下,创建Kafka主题失败:

节点是kafka群集:4

复制因子:4

集群中正在运行的节点数:3

以下是错误:

./kafka-topics.sh --zookeeper :2181 --create --topic test_1 --partitions 1 --replication-factor 4
WARNING: Due to limitations in metric names, topics with a period ('.') or underscore ('_') could collide. To avoid issues it is best to use either, but not both.
Error while executing topic command : Replication factor: 4 larger than available brokers: 3.
[2018-10-31 11:58:13,084] ERROR org.apache.kafka.common.errors.InvalidReplicationFactorException: Replication factor: 4 larger than available brokers: 3.

这是kafka中的有效行为还是已知问题?

如果集群中的所有节点均应始终处于运行状态,那么容错能力又如何呢?

更新json文件以增加已创建主题的复制因子:

$cat /tmp/increase-replication-factor.json
{"version":1,
  "partitions":[
     {"topic":"vHost_v81drv4","partition":0,"replicas":[4,1,2,3]},
     {"topic":"vHost_v81drv4","partition":1,"replicas":[4,1,2,3]},
     {"topic":"vHost_v81drv4","partition":2,"replicas":[4,1,2,3]},
     {"topic":"vHost_v81drv4","partition":3,"replicas":[4,1,2,3]}
     {"topic":"vHost_v81drv4","partition":4,"replicas":[4,1,2,3]},
     {"topic":"vHost_v81drv4","partition":5,"replicas":[4,1,2,3]},
     {"topic":"vHost_v81drv4","partition":6,"replicas":[4,1,2,3]},
     {"topic":"vHost_v81drv4","partition":7,"replicas":[4,1,2,3]}
]}

2 个答案:

答案 0 :(得分:3)

在Kafka中创建新主题后,该主题在您的代理中重复N=replication-factor次。由于您有3个代理程序正在运行,并且replication-factor设置为4,因此该主题无法复制4次,因此会出现错误。

在创建新主题时,您需要确保所有4个代理都已启动并正在运行,或者将复制因子设置为较小的值,以避免在其中一个代理关闭时无法创建主题。

如果要在一个代理关闭时创建复制因子设置为4的主题,则可以首先使用replication-factor=3创建主题,并且当第四个代理启动并运行后,您可以进行修改遵循以下步骤(假设您有一个具有4个分区的主题example)来配置该主题并增加其复制因子:

使用以下内容创建一个increase-replication-factor.json文件:

{"version":1,
  "partitions":[
     {"topic":"example","partition":0,"replicas":[0,1,2,3]},
     {"topic":"example","partition":1,"replicas":[0,1,2,3]},
     {"topic":"example","partition":2,"replicas":[0,1,2,3]},
     {"topic":"example","partition":3,"replicas":[0,1,2,3]}
]}

然后执行以下命令:

kafka-reassign-partitions --zookeeper localhost:2181 --reassignment-json-file increase-replication-factor.json --execute

最后,您将能够确认您的主题已在4个代理中复制:

kafka-topics --zookeeper localhost:2181 --topic signals --describe
Topic:signals   PartitionCount:4    ReplicationFactor:4 Configs:retention.ms=1000000000
Topic: signals  Partition: 0    Leader: 2   Replicas: 0,1,2,3 Isr: 2,0,1,3
Topic: signals  Partition: 1    Leader: 2   Replicas: 0,1,2,3 Isr: 2,0,1,3
Topic: signals  Partition: 2    Leader: 2   Replicas: 0,1,2,3 Isr: 2,0,1,3
Topic: signals  Partition: 3    Leader: 2   Replicas: 0,1,2,3 Isr: 2,0,1,3

关于高可用性,让我解释一下Kafka的工作原理:

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

分区0:

+---+---+---+-----+
| 0 | 1 | 2 | ... |
+---+---+---+-----+

分区1:

+---+---+---+---+----+
| 0 | 1 | 2 | 3 | .. |
+---+---+---+---+----+

现在,Kafka集群由多个经纪人组成。每个代理都有一个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    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

请注意,数据是分布式的(并且经纪人3 不保存任何主题2 的数据)。

主题,应该具有replication-factor> 1(通常为2或3),以便在代理崩溃时,另一个代理可以提供主题数据。例如,假设我们有一个包含2个分区的主题,其中replication-factor设置为2,如下所示:

经纪人1:

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

经纪人2:

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

经纪人3:

+-------------------+
|      Topic 1      |
|    Partition 1    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

现在假定经纪人2 失败了。 经纪人1 和3仍然可以为主题1提供数据。因此,replication-factor为3始终是一个好主意,因为它允许出于维护目的以及出于维护目的而删除一个经纪人。另一个被意外删除。 因此,Apache-Kafka提供了强大的耐用性和容错保证。

有关领导者的说明: 在任何时候,只有一个代理可以成为分区的领导者,并且只有该领导者可以接收和提供该分区的数据。其余的代理将仅同步数据(同步副本)。另请注意,当replication-factor设置为1时,如果代理失败,则 leader 不能移到其他位置。通常,当分区的所有副本失败或脱机时,leader将自动设置为-1

答案 1 :(得分:0)

这是有效的行为。创建新主题时,所有节点都应已启动并正在运行。

Confluence Replica placements - Initial placement

  

仅创建主题,根据当前的实时经纪人做出决定(手动创建主题命令);

在使用此主题时(创建后),所有节点一定不能启动并运行。

Apache documentation about replication factor

  

复制因子控制多少服务器将复制每个写入的消息。如果复制因子为3,则最多2台服务器可能会发生故障,然后才能失去对数据的访问权限。我们建议您使用2或3的复制因子,以便可以透明地反弹计算机而不会中断数据消耗。