最近工作中又踩到Kafka的一坑。
某日收到业务侧告警说无数据,首先怀疑Flume问题,因为之前踩的Flume坑多嘛,发现某个Flume实例中有ChannelFullException,因为用的是memory channel,确认可丢数据后杀死Flume进程,起来后channel又满了。
于是确定应该是下游Kafka问题,查了每个Kafka实例的日志,发现一个实例的日志中反复打kafka.common.NotLeaderForPartitionException,而这个异常的等级又仅是ERROR,没把Kafka自己弄死。
之后又从主机告警中看到这台机器有慢盘问题。因为这个Kafka集群分发的数据量很大,因此组了一个20+台机器的集群,每台挂12块3T盘,以保证日志空间够用。为了恢复慢盘,决定把Kafka干掉,unmount掉盘准备再mount时,发现mount不上了,看来是硬盘故障。但奇怪的是硬盘故障没有导致Kafka实例挂掉,也没有避免写入该盘的机制,只是挂起在那里。
其实这个问题只要看一下Kafka源码就不难理解了。
Kafka源码分析(5)中,LogManager的构造方法中有以下调用:
createAndValidateLogDirs(logDirs)
这个方法的具体代码如下:
/**
* Create and check va