原文地址:http://fusesource.com/docs/broker/5.4/tuning/PersTuning-KahaDB.html
Overview:ActiveMQ的消息存储发生了一些演变,现在KahaBD 消息存储是默认的,也是推荐的存储机制。AMQ消息存储,和原kaha消息存储已经成为上一代的存储技术了。
KahaDB architecture:KahaDB技术架构(如图2.3所示)是为高速存取消息而设计的。数据的块存数在journal file中(数据日志文件)所有的Broker事件可以持续不断的增加进来,特别是消息也是存储在数据文件中。
Figure 2.3. KahaDB Architecture
B-tree index的设计是为了更快的把消息从日志文件中恢复出来,它包含一个指向日志文件中消息存储的位置的指针。完整的B-tree index存储在磁盘上,并且部分B-tree index被加载到内存中的缓存里面。显而易见的是如果B-tree index被全部加在到缓存中的话,那么效率会更高。
配置示例:
下面的示例演示了如何配置Broker使用kahadb存储,增加一个persistenceAdapter项,包含kahaDB元素。
<broker brokerName="broker" persistent="true" useShutdownHook="false">
...
<persistenceAdapter>
<kahaDB directory="activemq-data" journalMaxFileLength="32mb"/>
</persistenceAdapter>
</broker>
其中directory
指定了kahadb的存储位置,journalMaxFileLength
指定了日志文件的大小。
性能调优:你可以调整下面的几个选项来优化kahadb的性能。
indexCacheSize
- (默认为10000
) 设定缓存页的个数(一页默认情况下是4 KB),一般来说缓存的大小尽可能的设置大一些,以避免内存不足时频繁的交换。根据你的元数据文件(db.data
)来获得更多的灵感来设定缓存的大小。indexWriteBatchSize
—(default1000
) 设置脏索引(dirty indexe)(译者注:脏索引的个人理解是cache中的index和message store中的index状态不一样的都称为dirty)达到多少之后,就需要把索引存储起来。如果你想最大化broker的速度,那么就把这个值设置的尽可能的大一些,这样的话,仅会在到达checkpoint的时候,索引才会被存储起来。但是这样会增大系统出错的时候,丢失大量的元数据的风险。(导致borker重启的时候会非常慢)journalMaxFileLength
—(default32mb
) 当broker的吞吐量特别大的时候,日志文件会很快被写满,这样会因为频繁的关闭文件,打开文件而导致性能低下。你可以通过调整文件的size,减少文件切换的频率,从而获得轻微的性能改善。enableJournalDiskSyncs
—(defaulttrue
)通常,broker会在给producer确认之前,把消息同步到磁盘上(并且确保消息物化到磁盘上)。你可以通过设置这个选项为false,从而获得本质的性能改善。但是这样的话,多少会的降低broker的可靠性。
更多的详情,请参考 see Optimizing the Metadata Cache 和 ConfigurationWarning:如果你需要满足JMS持久化的要求,并且确信你不想丢失数据化话,请不要关闭这个选项。