🌈🌈🌈🌈🌈🌈🌈🌈
【11来了】文章导读地址:点击查看文章导读!
🍁🍁🍁🍁🍁🍁🍁🍁
文件恢复的目的:
让 Broker 重新启动之后,可以完成对 flushedPosition、commitedWhere
指针位置的设置,让程序可以知道上次写的位置,可以继续接收消息在上次写的位置之后继续写数据!
如何检测是否正常:
首先检查 Broker 是否正常退出的标准就是:abort
文件是否存在,如果存在表示 Broker 异常退出
abort 文件是 Broker 启动时会创建的一个临时文件,当 Broker 正常退出时,通过注册的 JVM 钩子函数就会将 abort 文件删除掉;如果异常关闭,则 abort 文件被保留,代表 Broker 异常退出
检查 Commitlog、ConsumeQueue、IndexFile 文件是否正常的标准就是: checkpoint 文件
checkpoint 会记录三个偏移量,在这三个偏移量之前的数据都是正常的:
查找执行文件恢复方法的入口:
Broker 文件恢复入口在 DefaultMessageStore # load()
,那么是从哪里调用这个恢复的入口呢?(在 Broker 启动的时候)
BrokerStartup
的 main()
主启动类中,调用了 createBrokerController()
方法
BrokerStartup
的 createBrokerController()
中调用了 initialize()
方法
BrokerController
的 initialize()
方法中,调用了 recoverAndInitService()
方法
BrokerController
的 recoverAndInitService()
方法中,调用了 load() 方法:result = this.messageStore.load()
文件恢复的流程:
首先文件恢复总体的流程如下:
那么文件恢复的入口就是在 DefaultMessageStore # load()
方法中:
boolean lastExitOK = !this.isTempFileExist()
result = this.commitLog.load()
result = result && this.consumeQueueStore.load()
<topic : <queueId : consumeQueue>>
this.recover(lastExitOK)
方法那么接下来进入到 recover(lastExitOK)
方法中,看数据恢复的逻辑是怎样的:
如果 lastExitOK 是 true,表示 Broker 正常退出,通过 this.commitLog.recoverNormally(maxPhyOffsetOfConsumeQueue)
恢复
这个方法是在 CommitLog 类中,是对 CommitLog 文件进行恢复
否则,表示 Broker 异常退出,通过 this.commitLog.recoverAbnormally(maxPhyOffsetOfConsumeQueue)
恢复