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

Sha*_*mal 6 sasl apache-kafka apache-zookeeper

我有一个带有2个代理的Kafka集群,每个代理都在自己的(AWS)服务器上(我使用这里的intstructions设置集群).我正在使用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
Run Code Online (Sandbox Code Playgroud)

看似成功,因为描述主题表明它至少是创建的:

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:
Run Code Online (Sandbox Code Playgroud)

如您所见,此主题未分配任何领导者,并且没有同步副本.我已经为生产者分配了写权限:

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: *
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

此主题的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
Run Code Online (Sandbox Code Playgroud)

我觉得奇怪......不应该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 Jan 7 23:27 meta.properties drwxr-xr-x 7 root root 4.0K Jan 9 06:25 .. drwxr -xr-×2卡夫卡卡夫卡4.0K年01月18 05:30 __consumer_offsets-29 ... drwxr-XR-×2卡夫卡卡夫卡4.0K年01月18 05:30 __consumer_offsets-1 -rw-R - R-- 1卡夫卡卡夫卡600 Jan 18 05:56 replication-offset-checkpoint -rw-r - r-- 1 kafka kafka 600 Jan 18 05:56 recovery-point-offset-checkpoint -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 .
Run Code Online (Sandbox Code Playgroud)
  1. 用户kafka,即运行kafka服务器的用户,是/var/log/kafka/两个代理上的目录的所有者:

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

  2. 对于两个经纪人来说,看起来telnet正在运行:

    sjamal-> telnet server-01.eigenroute.com 9092试用54.175.56.39 ...连接到server-01.eigenroute.com.逃脱角色是'^]'.^ CConnection由外国主人关闭.[〜/ projects/microservices/kafka-tutorial/kafka_2.11-1.0.0] sjamal-> telnet server-02.eigenroute.com 9092尝试18.221.32.34 ...连接到server-02.eigenroute.com.逃脱角色是'^]'.^ CConnection由外国主人关闭.

  3. 没必要 - 他们可以看到对方:

    kafka @ server-02:〜/ kafka_2.11-1.0.0/config $ host server-01.eigenroute.com server-01.eigenroute.com的地址为54.175.56.39 kafka @ server-01:/ var/log $ host server-02.eigenroute.com server-02.eigenroute.com的地址是18.221.32.34

  4. 我试过这个.消费者不会收到任何消息:

    [2018年1月18日00:45:31931] WARN [消费者的clientId =消费者-1,的groupId =控制台消费者95024]错误撷取与相关性id 7022的元数据:{另一个试验主题= UNKNOWN_TOPIC_OR_PARTITION}(有机apache.kafka.clients.NetworkClient)[2018年1月18日00:45:32063] WARN [消费者的clientId =消费者-1,的groupId =控制台消费者95024]错误,同时用相关性id 7024获取元数据:{另一个测试-topic = UNKNOWN_TOPIC_OR_PARTITION}(org.apache.kafka.clients.NetworkClient)[2018年1月18日00:45:32194] WARN [消费者的clientId =消费者-1,的groupId =控制台消费者95024]错误撷取元数据与相关性id 7025:{另一个试验主题= UNKNOWN_TOPIC_OR_PARTITION}(org.apache.kafka.clients.NetworkClient)[2018年1月18日00:45:32327] WARN [消费者的clientId =消费者-1,的groupId =控制台消费者-95024]获取具有相关ID 7026的元数据时出错:{another-test-topic = UNKNOWN_TOPIC_OR_PARTITION}(org.apache.kafka.clients.NetworkClient)

drwxr-xr-x 27 kafka kafka 4096 Jan 18 05:44 kafka

抱歉格式错误 - 我已粘贴代码并点击"代码"按钮,但它不是格式化为代码,我不知道为什么.

更新#2:回应弗拉基米尔·纳博科夫在回答中的评论,我正在粘贴我正在使用的制作人和消费者配置和命令:

// 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
Run Code Online (Sandbox Code Playgroud)

Sha*_*mal 0

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

现在,如果我使 Broker 1 离线,那么我可以在 Broker 2 服务器上创建一个主题(“a-test-topic3”) - 但当然副本编号必须为 1,因此我将无法拥有Broker 1 上有任何副本(副本?)。

接下来,我重新启动 Broker 1,并尝试在 Broker 2 服务器上创建另一个主题(“a-test-topic4”),副本数为 2,并且......它有效!对于这个新主题的所有分区,Isr 为 2,1 或 1,2,leader 为 1 或 2。

嗯...所以让我们尝试在 Broker 1 服务器上创建一个主题(“a-test-topic5”)。会发生什么?我遇到了与原来相同的问题。新的主题分区没有领导者,也没有 Isr。但我找到了一种方法来解决这个问题 - 当 Broker 1 运行时,我停止了 Broker 2,然后再次启动 Broker 2,瞧 - 对于所有分区,这个主题最终得到的 Leader 为 1 或 2,Isrs 为 1,2 或2,1.

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