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条答案
按热度按时间gcuhipw91#
这是一种有效的行为。创建新主题时,所有节点都应启动并运行。
合流副本放置-初始放置
只创建主题,根据当前直播的经纪人进行决策(手动创建主题命令);
使用此主题时(创建后),不能启动并运行所有节点
关于复制因子的apache文档
复制因子控制有多少服务器将复制写入的每条消息。如果复制系数为3,则最多可以有2台服务器出现故障,然后您将无法访问数据。我们建议您使用2或3的复制因子,以便可以透明地跳转计算机而不中断数据消耗。
k75qkfdt2#
在Kafka中创建一个新主题时,它会被复制
N=replication-factor
你经纪人的时间。既然你有3个经纪人replication-factor
设置为4
该主题不能复制4次,因此会出现错误。创建新主题时,您需要确保所有4个代理都已启动并正在运行,或者将复制因子设置为较小的值,以避免其中一个代理关闭时主题创建失败。
如果要创建复制因子设置为的主题
4
当一个代理关闭时,您可以使用replication-factor=3
一旦第四个代理启动并运行,您就可以修改该主题的配置,并通过以下步骤增加其复制因子(假设您有一个主题)example
带4个分区):创建
increase-replication-factor.json
包含此内容的文件:然后执行以下命令:
最后,您可以确认您的主题已在4个代理中复制:
关于高可用性,我来解释一下kafka的工作原理:
每个主题都是一个特定的数据流(类似于数据库中的表)。主题被划分为多个分区(可以任意多个分区),分区中的每条消息都获得一个增量id,称为偏移量,如下所示。
分区0:
分区1:
现在,Kafka集群由多个代理组成。每个代理都用一个id标识,并且可以包含某些主题分区。
2个主题的示例(每个主题分别有3个和2个分区):
经纪人1:
经纪人2:
经纪人3:
请注意,数据是分布式的(broker 3不包含主题2的任何数据)。
主题,应该有一个
replication-factor
>1(通常是2或3),这样当一个代理关闭时,另一个代理可以提供一个主题的数据。例如,假设一个主题有两个分区,每个分区有一个replication-factor
设置为2,如下所示:经纪人1:
经纪人2:
经纪人3:
现在假设代理2失败了。代理1和3仍然可以为主题1提供数据。所以
replication-factor
3总是一个好主意,因为它允许一个经纪人为了维护的目的被拆掉,也允许另一个经纪人意外地被拆掉。因此,apachekafka提供了强大的持久性和容错保证。关于引线的注意:在任何时候,只有一个代理可以是分区的引线,并且只有该引线可以接收和服务该分区的数据。其余的代理将只同步数据(同步副本)。还要注意的是
replication-factor
如果设置为1,则在代理失败时不能将引线移到其他位置。通常,当一个分区的所有副本都失败或脱机时leader
将自动设置为-1
.