为什么 KahaDB 日志文件在清理后仍然存在

 常见问题解答 > 错误 > 为什么 KahaDB 日志文件在清理后仍然存在

未引用 KahaDB 日志文件的清理 data-<id>.log 默认情况下每 30 秒执行一次。如果数据文件正在使用,则不会进行清理。

数据文件可能正在使用,因为

  1. 它包含一个正在等待的目标或持久主题订阅消息
  2. 它包含一条正在使用的消息的确认消息,确认消息无法删除,因为恢复会将消息标记为重新传递
  3. 日志引用了正在等待的事务
  4. 它是一个日志文件,并且可能有一个正在等待的写入操作

的 TRACE 级别日志记录 org.apache.activemq.store.kahadb.MessageDatabase 类提供了对清理过程的深入了解,并可以帮助您确定为什么给定数据文件被视为正在使用,因此不是清理候选对象。

要进行调试,请将以下内容(或类似内容)添加到您的 log4j.properties 文件(如果需要)

log4j.appender.kahadb=org.apache.log4j.RollingFileAppender log4j.appender.kahadb.file=${activemq.base}/data/kahadb.log log4j.appender.kahadb.maxFileSize=1024KB log4j.appender.kahadb.maxBackupIndex=5 log4j.appender.kahadb.append=true log4j.appender.kahadb.layout=org.apache.log4j.PatternLayout log4j.appender.kahadb.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n log4j.logger.org.apache.activemq.store.kahadb.MessageDatabase=TRACE, kahadb

重新启动 ActiveMQ Classic 并让清理过程运行(例如,运行一两分钟),或者将此日志记录配置应用于通过 JMX 运行的代理。的 Broker MBean 在 JMX 中公开了一个名为 reloadLog4jProperties 的操作,可用于告知代理重新加载其 log4j.properties。通常,只需应用此日志记录配置 2-5 分钟,然后分析代理的日志文件就足够了。

检查日志文件并查找数据文件的清理过程。该过程从已知数据文件的完整集合开始,并根据每个目标查询索引以修剪此列表。任何剩余的都是清理候选对象。跟踪日志记录提供了目标和剩余的日志文件编号,因为它遍历索引。

在某些时候,您将遇到一个目标,并且数据文件 ID 的数量会突然下降,因为该目标引用了它们。它可能是 DLQ 或脱机持久订阅。在任何情况下,日志记录将帮助您查明占用磁盘空间的目标。

以下是一个简单的示例

TRACE 上次更新:164:41712,完整垃圾回收候选集:[86, 87, 163, 164] org.apache.activemq.store.kahadb.MessageDatabase ActiveMQ 日志检查点工作器
TRACE 第一次事务后的垃圾回收候选对象:164:41712,[86, 87, 163] org.apache.activemq.store.kahadb.MessageDatabase ActiveMQ 日志检查点工作器
TRACE 目标后的垃圾回收候选对象:0:A,[86, 87, 163] org.apache.activemq.store.kahadb.MessageDatabase ActiveMQ 日志检查点工作器
TRACE 目标后的垃圾回收候选对象:1:B,[86, 87, 163] org.apache.activemq.store.kahadb.MessageDatabase ActiveMQ 日志检查点工作器
TRACE 目标后的垃圾回收候选对象:0:D,[86, 87, 163] org.apache.activemq.store.kahadb.MessageDatabase ActiveMQ 日志检查点工作器
TRACE 目标后的垃圾回收候选对象:0:E,[86, 87] org.apache.activemq.store.kahadb.MessageDatabase ActiveMQ 日志检查点工作器
TRACE 目标后的垃圾回收候选对象:0:H,[86, 87] org.apache.activemq.store.kahadb.MessageDatabase ActiveMQ 日志检查点工作器
TRACE 目标后的垃圾回收候选对象:0:I,[86, 87] org.apache.activemq.store.kahadb.MessageDatabase ActiveMQ 日志检查点工作器
TRACE 目标后的垃圾回收候选对象:0:J,[87] org.apache.activemq.store.kahadb.MessageDatabase ActiveMQ 日志检查点工作器
TRACE 垃圾回收候选对象:[87] org.apache.activemq.store.kahadb.MessageDatabase ActiveMQ 日志检查点工作器
DEBUG 清理正在删除数据文件:[87] org.apache.activemq.store.kahadb.MessageDatabase ActiveMQ 日志检查点工作器

我们从现有日志数据文件集 [86, 87, 163, 164]中获得一个候选对象 data-87.log。当前事务正在使用 164,目标(名为 E的队列)'**0:E**' 在 163中有一些消息,目标 '**0:I**' 在 86和 87中有一些消息, 87未被引用。在这种情况下,一定有一些长期未确认的消息,或者目标 '**0:I**'上有一个非常慢的消费者。

前缀 '**0:**' 是队列的简写,'**1:**' 是主题的简写。例如:dest:1:B 指的是名为 B的主题。


非持久消息

对于未存储在已配置的 KahaDB 持久性适配器中但在超过代理配置的 memoryUsage 限制后被交换到临时存储的非持久消息来说也是如此。类似的日志记录配置可以显示临时存储清理的详细信息。

log4j.appender.kahadb=org.apache.log4j.RollingFileAppender log4j.appender.kahadb.file=${activemq.base}/data/kahadb.log log4j.appender.kahadb.maxFileSize=1024KB log4j.appender.kahadb.maxBackupIndex=5 log4j.appender.kahadb.append=true log4j.appender.kahadb.layout=org.apache.log4j.PatternLayout log4j.appender.kahadb.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n log4j.logger.org.apache.activemq.store.kahadb=TRACE, kahadb log4j.logger.org.apache.activemq.store.kahadb.MessageDatabase=INFO, kahadb  

注意上述日志记录配置的最后一行禁用了 KahaDB 清理任务的详细日志记录。如果删除该行,KahaDB 和临时存储的清理详细信息将记录到同一个文件中,但您需要小心不要混淆日志输出。

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛徽标和 Apache ActiveMQ 项目徽标是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 许可。