基于文件锁的ActiveMQ集群

基于文件锁的ActiveMQ集群

目前的MQ服务使用了基于共享文件锁的集群方式,使用了主从两台机器进行主备的相互切换.

MQ的消息均使用了持久化配置,用于保证消息的可靠性.

最初使用了自身默认的KahaDB作为存储引擎,后来发现此种方式下日志文件过多,容易造成IO问题和达到操作系统的文件打开限制.

虽然可以加大限制的阀值,但终归不能很好的解决此问题.

后台关注到了一个第三方的基于KahaDB的引擎即MKahaDB,目前也已经集成到了ActiveMQ,只是并未作为默认的配置.

通过使用MkahaDB的策略,将MQ中的Quene和Topic单独分文件夹,没个文件夹下不超过5个日志文件.

由于是粗放的配置,不论繁忙与否的消息队列都占用了同样的存储空间,这样的配置自然也不是最优的.

另外一个问题是在某此宕机后,恢复MQ时发生文件IO错误java.lang.NegativeArraySizeException,异常信息如下:

Caused by: java.io.IOException: Invalid location: 2:1027735314, : java.lang.NegativeArraySizeException
	at org.apache.kahadb.journal.DataFileAccessor.readRecord(DataFileAccessor.java:92)
	at org.apache.kahadb.journal.Journal.read(Journal.java:604)
	at org.apache.activemq.store.kahadb.MessageDatabase.load(MessageDatabase.java:879)
	at org.apache.activemq.store.kahadb.MessageDatabase.recoverProducerAudit(MessageDatabase.java:551)
	at org.apache.activemq.store.kahadb.MessageDatabase.recover(MessageDatabase.java:478)
	at org.apache.activemq.store.kahadb.MessageDatabase.open(MessageDatabase.java:366)
	at org.apache.activemq.store.kahadb.MessageDatabase.load(MessageDatabase.java:385)
	at org.apache.activemq.store.kahadb.MessageDatabase.doStart(MessageDatabase.java:240)
	at org.apache.activemq.store.kahadb.KahaDBStore.doStart(KahaDBStore.java:181)
	at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:56)
	at org.apache.activemq.store.kahadb.KahaDBPersistenceAdapter.doStart(KahaDBPersistenceAdapter.java:196)
	at org.apache.activemq.util.ServiceSupport.start(ServiceSupport.java:56)
	at org.apache.activemq.store.kahadb.MultiKahaDBPersistenceAdapter.startAdapter(MultiKahaDBPersistenceAdapter.java:172)

 

校验消息服务的日志文件时失败了,可以通过如下配置显式的进行处理:

<persistenceAdapter>
      <kahaDB directory="activemq-data" checksumJournalFiles="true" checkForCorruptJournalFiles="true"/>
    </persistenceAdapter>

 

留下回复