现场血案:Kafka CRC 异常
一、背景
现场童鞋说客户的研发环境突然在近期间歇式的收到了CRC的相关异常,异常内容如下
Record batch for partition skywalking-traces-0 at offset 292107075 is invalid, cause: Record is corrupt (stored crc = 1016021496, compute crc = 1981017560)
报错完全没有规律性,有可能半天都不出现一次,也有可能一小时出现2、3次
而这个报错会导致Kafka的Consumer hang死,即无法继续消费后续的消息,只能手动重启Consumer才能继续,是非常严厉的报错,会直接导致生产不可用
另外,我们部署的供内部云平台组建使用的Kafka也会出现这种报错
二、分析
我们另一个客户现场之前也出现过CRC报错:
- 当前客户现场,问题只会出现一次,如果手动重启Consumer,该问题便会消失,如果换个Consumer来消费,问题也会消失,好像它只是昙花一现,且再也无法复现,如同鬼魅
- 另一个客户现场,确实会报CRC异常,但稳定复现,只要出现了,不论Consumer重启多少次,也不论多少个Consumer来消费,均是会报CRC异常
这完全不是一个现象了,似乎又陷入了瓶颈
猜测原因:
- Kafka社区Bug:当前使用的版本是2.8.2,仔细翻阅了2.8版本的版本,都没有发现传输过程crc的bug,似乎从kafka1.0版本后基本上就没有crc相关的bug了
- 网络问题,如果网络过程中被篡改数据,似乎符合这个场景
- 机器原因,磁盘部分损坏?这种情况是会出现crc,但是会一直出现,就跟另一个现场的情景一样。也发现如果内存出现问题也会出现crc,但是检查了一圈未发现这个内存问题
似乎该问题大概率是网络问题,当然家里也模拟过客户现场环境,没法复现,因此只能在客户现场先从网络方面排查,还好客户也比较支持这个排除,因此还算顺利。
三、网络排查
3.1、埋点
进行网络排查的话,我们就要执行TCP抓包,即执行tcp