新接入的服务启动报 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。
