我在向使用ACL保护的Kafka主题(名为secure.topic
)生成消息时遇到问题。
我的基于Groovy的生产者抛出了这个错误:
Error while fetching metadata with correlation id 9 : {secure.topic=LEADER_NOT_AVAILABLE}
有关配置的一些注意事项:
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
错误的原因吗?
答案 0 :(得分:2)
从授权程序日志看,授权人在ClusterAction
资源上拒绝Cluster
。
如果您检查主题状态(例如使用kafka-topic.sh
),我希望看到它没有领导者(-1)。
启用授权时,它们将应用于到达集群的所有Kafka API消息,包括代理间消息,如StopReplica,LeaderAndIsr,ControlledShutdown等。因此,您似乎只为客户端添加了ACL,但忘记添加所需的ACL让经纪人发挥作用。
因此,您至少需要在ClusterAction
资源上为您的经纪人的主体添加一个ACL Cluster
。 IIRC是代理间消息唯一需要的ACL。
在此之后,您的群集应该能够正确选择分区的领导者,使您的客户能够生成。