rocketmq的broker恢复commit-log的时候如何恢复consumeQueue、indexfile

如果一个broker正常退出,是会删除abort文件的。那么启动broker的时候发现abort文件还存在,那么说明上次是异常终止,会进入到commit-log的recoverAbnormally逻辑里面,因为所有其他的信息都是从commit-log获取到的,所以追根溯源只能从commit-log开始着手。

    public void recoverAbnormally(long maxPhyOffsetOfConsumeQueue) {
        // recover by the minimum time stamp
        boolean checkCRCOnRecover = this.defaultMessageStore.getMessageStoreConfig().isCheckCRCOnRecover();
        final List<MappedFile> mappedFiles = this.mappedFileQueue.getMappedFiles();
        if (!mappedFiles.isEmpty()) {
            // Looking beginning to recover from which file
            int index = mappedFiles.size() - 1;
            MappedFile mappedFile = null;
            for (; index >= 0; index--) {
                mappedFile = mappedFiles.get(index);
                if (this.isMappedFileMatchedRecover(mappedFile)) {
                    log.info("recover from this mapped file " + mappedFile.getFileName());
                    break;
                }
            }

 从最新的mapped文件开始找,直到发现一个有效的mappedfile,对这个mappedfile文件执行操作:

        ByteBuffer byteBuffer = mappedFile.sliceByteBuffer();
        while (true) {
                DispatchRequest dispatchRequest = this.checkMessageAndReturnSize(byteBuffer, checkCRCOnRecover);
                int size = dispatchRequest.getMsgSize();

                if (dispatchRequest.isSuccess()) {
                    // Normal data
                    if (size > 0) {
                        mappedFileOffset += size;

                        if (this.defaultMessageStore.getMessageStoreConfig().isDuplicationEnable()) {
                            if (dispatchRequest.getCommitLogOffset() < this.defaultMessageStore.getConfirmOffset()) {
                                this.defaultMessageStore.doDispatch(dispatchRequest);
                            }
                        } else {
                            this.defaultMessageStore.doDispatch(dispatchRequest);
                        }
                    }

  checkMessageAndReturnSize的逻辑:

    public DispatchRequest checkMessageAndReturnSize(java.nio.ByteBuffer byteBuffer, final boolean checkCRC,
        final boolean readBody) {
        try {
            // 1 TOTAL SIZE
            int totalSize = byteBuffer.getInt();

  通过不变遍历这个最新的mappedfile的bytebuffer,把他的每一条消息取出来,并且消息一个字段就是total-size,累计求和就可以拿到这个mappedfile上次挂掉的时候到底写到哪了。对于其他的mappedfile默认认为都是写满的。

            processOffset += mappedFileOffset;
            this.mappedFileQueue.setFlushedWhere(processOffset);
            this.mappedFileQueue.setCommittedWhere(processOffset);
            this.mappedFileQueue.truncateDirtyFiles(processOffset);

  

这里已经把commit-log完全恢复了。接下来就是恢复consumequeue、indexfile了。前一节提到生成消息的时候,其实也会同步更新consumeQueue,并且刷盘。

也就是不管是故障恢复还是正常生成消息,都会涉及commit-log、consumeQueue、indexfile的更新、落盘。只不过后面两个是异步的。

他们都是通过this.defaultMessageStore.doDispatch(dispatchRequest)更新的

另外topicQueueTable完全可以通过consumeQueue得到,因为前者是后者子集:

    private void recoverTopicQueueTable() {
        HashMap<String/* topic-queueid */, Long/* offset */> table = new HashMap<String, Long>(1024);
        long minPhyOffset = this.commitLog.getMinOffset();
        for (ConcurrentMap<Integer, ConsumeQueue> maps : this.consumeQueueTable.values()) {
            for (ConsumeQueue logic : maps.values()) {
                String key = logic.getTopic() + "-" + logic.getQueueId();
                table.put(key, logic.getMaxOffsetInQueue());
                logic.correctMinOffset(minPhyOffset);
            }
        }

        this.commitLog.setTopicQueueTable(table);
    }

  

原文地址:https://www.cnblogs.com/notlate/p/12008345.html

时间: 2024-10-14 20:03:54

rocketmq的broker恢复commit-log的时候如何恢复consumeQueue、indexfile的相关文章

rocketmq的broker接收消息的时候,如何更新consumeQueue和indexfile的

首先解释下consumeQueue,由于commit-log是根据消息先后存储的,而我们消费的时候是根据topic来筛选的,所以需要一个队列根据topic来划分,所以consumeQueue就是干这个事情的.而indexfile顾名思义就是索引文件,用来做单纯查询的. private final ConcurrentMap<String/* topic */, ConcurrentMap<Integer/* queueId */, ConsumeQueue>> consumeQue

Log Explorer 查看和恢复数据库数据

[转自:作者出处:Ronli (Http://Ronli.cnblogs.com/)] [Log Explorer]查看和恢复数据库数据 使用Log Explorer查看和恢复数据 Log Explorer 4.1.可用于SQL Server2005的日志查看工具 使用方法: 打开Log Explorer -> Attach Log File -> 选择SQL Server服务器和登陆方式 -> Connect -> 在Database Name中选择数据库 -> Attac

Git误操作 git reset强制回滚 恢复commit方法

参考: 找回Git中丢失的Commit Git误操作 git reset强制回滚 恢复commit方法 使用Git时,常有误操作,在Commit之后又执行了git reset --hard HEAD强制回滚本地记录以及文件到服务器版本,导致本地做的修改全部恢复到Git当前分支的服务器版本,同时Commmit记录也消失了. 此时解决方法是通过git reflog来查看先前记录并恢复: git reflog会记录所有HEAD的历史,也就是说当你做 reset,checkout等操作的时候,这些操作会

从code review到Git commit log

最近在读一本技术类的书:朱赟--<跃迁:从技术到管理的硅谷路径>,其中聊了很多很有趣的观点,比如:技术管理.技术实践.硅谷文化.个人成长等. 读到关于硅谷人如何做code review这一篇时,不由想到了前段时间看过的一篇博客:如何写好Git commit log. 之前的工作用Git做版本管理工具,因此每次提交改动时都会写注释,其中也踩了一些坑,现在回想起来还是觉得很有收获. 这篇博客,聊聊我个人关于code review和Git commit的一些认知和资料总结,仅供参考... 参考资料:

用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 工具 方法

用友金蝶SQL数据库误格式化恢复 SQL数据库修复 SQL数据库恢复 硬盘误格式化.重分区.重装操作系统覆盖 SQL数据解决方法 [客户名称]:贵州铜仁市开天驾驶人培训中心 [软件名称]:用友T3普及版 [数据库版本]:MS SQL server 2000  [数据库大小]:1GB X 6  (3个账套 总共6个年度). [问题描述]:由于服务器中毒或卡顿,客户将服务器电脑送到 装机店 重做操作系统.未详细告知电脑用途,导致整个硬盘被维修店技术员 全盘格式化重新分区,并且重新做好了新的操作系统,

u盘内容删了怎么恢复?怎样快速的去恢复呢

u盘内容删了怎么恢复?如何快速的去恢复呢?我们很多的时候会选择使用我们的U盘去存储我们的一些数据,那么若是我们不小心删除了我们手机上的U盘内容,我们该怎么办呢?我们是不是可以恢复呢? 其实我们很多的人都遇到过这种问题,我们很多的时候都会选择这种情况,遇到这种情况你是怎么解决的呢?我们是不是真的可以通过一些方法找回呢?下面我们就一起去看看具体的操作步骤吧. 第一步:可以在过程刚刚开始的时候,打开我们丢失数据的电脑,然后在电脑浏览器上下载并安装"互盾数据恢复软件",之后对软件进行安装等待安

如何恢复手机删除的照片?恢复照片如此简单

如何恢复手机删除的照片?恢复照片如此简单.相信现在不少用户手机里都存储着大量的重要照片吧,对于这些照片有心的用户做好备份好的话,遇到了误删或是丢失的情况都不用担心的,但是未备份的照片误删了该怎么进行恢复呢? 手机出现照片误删的情况后,先不要惊慌,查看下相册中[最近删除]这个文件夹,看看是否有存有误删的照片,如果有的话进行还原的操作,如果没有的话那就根据下面小编的方式来进行照片恢复的操作吧. 方式一:手机数据恢复精灵 第一步:在手机的应用商城或是浏览器找到"手机数据恢复精灵"软件,随后进

苹果手机如何恢复通讯录联系人呢?怎样恢复

苹果手机如何恢复通讯录联系人呢?怎样恢复?我们现在很多的时候都是不怎么使用我们的手机联系人去进行一些比较日常的交流的,我们很多的时候都是会选择一些其他的软件来进行交流的. 那么若是我们不小心删除了我们的手机联系人,我们该怎么去进行恢复呢?我们又是不是真的可以找回我们删除的手机联系人呢?在没有任何的备份的情况下,我们可以使用下面的方法去恢复. 1.可以在电脑浏览器上下载"互盾苹果恢复大师",等安装结束,可以将电脑与手机相连用数据线,之后我们可以看到手机上会出现"是否信任此电脑&

手机照片恢复简单方法,如何去恢复

手机照片恢复简单方法,具体的恢复方法.在我们的手机上,我们比较常用的就是我们的手机相机,因为我们比较喜欢拍照,因此我们的手机上有许多的照片,那么你知道我们若是删除了我们的手机照片,我们该怎么办吗? 有些时候我们会出现误删的现象,因为有的时候我们可能在清理我们的垃圾图片的时候或者是清理我们的手机无用的垃圾的时候,我们给误删了,那么我们是不是可以找回我们的手机照片呢?下面我们就一起去看看吧. 第一种: 我们都知道我们的手机上有个最近删除,我们可以打开我们的相册,找到"最近删除"的相册,然后

微信如何恢复聊天记录呢?该怎么恢复呢

微信如何恢复聊天记录呢?该怎么恢复?不知道你是不是也比较喜欢用微信去和身边的人交流,或者是进行一些日常的工作,那么若是你也是这样的话,你有没有过误删手机微信记录的时候呢? 当你遇到这种情况的时候你是怎么做的呢?你是不是也想要通过一些方法去找回你的手机微信聊天记录呢?毕竟我们的微信聊天记录对于我们来说也都是比较重要的呢?那么我们该怎么去恢复呢?下面就一起看看吧. 首先,我们上使用PC端的微信,来帮助我们删除微信记录,我们可以在电脑上下载并安装微信,打开并登录电脑端的微信: 之后点击右下角的"备份与