2016年7月7日星期四

ActiveMQ_033:KahaDB 清扫日志配置

环境:MAC OS X 10.11.5 + ActiveMQ 5.13.3

使用 Kahadb 做持久化时,会生成诸如 db-1.log、db-2.log...文件,这些文件的存在的依据是:
  • 某个 Queue/Topic 包含未决消息,或者是持久化订阅。
  • 包含某个消息的 ack 消息,ack 消息不能移除,否则会导致重新发送原始  message。
  • 有未决事务。
  • 正在执行写入操作。
1. 配置 Kahadb 清扫日志
在 conf/log4j.properties 文件的最后,增加如下内容:

#############
# Kahadb log
#############

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,清扫进程会开始工作。默认会每 5 秒钟会扫描一次数据日志文件(checkpointInterval),每 30 秒进行一次清除(cleanupInterval)。
它会遍历每一个数据文件,遍历每一个 Queue/Topic,检查是否有消息在某个数据文件之中,如果 Queue/Topic 都没有消息在某个文件中,该文件将作为清扫的候选文件。
Queue 用 0 表示,Topic 用 1 表示。
有时,你会发现某个候选的数据文件突然消失了,这是因为有 Queue/Topic 突然引用了它们,或者是 DLQ, 或者是一个离线的持久化订阅。

2. 举例说明

TRACE | Last update: 164:41712, full gc candidates set: [86, 87, 163, 164] | org.apache.activemq.store.kahadb.MessageDatabase | ActiveMQ Journal Checkpoint Worker
TRACE | gc candidates after first tx:164:41712, [86, 87, 163] | org.apache.activemq.store.kahadb.MessageDatabase | ActiveMQ Journal Checkpoint Worker
TRACE | gc candidates after dest:0:A, [86, 87, 163] | org.apache.activemq.store.kahadb.MessageDatabase | ActiveMQ Journal Checkpoint Worker
TRACE | gc candidates after dest:1:B, [86, 87, 163] | org.apache.activemq.store.kahadb.MessageDatabase | ActiveMQ Journal Checkpoint Worker
TRACE | gc candidates after dest:0:D, [86, 87, 163] | org.apache.activemq.store.kahadb.MessageDatabase | ActiveMQ Journal Checkpoint Worker
TRACE | gc candidates after dest:0:E, [86, 87] | org.apache.activemq.store.kahadb.MessageDatabase | ActiveMQ Journal Checkpoint Worker
TRACE | gc candidates after dest:0:H, [86, 87] | org.apache.activemq.store.kahadb.MessageDatabase | ActiveMQ Journal Checkpoint Worker
TRACE | gc candidates after dest:0:I, [86, 87] | org.apache.activemq.store.kahadb.MessageDatabase | ActiveMQ Journal Checkpoint Worker
TRACE | gc candidates after dest:0:J, [87] | org.apache.activemq.store.kahadb.MessageDatabase | ActiveMQ Journal Checkpoint Worker
TRACE | gc candidates: [87] | org.apache.activemq.store.kahadb.MessageDatabase | ActiveMQ Journal Checkpoint Worker
DEBUG | Cleanup removing the data files: [87] | org.apache.activemq.store.kahadb.MessageDatabase | ActiveMQ Journal Checkpoint Worker

一开始,有 4 个文件候选:86、87、163、164。接着 164 中有未决事务,Queue E 引用了 163,Queue J 引用了 86,因此最后只有 87 是最终的可以被清扫的数据文件。

参考文献:
1. http://activemq.apache.org/why-do-kahadb-log-files-remain-after-cleanup.html

没有评论: