Kafka ACL - LEADER_NOT_AVAILABLE

时间:2018-01-25 12:15:36

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

我在向使用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错误的原因吗?

1 个答案:

答案 0 :(得分:2)

从授权程序日志看,授权人在ClusterAction资源上拒绝Cluster

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

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

因此,您至少需要在ClusterAction资源上为您的经纪人的主体添加一个ACL Cluster。 IIRC是代理间消息唯一需要的ACL。

在此之后,您的群集应该能够正确选择分区的领导者,使您的客户能够生成。