问题描述

开发环境的一个老kafka集群,集群所在机器的一个节点磁盘被占满了导致broker节点挂掉了,进行重新启动时,报错:org.apache.zookeeper.KeeperException$NoAuthException:=Noauth for/consumers

原因分析

由于这个kafka集群是一个老集群,并且是没有鉴权认证的,此时居然报了一个没有权限的错误,给我都干懵了… 不过问题还是要看的,于是乎,进入后台看了一下集群的配置文件,发现kafka集群确实是不带鉴权,但是kafka和zk之间是带鉴权的… 真是让人很无语的操作,至今我也不是很明白,kakfa如果对外没有鉴权,单单和zk之间有鉴权的优势在哪…
好了,废话不在多说,当发现kafka和zk之间有鉴权,那么没啥说的,先去查一下此目录的权限啊:getAcl /consumers,结果发现是’world,'anyone cdrwa 也就是说没有权限方面的限制
然后更奇怪的事情发生了…将另外一个节点主动停掉后,在重新启动,然后发现也起不来了,报同样的错,这就难办了呀,正常在用的节点重启都起不来了,这着实让人懵逼,不过话又说回来了,咱不就是干这个的么,继续排查吧!
然后经过一番痛苦的排查+度娘+询问大神(此处省略一天的崩溃排查原因时间,详情就不好多说了),甚至中间将整个集群所有节点服务(包括zk节点和broker节点)全都停止掉(因为是开发环境嘛)然后发现所有停掉的服务zk节点能启动,broker节点启动就报错没权限,最后发现,zk节点启动的时候读的权限配置文件,是另外一个kakfa集群的(带鉴权)(两个集群在同样的机器上以不同的端口部署的),于是对比排查了一下zookeeper-server-start脚本,发现KAFKA_OPTS变量配置的路径也没有问题,这就奇怪了,路径配置都没有问题,怎么会读到别的配置上去了呢?由此就想到(当然不是第一时间想到的…)是不是linux环境有啥问题,然后查看了一下profile,果然,KAFKA_OPTS被配成了环境变量,值是另外一个带鉴权的鉴权配置文件的路径,启动zk和启动broker都需要此变量配的鉴权文件路径,而且一般来说是两个不同的鉴权配置文件,如果配置成linux环境变量,肯定会导致启动zk和启动broker时读取同一个文件,况且,实际环境中,还搭建了两套kafka集群…(对于此骚操作,表示******),

解决方案

将被设置成环境变量的KAFKA_OPTS取消设置(unset),然后这样启动时就能读取脚本中配置的路径了,启动zk,启动broker,集群恢复!

思考

kafka集群搭建中,如果资源允许,最好是集群独占机器,并且最好按照一定的规范去操作,不然时间久了,环境乱七八糟的了,可能连自己一时间也找不出问题在哪了

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐