启用Kafka ACL后出现LEADER_NOT_AVAILABLE错误的原因排查
嘿,这个问题我太熟了!你看到的Error while fetching metadata with correlation id 9 : {secure.topic=LEADER_NOT_AVAILABLE}其实是个表象,真正的原因藏在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)
为什么会这样?
Kafka生产者在发送消息前,必须先获取集群和主题的元数据(比如找到主题的Leader节点位置),这个过程需要执行ClusterAction这个集群级别的操作——而你当前只给用户配置了secure.topic的权限,完全没授权集群级的ClusterAction权限,所以Kafka授权器直接拒绝了这个元数据请求,最终导致生产者误以为Leader节点不可用。
解决步骤
你需要给用户补充两个关键权限:集群级的ClusterAction,以及主题级的Describe(确保能读取主题元数据),具体操作如下:
添加集群级ClusterAction权限
使用Kafka自带的kafka-acls.sh工具执行命令(替换你的ZooKeeper地址和Principal信息):kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \ --add --allow-principal User:"CN=User,OU=XXX,O=XXX,L=XXX,ST=Unknown,C=X" \ --operation ClusterAction \ --cluster确保主题权限配置完整
虽然你说已经给了主题的All权限,但建议再确认一下(或者单独添加核心权限):kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 \ --add --allow-principal User:"CN=User,OU=XXX,O=XXX,L=XXX,ST=Unknown,C=X" \ --operation Describe \ --operation Write \ --topic secure.topic验证权限
用以下命令检查权限是否生效:kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --list --cluster kafka-acls.sh --authorizer-properties zookeeper.connect=localhost:2181 --list --topic secure.topic
额外说明
你之前移除authorizer.class.name后能正常发送消息,确实证明SSL和证书配置没问题——因为此时Kafka跳过了ACL权限检查,生产者能顺利获取元数据并发送消息。但启用ACL后,必须满足集群+主题的权限要求,才能完成完整的消息发送流程。
内容的提问来源于stack exchange,提问作者Luciano Fiandesio

