首页 > 解决方案 > 错误:复制因子:1 大于可用代理:0,当我创建 Kafka 主题时

问题描述

我在集群中运行 Kafka 时遇到一个问题。我一一解释。首先,当我从我的计算机上在集群 CSSH 上运行 Kafka 命令时,我收到此错误:

执行主题命令时出错:复制因子:比可用代理大 2:1。 [2019-01-06 15:12:36,587] 错误 org.apache.kafka.common.errors.InvalidReplicationFactorException:复制因子:比可用代理大 2 : 1. (kafka.admin.TopicCommand$)

实际上,我在我的计算机上运行 CSSH 来访问集群,在集群上运行 Zookeeper 和 Kafka 服务器后,当我运行创建主题的命令时,我得到了错误。在集群中,我在 node1 上的 server.properties 上有这些设置:

broker.id=1
port=9092
listeners=PLAINTEXT://150.20.11.137:9092
num.network.threads=3
num.io.threads=8
socket.send.buffer.bytes=102400
socket.receive.buffer.bytes=102400
sockeet.request.max.bytes=104857600
log.dirs=/tmp/kafka-logs
num.partitions=1
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
transaction.state.log.min.isr=1
log.retention.hours=168
log.segment.bytes=10073741824
log.retention.check.interval.ms=300000
zookeeper.connect= 150.20.11.134:2186, 150.20.11.137:2186, 
150.20.11.157:2186
zookeeper.connection.timeout.ms=6000
group.initial.rebalance.delay.ms=0

在每个节点的 zookeeper.properties 我有这个设置:

 dataDir=/tmp/zookeeper
 clientPort=2186
 maxClientCnxns=0

另外,我在集群节点上运行每个命令来运行 Kafka 和 Zookeeper:

./bin/zookeeper-server-start.sh ./config/zookeeper.properties
./bin/kafka-server-start.sh ./config/server.properties

之后,我想在集群中使用此命令创建一个主题,然后在每个节点上出现上述错误:

./bin/kafka-topics.sh --create --zookeeper localhost:2186 -- 
 replication-factor 2 --partitions 3 --topic testFlink

你能告诉你具体是什么问题吗?我的集群设置有什么问题?

提前致谢。

标签: apache-kafkaapache-zookeeper

解决方案


我怀疑你是否能够成功地形成一个集群。启动集群时,请确保首先启动所有 3 个 zookeeper 节点,然后是三个代理。您可以参考这篇文章,检查Kafka是否已形成集群。

更新: 我忽略了您正在使用的 zookeeper 属性,它缺少创建集群所需的基本键值对。zookeeper 的以下属性应该是好的开始。考虑到您有 3 个 zookeeper 节点,zk 节点上的zookeeper.propertiesor zoo.cfg(如果它是独立的 zk)文件应该如下所示。

zk-1 属性

tickTime=2000
initLimit=10
syncLimit=5
clientPort=2186
dataDir=/opt/zookeeper/data
server.1=0.0.0.0:2888:3888
server.2=<zk_2-ip>:2888:3888
server.3=<zk_3-ip>:2888:3888

zk-2 属性

tickTime=2000
initLimit=10
syncLimit=5
clientPort=2186
dataDir=/opt/zookeeper/data
server.1=<zk_1-ip>:2888:3888
server.2=0.0.0.0:2888:3888
server.3=<zk_3-ip>:2888:3888

zk-3 属性

tickTime=2000
initLimit=10
syncLimit=5
clientPort=2186
dataDir=/opt/zookeeper/data
server.1=<zk_1-ip>:2888:3888
server.2=<zk_2-ip>:2888:3888
server.3=0.0.0.0:2888:3888

好的,所以在你启动 zookeeper 进程之前,你还需要做一件事。签出dataDir您正在使用的属性,在此示例中为/opt/zookeeper/data. 对于每个动物园管理员,您必须创建一个名为的文件myid,并为 zk-1 输入值 1,为 zk-2 输入 2,为 zk-3 输入 3。然后你启动 zookeepers,它应该形成一个集群。您可以使用像echo "1" > /opt/zookeeper/data/myidzk-1 这样的 bash cmd。休息将是相似的。


推荐阅读