如何从Kafka的损坏文件中恢复?
我们正在运行一个三节点集群,复制因子为2,isr=1。最近我们几乎同时倒闭的所有经纪人都是同一时间。这导致了这样一种情况:代理id 102关闭,而其他两个代理恢复。不幸的是,一个主题的至少一个分区中有102个分区是主分区,isr也只有102。这意味着其他代理丢失了来自这个分区的一些(未知)数据量,因此它们拒绝接收/发送来自这个主题的数据。
因为我想恢复我的集群和数据,所以我正在尝试重新启动Broker102。但是它在一些未知的文件上失败了 [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 headerfrom 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 headerfrom 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.
不幸的是,这并没有告诉我哪个文件坏了。我反复尝试重新启动broker102,希望它所做的所有重新索引都能以某种方式恢复文件,但没有成功。
我的猜测是,有问题的文件并不是来自102为其死领导的分区。所以我在想
a) 我能删除102上所有的日志文件吗?如果102不是主分区,当它重新联机时,它会简单地重新同步而没有问题吗?
b) 如果我找到正确的文件并将其删除,是否可以重新启动102?
c) 有没有办法弄清楚Kafka被哪个文件噎住了?
1条答案
按热度按时间hrysbysz1#
在一个3节点的集群上,rf=2和isr=1可能会导致分区收缩到1节点时状态不一致,而在这段时间内改变前导可能会导致2个节点接受写操作作为前导。因此,您可能会得到两个版本的历史。
为了保证一致性,您可能希望在将来rf=3和isr=2,acks=all。
你可以试着用
DumpLogSegments
要检查的实用程序102
记录文件的有效性并从中转储数据:解析日志文件并将其内容转储到控制台,这对于调试看似损坏的日志段非常有用。
您需要与当前的分区引导代理检查哪些消息不存在,然后重新发布它们。