Kafka主题创建失败时,3个经纪人是4个集群

ljsrvy3e  于 2021-06-06  发布在  Kafka
关注(0)|答案(2)|浏览(503)

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]}
]}
gcuhipw9

gcuhipw91#

这是一种有效的行为。创建新主题时,所有节点都应启动并运行。
合流副本放置-初始放置
只创建主题,根据当前直播的经纪人进行决策(手动创建主题命令);
使用此主题时(创建后),不能启动并运行所有节点
关于复制因子的apache文档
复制因子控制有多少服务器将复制写入的每条消息。如果复制系数为3,则最多可以有2台服务器出现故障,然后您将无法访问数据。我们建议您使用2或3的复制因子,以便可以透明地跳转计算机而不中断数据消耗。

k75qkfdt

k75qkfdt2#

在Kafka中创建一个新主题时,它会被复制 N=replication-factor 你经纪人的时间。既然你有3个经纪人 replication-factor 设置为 4 该主题不能复制4次,因此会出现错误。
创建新主题时,您需要确保所有4个代理都已启动并正在运行,或者将复制因子设置为较小的值,以避免其中一个代理关闭时主题创建失败。
如果要创建复制因子设置为的主题 4 当一个代理关闭时,您可以使用 replication-factor=3 一旦第四个代理启动并运行,您就可以修改该主题的配置,并通过以下步骤增加其复制因子(假设您有一个主题) example 带4个分区):
创建 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的工作原理:
每个主题都是一个特定的数据流(类似于数据库中的表)。主题被划分为多个分区(可以任意多个分区),分区中的每条消息都获得一个增量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    |
|                   |
|                   |
|                   |
|                   |
+-------------------+

请注意,数据是分布式的(broker 3不包含主题2的任何数据)。
主题,应该有一个 replication-factor >1(通常是2或3),这样当一个代理关闭时,另一个代理可以提供一个主题的数据。例如,假设一个主题有两个分区,每个分区有一个 replication-factor 设置为2,如下所示:
经纪人1:

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

经纪人2:

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

经纪人3:

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

现在假设代理2失败了。代理1和3仍然可以为主题1提供数据。所以 replication-factor 3总是一个好主意,因为它允许一个经纪人为了维护的目的被拆掉,也允许另一个经纪人意外地被拆掉。因此,apachekafka提供了强大的持久性和容错保证。
关于引线的注意:在任何时候,只有一个代理可以是分区的引线,并且只有该引线可以接收和服务该分区的数据。其余的代理将只同步数据(同步副本)。还要注意的是 replication-factor 如果设置为1,则在代理失败时不能将引线移到其他位置。通常,当一个分区的所有副本都失败或脱机时 leader 将自动设置为 -1 .

相关问题