kafka学习总结010---实际项目中遇到的问题1
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
kafka学习总结010---实际项⽬中遇到的问题1
前段时间实际项⽬中遇到了⼀个问题,特此整理下
配置信息
1.kafka集群采⽤经典部署⽅式,3节点
2.为了保证全局消息有序性,topic只有⼀个分区,三个副本
3.⽣产者和消费者均只有⼀个,均以主备微服务⽅式部署
4.消费者通过TCP⽅式将数据发送给其他服务,这⾥⽤对端代替
问题现象
对端收到的稳定数据突然丢失,引发⼀系列问题
原因排查
1.排查消费者消息⽇志,可以看到:由于⽹络问题,消费者异常重启;但是针对该场景,消费者做了故障保护机制,为啥数据会丢失呢?
2.消费者故障保护机制为:重启后,消费者对端先保持消费者发送的数据指定时间(可配置),并且消费者会向⽣产者请求全量数据。
3.但是对端保持数据时间超时后,消费者依然没有拉取到消费者重启请求的全量数据(这⾥做过性能测试,保持数据时间 > ⽣产者⽣产 + 消费者消费时间)
4.排查⽣产者⽇志,发现⽣产者在⽣产全量数据时,返回了写⼊topic错误的异常!进⼀步排查,发现分区所在磁盘空间已满。
5.排查了⼀轮才发现这个问题,但是为啥磁盘空间满了呢?创建topic时明明设置了log⽂件最多保存7天以及未消费的数据不清除,难道问题出在了⽣产者⽣产的数据未被消费?
6.数据未消费的怀疑很快被否决了,因为使⽤消费数据的设备明明已经正常运⾏了两个多⽉,并且业务是正常的,⽆奈了。
7.继续分析⽣产者和消费者⽇志,突然发现:消费者在消费确认时,报了⼀个错userdata cannot be null的错,原因是,消费者客户端填充的userdata为null,引发异常,也就是说消费者实际消费到了数据,但是kafka服务端认定数据未被消费过。
问题的根因
1.消费者客户端使⽤的是C语⾔客户端rdkafka,它与java客户端kafka-client实现存在差异,即:消费确认时,不会⾃动填充userdata,⽽kafka服务端认为userdata未填充是异常场景
2.由于topic的配置为未消费的数据不清理,因此⽆论过了多久,数据都不会被清理,最终导致磁盘空间爆满。