KahaDB is a file based persistence database that is local to the message broker that is using it. It has been optimized for fast persistence. It is the the default storage mechanism since ActiveMQ 5.4. KahaDB uses less file descriptors and provides faster recovery than its predecessor, the AMQ Message Store.
To use KahaDB as the broker's persistence adapter configure ActiveMQ as follows (example):
Time (ms) before check-pointing the journal.
Create a checksum for a journal file. The presence of a checksum is required in order for the persistence adapter to be able to detect corrupt journal files.
Before ActiveMQ 5.9.0: the default is
The interval (in ms) between consecutive checks that determine which journal files, if any, are eligible for removal from the message store. An eligible journal file is one that has no outstanding references.
From ActiveMQ 5.14.0: when the acknowledgement compaction feature is enabled this value controls how many store GC cycles must be completed with no other files being cleaned up before the compaction logic is triggered to possibly compact older acknowledgements spread across journal files into a new log file. The lower the value set the faster the compaction may occur which can impact performance if it runs to often.
From ActiveMQ 5.14.0: when the acknowledgement compaction feature is enabled this value controls whether compaction is run when the store is still growing or if it should only occur when the store has stopped growing (either due to idle or store limits reached). If enabled the compaction runs regardless of the store still having room or being active which can decrease overall performance but reclaim space faster.
Enable the dispatching of Queue messages to interested clients to happen concurrently with message storage.
Enable the dispatching of Topic messages to interested clients to happen concurrently with message storage
Enabling this property is not recommended.
The path to the directory to use to store the message store data and log files.
Define the directory to move data logs to when they all the messages they contain have been consumed.
From ActiveMQ 5.14.0: this setting controls whether the store will perform periodic compaction of older journal log files that contain only Message acknowledgements. By compacting these older acknowledgements into new journal log files the older files can be removed freeing space and allowing the message store to continue to operate without hitting store size limits.
Ensure every journal write is followed by a disk sync (JMS durability requirement).
This property is deprecated as of ActiveMQ 5.14.0.
From ActiveMQ 5.14.0: see
Number of index pages cached in memory.
From ActiveMQ 5.10.0: If set, configures where the KahaDB index files (
Number of indexes written in a batch.
Interval (ms) for when to perform a disk sync when
From ActiveMQ 5.14.0: this setting configures the disk sync policy. The list of available sync strategies are (in order of decreasing safety, and increasing performance):
A hint to set the maximum size of the message data logs.
The maximum number of asynchronous messages that will be queued awaiting storage (should be the same as the number of concurrent MessageProducers).
From ActiveMQ 5.14.0: this setting configures how journal data files are preallocated. The default strategy preallocates the journal file on first use using the appender thread.
On SSD, using
Note: on HDD the additional thread contention for disk has a negative impact. Therefore use the default.
From ActiveMQ 5.12.0: This setting configures how the broker will try to preallocate the journal files when a new journal file is needed.
From ActiveMQ 5.15.5: This setting will commit or rollback all prepared XA transactions during recovery as a mass decision to handle prepared transactions.
This features will perform a commit or rollback on all prepared XA transactions, please consider using the RecoverXATransaction MBean to manually review for commit or rollback of specific transactions.
Determines the version of OpenWire commands that are marshaled to the KahaDB journal.
Before ActiveMQ 5.12.0: the default value is
Some features of the broker depend on information stored in the OpenWire commands from newer protocol revisions and these may not work correctly if the store version is set to a lower value. KahaDB stores from broker versions greater than 5.9.0 will in many cases still be readable by the broker but will cause the broker to continue using the older store version meaning newer features may not work as intended.
For KahaDB stores that were created in versions prior to ActiveMQ 5.9.0 it will be necessary to manually set
|From ActiveMQ 5.16, When disabled, the gc/cleanup iteration on broker stop won't happen, which will speed up shutdown. Trade off disk usage against availability via failover. With very large stores, index traversal can be costly.|
For tuning locking properties see the options listed at Pluggable storage lockers.
Slow File System Access Diagnostic Logging
You can configure a non zero threshold in milliseconds for database updates. If database operation is slower than that threshold (for example if you set it to
500), you may see messages like:
You can configure a threshold used to log these messages by using a system property and adjust it to your disk speed so that you can easily pick up runtime anomalies.
Multi(m) kahaDB Persistence Adapter
From ActiveMQ 5.6: it's possible to distribute destinations stores across multiple kahdb persistence adapters. When would you do this? If you have one fast producer/consumer destination and another periodic producer destination that has irregular batch consumption then disk usage can grow out of hand as unconsumed messages become distributed across multiple journal files. Having a separate journal for each ensures minimal journal usage. Also, some destination may be critical and require disk synchronization while others may not. In these cases you can use the
mKahaDB persistence adapter and filter destinations using wildcards, just like with destination policy entries.
Transactions can span multiple journals if the destinations are distributed. This means that two phase completion is necessary, which does impose a performance (additional disk sync) penalty to record the commit outcome. This penalty is only imposed if more than one journal is involved in a transaction.
Each instance of
kahaDB can be configured independently. If no destination is supplied to a
filteredKahaDB, the implicit default value will match any destination, queue or topic. This is a handy catch all. If no matching persistence adapter can be found, destination creation will fail with an exception. The
filteredKahaDB shares its wildcard matching rules with Per Destination Policies.
From ActiveMQ 5.15,
filteredKahaDB support a StoreUsage attribute named
usage. This allows individual disk limits to be imposed on matching queues.
Automatic Per Destination Persistence Adapter
perDestination="true" on the catch all, i.e., when no explicit destination is set,
filteredKahaDB entry. Each matching destination will be assigned its own
queue=">" on the same
filteredKahaDB entry has not been tested. It may result in the following exception being raised:
Reason: java.io.IOException: File '/opt/java/apache-activemq-5.9.0/data/mKahaDB/lock' could not be locked as lock is already held for this jvm