如何发现数据丢失
为了确保consumer消费的数据一定是接着上一次consumer消费的数据,consumer消费时,记录本次取出的第一条数据,将其offset和上次consumer最后消费的offset进行对比,如果相同则继续消费。如果不同,则停止消费,检查原因。如果是单台服务器,记录到本地文件即可,但一般业务场景都是多台服务器,这时通常使用zookeeper。但即使这样也有可能发生消息丢失的情况。
如何判断数据丢失的问题出现在生产者还是消费者?
- kafka支持数据的重新回放功能(换个消费group),清空目的端所有数据,重新消费。
- 如果多次消费结果一样,那么大概率是在消费端丢失数据。
- 如果每次结果应该完全一样(在写入端没有问题的前提下),那么是在写入端丢失数据。
数据丢失的几种情况及解决方法
1、原因:offset自动提交,此时消费者未消费(消费者宕机,或线程被kill……)
解决办法:令auto.commit.enable = false,关闭自动提交,改成手动提交,每次数据处理完后再提交。
详细解释:消费者消费数据时,分为三步:fetch数据,将offset保存到zookeeper上,消费数据。第二步执行后,如果kafka上的设置auto.commit.enable = true,kafka上这部分数据就被commit掉了。这就导致,如果在第二步和最后一步消费之间,消费者机器宕机,kafka认为消息已经被消费掉