发现kafka的某个topic消费不了了,卡在了某个offset上,查看topic状态,发现 ISR只存活一个,其他的挂了。查看服务日志,一台服务器一直打印 :ERROR [Replica Manager on Broker 1]:Error processing fetch operation on partition XX-1,offset 49700025 [kafka.server.ReplicaManager] org.apache.kafka.common.errors.CorruptRecordException:Record size is smaller than mininum overhead(14)
另一台服务器报错日志为:ERROR [ReplicaFetcher ] Error for partition XX-1 to broker 2:org.apache.kafka.common.errors.CorruptRecordException: This message has failed its CRC checksum, exceeds the valid size, or is otherwise corrupt. (kafka.server.ReplicaFetcherThread)
各种百度,谷歌,都毫无头绪,基本都是全英文的,有些在kafka的jira的bug列表中,有些就是各种源码,然后还有说改什么参数的。看英文解释意思大概是,kafka里面的消息大小小于了最小设定的值,然后同步到副本节点报错,然后一直卡在了那条消息的offset。
最终经过了深思熟虑,跟自己的聪明才智,决定进行手动同步主节点的数据到副本节点,其实就是手动拷贝那个报错的topic的partition的文件到副本节点上。
解决方案:
先把kafka服务停掉。
把报错的topic的partition所有文件,从主节点拷贝到副本节点去。如 XX-1 整个目录拷贝到副本节点并替换,当然,你可以先备份副本节点的数据。然后重要的,查看主节点的 recover-point-offset-checkpoint 和 replication-offset-checkpoint 文件,看你需要的topic的partition的offset的数值是多少,然后修改副本节点的 这两个文件的这个参数。
最后重启kafka就可以了。