当从设备的commitLog与主设备不匹配时,HA可能不可用

版本:4.3.4.4.0 当奴隶的机器坏了几天时,在机器修好后启动奴隶在这种情况下,master无法将commitLog数据发送到slave,这导致SYNC_master在向该代理发送消息时返回slave_NOT_AVAIABLE在master的broker.log中搜索,可以找到“Slave fall落后于master:xxx”

经过分析,我发现从方的commitLog偏移量在主方的commit Log中不存在,这导致主方getCommitLogData的偏移量超出范围返回null,然后只发送心跳

一些资源代码如下:

SelectMappedBufferResult selectResult = HAConnection.this.haService.getDefaultMessageStore().getCommitLogData(this.nextTransferFromWhere); if (selectResult != null) { int size = selectResult.getSize(); if (size > HAConnection.this.haService.getDefaultMessageStore().getMessageStoreConfig().getHaTransferBatchSize()) { size = HAConnection.this.haService.getDefaultMessageStore().getMessageStoreConfig().getHaTransferBatchSize(); }

                    long thisOffset = this.nextTransferFromWhere;
                    this.nextTransferFromWhere += size;

                    selectResult.getByteBuffer().limit(size);
                    this.selectMappedBufferResult = selectResult;

                    // Build Header
                    this.byteBufferHeader.position(0);
                    this.byteBufferHeader.limit(headerSize);
                    this.byteBufferHeader.putLong(thisOffset);
                    this.byteBufferHeader.putInt(size);
                    this.byteBufferHeader.flip();

                    this.lastWriteOver = this.transferData();
                } else {
                    service.getWaitNotifyObject().wakeupAll();
                    HAConnection.this.haService.getWaitNotifyObject().allWaitForRunning(100);
                }

我认为当master收到slaveRequestOffset时,计算nextTransfer FromWhere应该检查slaveRequest Offset是否合法,而不仅仅是

this.nextTransferFromWhere = HAConnection.this.slaveRequestOffset;

原提问者GitHub用户qsrg

展开
收起
芬奇福贵 2023-05-26 10:43:31 74 分享 版权
1 条回答
写回答
取消 提交回答
  • 在这种情况下,很难自行校正偏移量,因此通常会重建从机,并删除从机的存储目录。

    原回答者GitHub用户RongtongJin

    2023-05-26 17:02:29
    赞同 展开评论
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

还有其他疑问?
咨询AI助理