为什么 KahaDB 日志文件在清理后仍然存在
常见问题解答 > 错误 > 为什么 KahaDB 日志文件在清理后仍然存在
未引用 KahaDB 日志文件的清理 data-<id>.log
默认情况下每 30 秒执行一次。如果数据文件正在使用,则不会进行清理。
数据文件可能正在使用,因为
- 它包含一个正在等待的目标或持久主题订阅消息
- 它包含一条正在使用的消息的确认消息,确认消息无法删除,因为恢复会将消息标记为重新传递
- 日志引用了正在等待的事务
- 它是一个日志文件,并且可能有一个正在等待的写入操作
的 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 和临时存储的清理详细信息将记录到同一个文件中,但您需要小心不要混淆日志输出。