kafka生产者无法写入新创建的主题

esbemjvw  于 2021-06-07  发布在  Kafka
关注(0)|答案(2)|浏览(405)

我有一个带有2个代理的kafka集群,每个代理都在自己的(aws)服务器上(我使用这里的指令设置集群)。我正在使用sasl(但没有加密)。在运行broker 2的服务器2上,我创建了一个主题:

KAFKA_OPTS="-Djava.security.auth.login.config=/home/kafka/kafka_2.11-1.0.0/config/jaas.conf -Djava.security.krb5.conf=/etc/krb5.conf" \
    bin/kafka-topics.sh --create \
    --zookeeper zookeeper-server-01.eigenroute.com:2181,zookeeper-server-02.eigenroute.com:2181,zookeeper-server-03.eigenroute.com:2181/apps/kafka-cluster-demo \
    --replication-factor 2   --partitions 9   --topic another-test-topic

看起来很成功,因为描述主题表明它至少是被创造出来的:

KAFKA_OPTS="-Djava.security.auth.login.config=/home/kafka/kafka_2.11-1.0.0/config/jaas.conf -Djava.security.krb5.conf=/etc/krb5.conf" \
    bin/kafka-topics.sh --describe \
    --zookeeper zookeeper-server-01.eigenroute.com:2181,zookeeper-server-02.eigenroute.com:2181,zookeeper-server-03.eigenroute.com:2181/apps/kafka-cluster-demo
Topic:another-test-topic    PartitionCount:9    ReplicationFactor:2 Configs:    MarkedForDeletion:true
    Topic: another-test-topic   Partition: 0    Leader: none    Replicas: 2,1   Isr:
    Topic: another-test-topic   Partition: 1    Leader: none    Replicas: 1,2   Isr:
    Topic: another-test-topic   Partition: 2    Leader: none    Replicas: 2,1   Isr:
    Topic: another-test-topic   Partition: 3    Leader: none    Replicas: 1,2   Isr:
    Topic: another-test-topic   Partition: 4    Leader: none    Replicas: 2,1   Isr:
    Topic: another-test-topic   Partition: 5    Leader: none    Replicas: 1,2   Isr:
    Topic: another-test-topic   Partition: 6    Leader: none    Replicas: 2,1   Isr:
    Topic: another-test-topic   Partition: 7    Leader: none    Replicas: 1,2   Isr:
    Topic: another-test-topic   Partition: 8    Leader: none    Replicas: 2,1   Isr:

如您所见,此主题没有分配任何引线,并且没有同步副本。我已将写入权限分配给生产者:

KAFKA_HEAP_OPTS="-Djava.security.auth.login.config=/home/kafka/kafka_2.11-1.0.0/config/jaas.conf -Dsun.security.krb5.debug=true -Djava.security.krb5.conf=/etc/krb5.conf -Xmx256M -Xms128M" \
    bin/kafka-acls.sh --authorizer-properties \
    zookeeper.connect=zookeeper-server-01.eigenroute.com:2181,zookeeper-server-02.eigenroute.com:2181,zookeeper-server-03.eigenroute.com:2181/apps/kafka-cluster-demo \
   --add --allow-principal User:producer1 --producer --topic another-test-topic
...
Current ACLs for resource `Topic:another-test-topic`:
    User:producer1 has Allow permission for operations: Describe from hosts: *
    User:producer1 has Allow permission for operations: Write from hosts: *

但是,我的制作人无法写这个主题:

KAFA_HEAP_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true" \
    bin/kafka-console-producer.sh \
    --broker-list server-01.eigenroute.com:9092,server-02.eigenroute.com:9092 \
    --topic another-test-topic --producer.config config/sasl-producer.properties
>this is a test message
[2018-01-07 21:16:02,650] WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 1 : {another-test-topic=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient)

此主题的zookeeper节点上的acl是:

[zk: zookeeper-server-03.eigenroute.com:2181(CONNECTED) 8] getAcl /apps/kafka-cluster-demo/brokers/topics/another-test-topic
'world,'anyone
: r
'sasl,'kafka/server-02.eigenroute.com@EIGENROUTE.COM
: cdrwa

我觉得很奇怪。。。不应该 kafka/server-01.eigenroute.com@EIGENROUTE.COM (代理1的kerberos主体)具有与 kafka/server-02.eigenroute.com@EIGENROUTE.COM (代理2的kerberos主体)?
有人能提出为什么制作人看不到它被授权写作的主题吗?
更新:以下是对@vladimir nabokov提供的答案中问题的回答:
我在两个代理的节点上都没有看到分区主题:
kafka@server-02:/var/log/kafka$ls-alhtr total 124k-rw-r--r--1KafkaKafka0 jan 7 23:27。lock-rw-r--r--1KafkaKafka0 jan 7 23:27清除偏移检查点-rw-r--r--1KafkaKafka54 jan 7 23:27 meta.properties drwxr-xr-x 7 root 4.0k jan 9 06:25。。drwxr-xr-x 2KafkaKafka4.0k 1月18日05:30\u消费者\u-29。。。drwxr-xr-x 2 kafka kafka 4.0k 1月18日05:30 \uu消费者\u偏移-1-rw-r--r--1 kafka kafka 600 1月18日05:56复制偏移检查点-rw-r--r--1 kafka kafka 600 1月18日05:56恢复点偏移检查点-rw-r--r--1 kafka kafka 4 1月18日05:56日志开始偏移检查点drwxr-xr-x 27 kafka kafka 4.0k 1月18日05:56。
以及

kafka@server-01:/var/log/kafka$ ls -alhtr
total 124K
-rw-r--r--  1 kafka kafka    0 Jan  7 23:26 .lock
-rw-r--r--  1 kafka kafka    0 Jan  7 23:26 cleaner-offset-checkpoint
-rw-r--r--  1 kafka kafka   54 Jan  7 23:26 meta.properties
drwxr-xr-x  7 root  root  4.0K Jan 17 06:25 ..
drwxr-xr-x  2 kafka kafka 4.0K Jan 18 05:30 __consumer_offsets-0
...
drwxr-xr-x  2 kafka kafka 4.0K Jan 18 05:30 __consumer_offsets-32
-rw-r--r--  1 kafka kafka  600 Jan 18 05:58 recovery-point-offset-checkpoint
-rw-r--r--  1 kafka kafka    4 Jan 18 05:58 log-start-offset-checkpoint
-rw-r--r--  1 kafka kafka  600 Jan 18 05:59 replication-offset-checkpoint
drwxr-xr-x 27 kafka kafka 4.0K Jan 18 05:59 .

用户 kafka ,它是运行kafka服务器的用户,是 /var/log/kafka/ 两个代理上的目录:
kafka@server-02:~/Kafka2.11-1.0.0/confkafka@server-01:/var/log$ll/var/log | grep kafka drwxr-xr-x 27KafkaKafka4096年1月18日05:49Kafkaig$ll/var/log | grep kafka
看来telnet正在运行,对两个代理来说:
sjamal->telnet server-01.eigenroute.com 9092尝试54.175.56.39。。。已连接到server-01.eigenroute.com。转义字符为“^]”^C连接已被外部主机关闭[~/projects/microservices/kafka tutorial/kafka\u 2.11-1.0.0]sjamal->telnet server-02.eigenroute.com 9092 trying 18.221.32.34。。。已连接到server-02.eigenroute.com。转义字符为“^]”^C连接已被外部主机关闭。
不需要-他们可以看到对方:
kafka@server-02:~/kafka_2.11-1.0.0/config$host server-01.eigenroute.com server-01.eigenroute.com的地址是54.175.56.39kafka@server-01:/var/log$host server-02.eigenroute.com server-02.eigenroute.com的地址为18.221.32.34
我试过了。消费者未收到任何消息:
[2018-01-18 00:45:31931]warn[consumer clientid=consumer-1,groupid=console-consumer-95024]获取相关id为7022的元数据时出错:{另一个测试主题=未知的\u主题\u或\u分区}(org.apache.kafka.clients.networkclient)[2018-01-18 00:45:32063]warn[consumer clientid=consumer-1,groupid=console-consumer-95024]获取相关id为7024的元数据时出错:{another test topic=unknown\u topic\u or\u partition}(org.apache.kafka.clients.networkclient)[2018-01-18 00:45:32194]警告[consumer clientid=consumer-1,groupid=console-consumer-95024]获取相关id为7025的元数据时出错:{another test topic=unknown\u topic\u or\u partition}(org.apache.kafka.clients.networkclient)[2018-01-18 00:45:32327]warn[consumer clientid=consumer-1,groupid=console-consumer-95024]获取相关id为7026的元数据时出错:{another test topic=unknown\u topic\u or\u partition}(org.apache.kafka.clients.networkclient)
drwxr-xr-x 27KafkaKafka4096 1月18日05:44Kafka
很抱歉格式不好-我粘贴了代码并按了“代码”按钮,但它不是作为代码格式,我不知道为什么。
更新#2:针对vladimir nabokov在回答中的评论,我正在粘贴我正在使用的生产者和消费者配置和命令:

// sasl-producer.properties
bootstrap.servers=server-01.eigenroute.com:9092
compression.type=none
security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \
        useKeyTab=true \
        storeKey=true  \
        keyTab="/path/to/producer1.whatever.keytab" \
        principal="producer1/whatever@EIGENROUTE.COM";

// sasl-consumer.properties
bootstrap.servers=server-01.eigenroute.com:9092
security.protocol=SASL_PLAINTEXT
sasl.mechanism=GSSAPI
sasl.kerberos.service.name=kafka
sasl.jaas.config=com.sun.security.auth.module.Krb5LoginModule required \
        useKeyTab=true \
        storeKey=true  \
        keyTab="/path/to/consumer1.whatever.keytab" \
        principal="consumer1/whatever@EIGENROUTE.COM";

# producer command

KAFA_HEAP_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"     bin/kafka-console-producer.sh     --broker-list server-01.eigenroute.com:9092,server-02.eigenroute.com:9092     --topic another-test-topic --producer.config config/sasl-producer.properties

# consumer command

KAFA_HEAP_OPTS="-Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true"     bin/kafka-console-consumer.sh     --bootstrap-server server-01.eigenroute.com:9092,server-02.eigenroute.com:9092     --topic another-test-topic --consumer.config config/sasl-consumer.properties --from-beginning
lndjwyie

lndjwyie1#

嗯,我不知道这是否可以作为一个答案,但它是有效的。解决方案是在broker1服务器(原始代理)上创建新主题(“a-test-topic2”),而不是在broker2服务器(第二个添加的代理)上。
现在,如果我让Broker1离线,那么我就可以在Broker2服务器上创建一个主题(“a-test-topic3”)——当然,副本号必须是1,因此我将无法在Broker1上拥有任何副本(replice?)。
接下来,我将broker1备份,并尝试在broker2服务器上创建另一个主题(“a-test-topic4”),副本计数为2,然后…它就可以工作了!对于这个新主题的所有分区,isr是2,1或1,2,leader是1或2。
隐马尔可夫模型。。。因此,让我们尝试在broker1服务器上创建一个主题(“a-test-topic5”)。会发生什么?我的问题和原来一样。新的主题分区没有前导和isr。但我找到了一种解决方法—在Broker1运行时,我停止了Broker2,然后再次启动Broker2,瞧—对于所有分区,这个主题最终得到1或2的前导和1,2或2,1的ISR。
所以我猜新的主题只能在第一个被激活的代理上创建,否则所有其他代理都必须重新启动?

68de4m5k

68de4m5k2#

此错误:
warn[producer clientid=console producer]获取相关id为1的元数据时出错:{另一个测试主题=未知的\u主题\u或\u分区}(org.apache.kafka.clients.networkclient)
并不意味着你没能写下主题。
这只意味着,这是一个“新”的主题。
1) 检查,可能是数据已经写入了data dir,您可以直观地看到,cd data\u dir/topic/partition,查找增长的文件(查看所有分区中的两个服务器)
2) 检查,可能是数据目录没有权限写入您的Kafka用户?
3) 从生产机器“telnet kafka\u host kafka\u port”检查,可能是生产商在网络中看不到您的kafka服务器
4) 在producer和kafka代理上,输入/etc/hosts并将所有3台机器的ipMap到主机名。他们不仅需要知道彼此的ip,而且需要知道主机名到ip的Map(dns服务是另一种选择)
5) 与消费者联系,尝试消费你的主题。

相关问题