多代理、多服务器集群中的 Kafka 生产者无法写入新创建的主题

Kafka producer in a multi-broker, multi-server cluster cannot write to newly created topic

我有一个包含 2 个代理的 Kafka 集群,每个代理都在自己的 (AWS) 服务器上(我使用说明 here 设置集群)。我正在使用 SASL(但没有加密)。在运行代理 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 提供的答案中的问题的回复:

  1. 我在任一代理节点上都没有看到分区主题:

    kafka@server-02:/var/log/kafka$ ls -alhtr 总计124K -rw-r--r-- 1 kafka kafka 0 Jan 7 23:27 .lock -rw-r--r-- 1 kafka kafka 0 Jan 7 23:27 cleaner-offset-checkpoint -rw-r--r-- 1 kafka kafka 54 1 月 7 23:27 meta.properties drwxr-xr-x 7 root root 4.0K Jan 9 06:25 .. drwxr-xr-x 2 kafka kafka 4.0K 1 月 18 日 05:30 __consumer_offsets-29 ... drwxr-xr-x 2 kafka kafka 4.0K 1 月 18 日 05:30 __consumer_offsets-1 -rw-r--r-- 1 kafka kafka 600 1 月 18 日 05:56 复制偏移检查点 -rw-r--r-- 1 kafka kafka 600 Jan 18 05:56 恢复点偏移检查点 -rw-r--r-- 1 kafka kafka 4 Jan 18 05:56 log-start-offset-checkpoint 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 .
  1. 用户 kafka,即运行 kafka 服务器的用户,是两个代理上 /var/log/kafka/ 目录的所有者:

    kafka@server-02:~/kafka_2.11-1.0.0/confkafka@server-01:/var/log$ ll /var/log | grep卡夫卡 drwxr-xr-x 27 kafka kafka 4096 1 月 18 日 05:49 kafka ig$ll /var/log | grep kafka

  2. 看起来 telnet 正在工作,两个经纪人:

    sjamal->telnet 服务器-01.eigenroute.com9092 正在尝试 54.175.56.39... 连接到服务器-01.eigenroute.com。 转义符是'^]'。 ^C连接被外部主机关闭。 [~/projects/microservices/kafka-tutorial/kafka_2.11-1.0.0] sjamal-> telnet 服务器-02.eigenroute.com 9092 正在尝试 18.221.32.34... 连接到服务器-02.eigenroute.com。 转义符是'^]'。 ^C连接被外部主机关闭。

  3. 不需要-他们可以看到对方:

    kafka@server-02:~/kafka_2.11-1.0.0/config$ 主机服务器-01.eigenroute.com 服务器-01.eigenroute.com 的地址为 54.175.56.39 kafka@server-01:/var/log$ 主机服务器-02.eigenroute.com 服务器-02.eigenroute.com 的地址为 18.221.32.34

  4. 我试过了。消费者没有收到任何消息:

    [2018-01-18 00:45:31,931] 警告 [Consumer clientId=consumer-1, groupId=console-consumer-95024] 获取相关 ID 为 7022 的元数据时出错:{another-test-主题=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient) [2018-01-18 00:45:32,063] WARN [Consumer clientId=consumer-1, groupId=console-consumer-95024] 获取相关 ID 为 7024 的元数据时出错:{another-test-topic=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient) [2018-01-18 00:45:32,194] WARN [Consumer clientId=consumer-1, groupId=console-consumer-95024] 获取相关 ID 为 7025 的元数据时出错:{another-test-topic=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient) [2018-01-18 00:45:32,327] WARN [Consumer clientId=consumer-1, groupId=console-consumer-95024] 获取相关 ID 为 7026 的元数据时出错:{another-test-topic=UNKNOWN_TOPIC_OR_PARTITION} (org.apache.kafka.clients.NetworkClient)

drwxr-xr-x 27 kafka kafka 4096 1 月 18 日 05:44 kafka

抱歉格式错误 - 我粘贴了代码并点击了 'code' 按钮,但它没有格式化为代码,我不知道为什么。

更新 #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

这个错误:

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)

不强制表示您没有写到主题。

只能说,这个题目是"a new"一个。

1) 检查,可能数据已经写到数据目录中了,可以直观的看到,cd data_dir/topic/partition,寻找增长的文件。 (查看所有分区中的两台服务器)

2) 检查,可能是 data_dir 没有为您的 kafka 用户写入的权限?

3) 从 produce 机器 'telnet kafka_host kafka_port' 检查,可能是 producer 在网络中没有看到你的 kafka 服务器

4) 在生产者和 kafka 代理上,输入 /etc/hosts 并将 IP 映射到所有 3 台机器的主机名。他们不仅需要知道彼此的 IP,还需要知道主机名到 IP 的映射(DNS 服务是一种替代方法)

5) 与消费者建立联系并尝试消费您的主题。

好吧,我不知道这是否可以作为答案,但它确实有效。解决方案是在 Broker 1 服务器(原始代理)而不是 Broker 2 服务器(第二个添加的代理)上创建新主题 ("a-test-topic2")。

现在,如果我将 Broker 1 下线,那么我可以在 Broker 2 服务器上创建一个主题 ("a-test-topic3") - 但是副本编号当然必须是一个,所以我不会能够在 Broker 1 上拥有任何副本(replicae?)。

接下来,我恢复 Broker 1,并尝试在副本数为 2 的 Broker 2 服务器上创建另一个主题 ("a-test-topic4"),并且...成功了!对于这个新主题的所有分区,Isr 是 2,1 或 1,2,leader 是 1 或 2。

嗯...让我们尝试在 Broker 1 服务器上创建一个主题 ("a-test-topic5")。发生什么了? 我遇到了我最初遇到的同样的问题。新主题分区没有领导者,也没有 Isr 。但我找到了解决此问题的方法 - 使用 Broker 1 运行,我停止了 Broker 2,然后再次启动了 Broker 2,瞧 - 对于所有分区,这个主题最终获得了 1 或 2 的 Leader 和 Isrs 1,2 或 2,1。

所以我想新主题只能在激活的第一个代理上创建,否则必须重新启动所有其他代理?