Broker关机恢复是指恢复 CommitLog、Consume Queue、Index File 等数据文件。Broker 关机分为正常调用命令关机和异常被迫进程中止关机两种状况。恢复过程的设计目标是使进程正常中止的进程实现零数据丢失,异常中止的进程实现最少许的数据丢失。与关机恢复相关的主要文件有两个:abort 和 checkpoint。apache
abort 是一个空文件,标记当前 Broker 是否正常关机,Broker 进程正常启动的时候,建立该文件。Broker进程正常中止后,该文件会被删除;若是异常退出,则文件依旧存在,建立和删除的过程以下:spa
checkpoint 是检查点文件,保存 Broker 最后正常存储各类数据的时间,在重启 Broker 时,恢复程序知道从什么时刻恢复数据。检查点逻辑由 org.apache.rocketmq.store.StoreCheckpoint 类实现。设计
在 StoreCheckpoint 类中保存了 3 个时间,更新过程以下图:3d
StoreCheckpoint 中存储的 3 个时间参数:blog
physicMsgTimestamp 和 logicsMsgTimestamp 的更新都是在数据存储成功后进行的,过程比较简单。而 indexMsgTimestamp 的逻辑是在 Index File 刷盘时被更新的,Index File 刷盘方法 org.apache.rocketmq.store.index.IndexService.flush()。在Index File 刷盘后,已刷盘文件的最后存储消息时间被赋值给 indexMsgTimestamp,并对 Checkpoint 文件进行刷盘。进程