RocketMq broker硬盤空間不足的問題 -开发者知识库

RocketMq broker硬盤空間不足的問題 -开发者知识库,第1张

1、問題來源:

壓測環境是兩台namesever,兩台broker master,分別是10.255.255.142(broker-b)和10.255.255.151(broker-a),從監控上看151從2015-3-13后就沒收到過消息。

測試環境兩天master,總共的TPS是4000左右,消息大小是2K,


2、尋找問題點:

1、在eclipse環境連接壓測環境,發現消息只發送到broker-b上,沒有發送到broker-a上面。

2、懷疑是producer沒有連接上broker-a,用netstat命令查看broker-a的連接,producer連接上了broker-a

3、懷疑producer從nameserver沒有獲取到broker-a上面的消息隊列,使用MessageQueueSelector發現nameserver返回了broker-a的消息隊列。

4、只往broker-a的消息隊列上發送消息,報如下錯誤

com.alibaba.rocketmq.client.exception.MQBrokerException: CODE: 14  DESC: service not available now, maybe disk full, CL:  0.87 CQ:  0.87 INDEX:  0.87, maybe your broker machine memory too small.
For more information, please visit the url, https://github.com/alibaba/RocketMQ/issues/64
at com.alibaba.rocketmq.client.impl.MQClientAPIImpl.processSendResponse(MQClientAPIImpl.java:492)
at com.alibaba.rocketmq.client.impl.MQClientAPIImpl.sendMessageSync(MQClientAPIImpl.java:398)
at com.alibaba.rocketmq.client.impl.MQClientAPIImpl.sendMessage(MQClientAPIImpl.java:379)
at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendKernelImpl(DefaultMQProducerImpl.java:698)
at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendSelectImpl(DefaultMQProducerImpl.java:877)
at com.alibaba.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:851)
at com.alibaba.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:163)
at com.ruishenh.rocketmq.example.Producer.main(Producer.java:78)

5、發現時硬盤不足,去broker-a上查看硬盤,硬盤還是有空間

RocketMq broker硬盤空間不足的問題 -开发者知识库,第2张

6、查看RocketMQ的源碼,知道出現問題的地方:

DefaultMessageStore中的public PutMessageResult putMessage(MessageExtBrokerInner msg)

        if (!this.runningFlags.isWriteable()) {
long value = this.printTimes.getAndIncrement();
if ((value % 50000) == 0) {
log.warn("message store is not writeable, so putMessage is forbidden "
this.runningFlags.getFlagBits());
}

return new PutMessageResult(PutMessageStatus.SERVICE_NOT_AVAILABLE, null);
}
else {
this.printTimes.set(0);
}

RunningFlags類中的方法

    public boolean isWriteable() {
if ((this.flagBits & (NotWriteableBit | WriteLogicsQueueErrorBit | DiskFullBit | WriteIndexFileErrorBit)) == 0) {
return true;
}

return false;
}
7、基本判斷是硬盤不足了,讓測試人員把釋放一部分的硬盤空間,當硬盤空閑空間達到4G以上broker-a就能正常工作了,出問題的時候空閑的硬盤空間是2.5G



預留問題點:

1、為什么硬盤還有2.5G,但是broker確不能正常工作。

2、如何配置broker刪除stroe/commitlog等文件的策略。


最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复