问题:
生产环境使用kafka进行双活机房redis集群数据同步,某天收到双机房redis集群数据量不一致的告警,对同步情况进行排查,发现对端机房被同步的topic有大量消息堆积,使用kafdrop查看分区数据消费情况,发现大部分分区消费正常,堆积很少,少量分区堆积巨大,offset不再更新,被阻塞了。
分析:
查看consumer测日志,发现大量打印以下错误日志
"ERROR: Consumer Message Fatal Error
java.lang.IllegalStateException: Iterator is in failed state"
往前查找日志,发现在第一次打印上面日志之前,有一条报错:
"kafka.common.MessageSizeTooLargeException: Found a message lager than the maximum fetch size of this consumer on topic xxxx partition 2 at fetch offset xxxxx. Increase the fetch size , or decrease the maximum massage size the broker will allow."
发现是消息体大于consumer最大配置,导致阻塞
根因:
1.业务使用redis集群存在大于1M的key
2.业务侧配置kafka producer配置最大发送消息大小为10M: max.request.bytes=10485760
3.kafka服务端broker配置最大消息大小为10M:
message.max.bytes=10485760
replica.fetch.max.bytes=10485760
3.对端kafka consumer没有修改最大消息体大小配置,使用默认配置,最大消息体大小为1M: fetch.message.max.bytes=1048576
总结提升:
1.流程把控:该问题是业务/redis/kafka三个产品没有完全协商一致导致的,后面应该沟通到位,信息传递到位
2.版本优化:kafka consumer应该对超过最大限制的消息进行丢弃,不应该阻塞
2.告警优化:原则上应该收到三处告警,topic堆积告警,双活机房数据量不一致告警,consumer主机磁盘空间告警,以及consumer日志监控ERROR关键字告警