新接入的服务启动报 SaslAuthenticationException: Authentication failed during authentication due to invalid credentials,同一份账号在其他服务能用。乍看像缓存或者权限的锅,追下去往往不是。

# consumer.properties
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required \
  username="app" password="secret";

追下去是这么回事:security.protocol 配成 PLAINTEXT,broker 却要求 SASL_PLAINTEXT,握手阶段没有提交认证信息。也可能是 JAAS 配置文件路径没带进去。

碰到「Kafka SASL 认证」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

具体做法是,核对客户端 security.protocol 与 broker 的 listener 名称一致;启动参数加 -Djava.security.auth.login.config 指向 jaas.conf;确认 sasl.mechanism 与 broker 端一致 常见是 PLAIN 或 SCRAM-SHA-512;用 kafka-console-consumer 带同样配置验证账号。

验收就看一点,console-consumer 能拉到消息 服务启动日志里不再出现 SaslAuthenticationException。

作者 9823189