AMQ Message Store AMQ Message Store 是ActiveMQ5.0版本及以上默认的持久化存储,他是一个及其快速和可靠的可嵌入式,基于文件、事物存储的消息持久存储解决方案。消息命令被顺序追加写入事物日志,这意味着写入速度非常快,并且命令日志很容易recover(恢复)。 消息被存储在日志文件中,消息在日志文件位置引用被保存到另外一个存储结构(默认 kaha)。这样创建消息主键索引,并且提供缓存机制,进一步提升了性能。 对对消息的引用保存在内存中并且周期性的插入到引用store中以提升性能, 每个日志文件的大小都是有限制的(默认32m,可自行配置,甚至这个文件大小可以更大如果消息超出了文件设定大小)。当超过这个大小,系统会重新建立一个文件。当所有的消息都消费完成,系统会删除这个文件或者归档(发生在下一次清理期间)主要的缺点是AMQ Message会为每一个Destination创建一个索引,如果使用了大量的Queue,索引文件的大小会占用很多磁盘空间。而且由于索引巨大,一旦Broker崩溃,重建索引的速度会非常慢。目前已不推荐使用。
JDBC Support 支持一系列的SQL数据库用于消息持久化例如:
Apache Derby | Axion | DB2 | HSQL | Informix | MaxDB | MySQL | Oracle | Postgresql | SQLServer | Sybase
ActiveMQ自动从JDBCAdapter检测jdbc驱动,如果你的JDBC不支持请告知我们,我们会尽快修复。
首先定义一个mysql-ds的MySQL数据源,然后在persistenceAdapter节点中配置jdbcPersistenceAdapter并且引用刚才定义的数据源。
|
你可以用
statements 来定义SQL数据类型 比如字段大小
|
如果你使用mysql作为数据源你需要设置relaxAutoCommit 为ture
|
KahaDB是一个基于文件的持久性数据库,相对于broker是本地存储。KahaDb恢复时间远远小于其前身AMQ并且使用更少的数据文件,所以可以完全代替AMQ。KahaDB是从ActiveMQ 5.4开始默认的持久化插件。
Slow File System Access Diagnostic Logging(慢文件系统诊断日志)
如果你的文件系统很慢,你可以指定一个毫秒级别非0阀值来验证数据库更新速度,如果数据库操作慢于那个阀值,会打印如下日志:
Slow KahaDB access: cleanup took 1277 | org.apache.activemq.store.kahadb.MessageDatabase | ActiveMQ Journal Checkpoint Worker
你可以通过系统属性来指定该值,注意匹配你的磁盘速度。你可以轻松获取由于慢文件系统引起的异常
-Dorg.apache.activemq.store.kahadb.LOG_SLOW_ACCESS_TIME=1500
Multi(m) kahaDB Persistence Adapter
从ActiveMQ 5.6开始 ActiveMQ已经支持可以通过 kahdb persistence adapters 配置多个destinations stores,什么时候需要这样做呢?
如果你有一个能进行快速消费的destination和一个周期性不规则消费的destination,导致未消费的消息会分散的存储在
多个日志文件中,那么磁盘的使用就会变的不可控,为最细力度使用日志的场景创建各自的日志存储, 甚至有些destination会要求同步访问磁盘有些不会,在这种情况下你可以使用mKahaDB persistence adapter和destinations wildcards。
如果没有目标队列提交给filteredKahaDB,那么意味着对所有的队列有效。如果一个队列没有对应的适配器,那么将会抛出一个异常
<persistenceAdapter> |
如果filteredKahaDB的perDestination属性设置为true,那么匹配的目标队列将会得到自己对应的KahaDB实例。配置如下:
|
Transactions...
如果destinatios是分布式的,事物可以跨越多个日志文件,这意味着需要俩个阶段必须完成,以牺牲性能为代价去存储事物提交结果,这个性能代价只会在一个事物中涉及一个以上的日志文件出现。
补充:非持久化消息、事务内的消息均采用异步发送;对于持久化消息采用同步发送。
http://activemq.apache.org/how-do-transactions-work.html
Kaha Peristence 是一个专门用于消息持久化的存储解决方法,是ActiveMQ项目的一部分,在持久化消息的读写和丢弃方法有很好的性能。
kaha数据存储在日志文件中 一旦日志文件中没有感兴趣的数据 该日志文件将被丢弃。
配置kaha persistence
ActiveMQ 5.0 and above:
|
LevelDB 已经不再被ActiveMQ推荐使用,不做阐述....
Periodically checking disk limits
通过配置文件和节点可用磁盘空间在broker启动的时候开辟了store和temporary disk 空间。有时候其他线程(比如日志)随着日志增长磁盘可用空间就会减少,所以在broker启动时候检测到的可用磁盘空间就没有任何意义了。从ActiveMQ version 5.12.0版本,通过broker属性字段schedulePeriodForDiskUsageCheck >0, 可以配置broker周期性的检查磁盘空间,并且对配置(store,temporary disk)相应做出调整。e.g:
|
每60秒将会检查store、temporary disk limits
从5.7正式发布版本开始,ActiveMQ persistence adapter 可以选择以插件形式配置storage locking。这个配置只对共享存储有意义。对于KahaDB persistence adapter来说storage locking机制基于共享文件锁,类似的JDBC persistence adapter 是基于数据库支持的存储锁。现在storage locker脱离了persistence adapter(可插拔),所有的可插拔locker必须实现Locker接口,你也可以集成该接口自定义自己需要的locker。
之前每一个persistence adapter有他们自己默认的locker(估计融合到一块了,5.7实现可插拔)
.............