如何排查 Amazon MQ for ActiveMQ 中的“持久性存储已满”错误?

上次更新日期:2022 年 4 月 19 日

我无法向 Amazon MQ for ActiveMQ 代理发送消息。在 Amazon CloudWatch 中查看代理的日志时,我看到“持久性存储已满”错误。导致错误的原因是什么?如何解决该问题?

简短描述

当代理达到其存储限制时,Amazon MQ for ActiveMQ 会向 CloudWatch 返回 Persistent store is Full(持久性存储已满)错误。当 Amazon MQ for ActiveMQ 代理达到其存储限制时,代理将无法接收消息。

要解决 Persistent store is Full(持久性存储已满)错误,请首先查看代理的以下 CloudWatch 指标,以确认错误原因:

  • 存储使用百分比
  • 完整恢复的日志文件
  • 快速恢复的日志文件

然后,根据代理指标和需要,减少保存到代理持久性存储中的数据量。

为了帮助防止此错误再次发生,请参阅本文的防止“持久性存储已满”错误的最佳实践部分。有关更多信息,请参阅 Apache ActiveMQ 文档中的 AMQ 消息存储创建器流控制

Amazon MQ for ActiveMQ 代理的 CloudWatch“持久性存储已满”错误消息示例

INFO | Usage(default:store:queue://broker.name:store) percentUsage=99%, usage=537210471, limit=536870912, percentUsageMinDelta=1%;Parent:Usage(default:store) percentUsage=100%, usage=537210471, limit=536870912,percentUsageMinDelta=1%: Persistent store is Full, 100% of 536870912. Stopping producer (ID:xxxx) to prevent flooding queue://broker.name. See http://activemq.apache.org/producer-flow-control.html for more info (blocking for: 155s)

解决方法

确认引起错误的原因

1.    打开 CloudWatch 控制台

重要提示:请确保登录到代理所在的同一 AWS 区域。

2.    从左侧导航窗格中选择 Metrics(指标)。然后,选择 All metrics(所有指标)。此时将打开 CloudWatch Metrics(指标)页面。

3.    在 Metrics(指标)页面上,选择 Amazon MQ。然后,选择 Broker Metrics(代理指标)。

4.    在搜索框中,输入代理的名称。然后,按键盘上的 Enter 键。此时将显示您在搜索框中输入的代理的所有 CloudWatch 指标。

5.    查看 Store Percentage Usage(存储使用百分比)指标值。如果代理的 Store Percentage Usage(存储使用百分比)指标达到 100,则代理将停止接收消息并返回 Persistent store is Full(持久性存储已满)错误。

6.    如果代理的 Store Percentage Usage(存储使用百分比)指标为 100(或接近 100),请查看以下指标的值以确定原因:

  • 完整恢复的日志文件 – 指示干净关闭后重播的日志文件的数量。此指标的增加表明代理的使用器运行缓慢,或者持久性存储中待处理的消息过多。
  • 快速恢复的日志文件 – 指示不干净关闭后重播的日志文件的数量。此指标的增加表明持久性存储中待处理的消息过多。

注意:由于以下任何原因,ActiveMQ KahaDB 日志文件(数据文件)可能会保留在持久性存储中:

  • 数据文件包含持久主题订阅或目标的待处理消息。
  • 数据文件包含对正在使用的数据文件中的消息的单独确认 (ACK)。
  • 数据文件引用了待处理的事务。
  • 数据文件是日志文件,并且有待执行的写入操作。

有关更多信息,请参阅 ActiveMQ 文档中的为什么清理后 KahaDB 日志文件仍然存在

减少保存到 Amazon MQ for ActiveMQ 代理的持久性存储中的数据量

使用或删除位于代理队列和持久主题中的待处理消息

有关说明,请参阅 Apache ActiveMQ 文档中的如何清除队列

注意:Amazon MQ for ActiveMQ 目前不支持 Java 管理扩展 (JMX)。您必须使用 ActiveMQ Web 控制台清除代理的队列和持久主题。

使用或删除代理死信队列 (DLQ) 中的过期消息

有关说明,请参阅 Apache ActiveMQ 文档中消息重新传递和 DLQ 处理自动丢弃过期消息部分。

注意:要使用代理 DLQ 中的消息,请先将 DLQ 配置为常规队列。然后,将使用器配置为直接轮询 DLQ。

防止“持久性存储已满”错误的最佳实践

验证是否为您的使用案例选择了正确的代理实例类型

有关更多信息,请参阅 Amazon MQ 开发人员指南中的为获得最佳吞吐量选择正确的代理实例类型

注意:根据您的使用案例,向代理添加使用器有时可以帮助代理提高消息吞吐量。

提高所使用的使用器的数量和速度

在持久模式下使用 ActiveMQ 时,通常会在使用器太少或使用器运行缓慢时写入存储。提高所使用的使用器的数量和速度有助于减少代理写入持久性存储的数据量。

根据代理的“存储使用百分比”指标设置 CloudWatch 警报

如果代理的 Store Percentage Usage(存储使用百分比)指标达到 100(或接近 100),则代理将停止接收消息。要让 CloudWatch 在此指标达到特定阈值时提醒您,您可以在 CloudWatch 中设置警报。然后,您可以在错误发生之前采取本文中描述的预防措施。

有关说明,请参阅 CloudWatch 用户指南中的基于静态阈值创建 CloudWatch 警报


这篇文章对您有帮助吗?


您是否需要账单或技术支持?