如何从Kafka中损坏的文件中恢复?
我们正在运行一个三节点群集,其复制因子为2且ISR = 1。最近我们曾经几乎同时失败的所有经纪人都是同一时间。这导致代理ID 102下降而其他两个代理恢复的情况。不幸的是,一个主题的至少一个分区具有102个领导者,isr也只有102个。这意味着其他代理从该分区中丢失了一些(未知)数据,因此他们拒绝从该主题接收/发送数据。
由于我想恢复我的集群和数据,所以我尝试重新启动代理102。但是在某些未知文件上,此消息失败
[2018-07-18 14:44:44,806] ERROR There was an error in one of the threads during logs loading: org.apache.kafka.common.KafkaException: java.io.EOFException: Failed to read `log header` from file channel `sun.nio.
ch.FileChannelImpl@375a9d12`. Expected to read 17 bytes, but reached end of file after reading 0 bytes. Started read from position 2147483631. (kafka.log.LogManager)
[2018-07-18 14:44:44,809] ERROR [KafkaServer id=102] Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
org.apache.kafka.common.KafkaException: java.io.EOFException: Failed to read `log header` from file channel `sun.nio.ch.FileChannelImpl@375a9d12`. Expected to read 17 bytes, but reached end of file after reading
0 bytes. Started read from position 2147483631.
不幸的是,这并不能告诉我哪个文件已损坏。我曾多次尝试重新启动代理102,希望它进行的所有重新索引编制都能以某种方式恢复文件,但没有运气。
我的猜测是,有问题的文件是不是所在分区的分区,而该分区的死领导者为102。所以我在想
a)我可以删除102上不是领导者的分区上102上的所有日志文件,当它重新联机时,它将重新同步而不会出现问题吗?
b)如果以某种方式找到正确的文件并将其删除,我可以使102重新启动吗?
c)有什么办法可以找出卡夫卡阻塞了哪个文件?
答案 0 :(得分:1)
在3个节点的群集上具有RF = 2和ISR = 1时,当分区缩小到1个节点时可能会导致状态不一致,并且在此期间更改领导者可能会导致2个节点接受写入作为领导者。因此,您可能会获得2个版本的历史记录。
为了保证一致性,您以后可能更喜欢acks = all的RF = 3和ISR = 2。
您可以尝试使用DumpLogSegments
实用工具来检查102
日志文件的有效性并从其中转储数据:
bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files 000000000000000xxx.log
解析日志文件并将其内容转储到控制台,这对于调试看似损坏的日志段很有用。
您需要与当前的分区负责人经纪人核对那里不存在哪些消息,然后重新发布它们。