【问题标题】:Kafka ACL - LEADER_NOT_AVAILABLE卡夫卡 ACL - LEADER_NOT_AVAILABLE
【发布时间】:2018-07-04 16:31:48
【问题描述】:

我在向受 ACL 保护的 Kafka 主题(名为 secure.topic)生成消息时遇到问题。 我的基于 Groovy 的生产者抛出此错误:

Error while fetching metadata with correlation id 9 : {secure.topic=LEADER_NOT_AVAILABLE}

关于配置的一些注意事项:

  • 1 Kafka 服务器,版本 2.11_1.0.0(服务器和 Java 客户端库)
  • 主题 ACL 设置为 All(也使用 --producer 进行了测试)并且用户是证书中指定的全名
  • 使用自行生成的证书启用客户端身份验证

额外的服务器配置:

 security.inter.broker.protocol = SSL
 ssl.client.auth = required
 authorizer.class.name=kafka.security.auth.SimpleAclAuthorizer

如果我删除 authorizer.class.name 属性,那么我的客户端可以生成消息(因此,没问题使用 SSL 和证书)。

此外,kafka-authorizer.log 会生成以下消息:

[2018-01-25 11:57:02,779] INFO Principal = User:CN= User,OU=XXX,O=XXX,L=XXX,ST=Unknown,C=X is Denied Operation = ClusterAction from host = 127.0.0.1 on resource = Cluster:kafka-cluster (kafka.authorizer.logger)

知道启用 ACL 时会导致 LEADER_NOT_AVAILABLE 错误的原因吗?

【问题讨论】:

    标签: java groovy apache-kafka kafka-producer-api


    【解决方案1】:

    从授权方日志来看,授权方似乎在 Cluster 资源上拒绝了 ClusterAction

    如果您检查您的主题状态(例如使用kafka-topic.sh),我希望看到它没有领导者 (-1)。

    启用授权时,它们将应用于到达您的集群的所有 Kafka API 消息,包括诸如 StopReplica、LeaderAndIsr、ControlledShutdown 等代理间消息。因此看起来您只是为您的客户端添加了 ACL,但忘记添加所需的 ACL让经纪人发挥作用。

    因此,您至少需要为代理的委托人在Cluster 资源上添加一个授予ClusterAction 的ACL。 IIRC 是代理间消息唯一需要的 ACL。

    之后,您的集群应该能够正确地为分区选择一个领导者,使您的客户端能够进行生产。

    【讨论】:

    • 谢谢。该主题的Leader设置为0。我尝试发出集群ACL命令--cluster --add ClusterAction,但没有效果。我仍然遇到同样的错误。
    • 请忽略我的评论 :) 它确实有效。它仅在重新启动节点后才开始工作。谢谢!
    猜你喜欢
    • 2019-01-31
    • 1970-01-01
    • 2018-09-15
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多