1. 程式人生 > >ActiveMQ消息持久化-KahaDB

ActiveMQ消息持久化-KahaDB

kahadb

KahaDB

KahaDB是從ActiveMQ 5.4開始默認的持久化插件。

KahaDb恢復時間遠遠小於其前身AMQ並且使用更少的數據文件,所以可以完全代替AMQ。(AMQ適用於ActiveMQ5.3之前的版本。)

KahaDB的持久化機制同樣是基於日誌文件,索引和緩存。


一、配置方式:

activemq.xml

<persistenceAdapter>
      <kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>


二、KahaDB主要特性

1、日誌形式存儲消息;

2、消息索引以B-Tree結構存儲,可以快速更新;

3、完全支持JMS事務;

4、支持多種恢復機制;


三、KahaDB的結構

消息存儲在基於文件的數據日誌中。如果消息發送成功,變標記為可刪除的。系統會周期性的清除或者歸檔日誌文件。

消息文件的位置索引存儲在內存中,這樣能快速定位到。定期將內存中的消息索引保存到metadata store中,避免大量消息未發送時,消息索引占用過多內存空間。

技術分享

Data logs:

Data logs用於存儲消息日誌,消息的全部內容都在Data logs中。

同AMQ一樣,一個Data logs文件大小超過規定的最大值,會新建一個文件。同樣是文件尾部追加,寫入性能很快。

每個消息在Data logs中有計數引用,所以當一個文件裏所有的消息都不需要了,系統會自動刪除文件或放入歸檔文件夾。

Metadata cache :

緩存用於存放在線消費者的消息。如果消費者已經快速的消費完成,那麽這些消息就不需要再寫入磁盤了。

Btree索引會根據MessageID創建索引,用於快速的查找消息。這個索引同樣維護持久化訂閱者與Destination的關系,以及每個消費者消費消息的指針。

Metadata store

在db.data文件中保存消息日誌中消息的元數據,也是以B-Tree結構存儲的,定時從Metadata cache更新數據。Metadata store中也會備份一些在消息日誌中存在的信息,這樣可以讓Broker實例快速啟動。

即便metadata store文件被破壞或者誤刪除了。broker可以讀取Data logs恢復過來,只是速度會相對較慢些。


一個實際的ActiveMQ的KahaDB存儲方式下的數據目錄如下:

技術分享

可以看出,上面directory一共有四個文件:

①db.data

它是消息的索引文件。本質上是B-Tree的實現,使用B-Tree作為索引指向db-*.log裏面存儲的消息。

②db.redo

主要用來進行消息恢復。

③db-*.log 存儲消息的內容。對於一個消息而言,不僅僅有消息本身的數據(message data),而且還有(Destinations、訂閱關系、事務...)

data log以日誌形式存儲消息,而且新的數據總是以APPEND的方式追加到日誌文件末尾。因此,消息的存儲是很快的。比如,對於持久化消息,Producer把消息發送給Broker,Broker先把消息存儲到磁盤中(enableJournalDiskSyncs配置選項),然後再向Producer返回Acknowledge。Append方式在一定程度上減少了Broker向Producer返回Acknowledge的時間。

④lock文件


四、KahaDB的配置選項

屬性
默認值描述
directoryactivemq-data消息文件和日誌的存儲目錄
journalMaxFileLength32mb一個消息文件的大小。當存儲的消息達到32MB時,新建一個新文件來保存消息。這個配置對生產者或消息者的速率有影響。比如,生產者速率很快而消費者速率很慢時,將它配置得大一點比較好。
indexWriteBatchSize1000當Metadata Cache中更新的索引到達了1000時,才同步到磁盤上的Metadata Store中。不是每次更新都寫磁盤,而是批量更新寫磁盤,比較寫磁盤的代價是很大的。
indexCacheSize10000在內存中最多分配多個頁面來緩存index。緩存的index越多,命中的概率就越大,檢索的效率就越高。
enableJournalDiskSyncstrue

默認采用同步寫磁盤,即消息先存儲到磁盤中再向Producer返回ACK。

cleanupInterval30000清除操作周期,單位ms。當消息被消息者成功消費之後,Broker就可以將消息刪除了。
checkpointInterval5000索引寫入到消息文件的周期,單位ms。每隔5s將內存中的Index(Metadata Cache)更新到磁盤的Index文件中(Metadata Store)


參考文檔:

  1. http://activemq.apache.org/kahadb.html

  2. http://www.cnblogs.com/hapjin/p/5674257.html

  3. https://access.redhat.com/documentation/en-US/Fuse_ESB_Enterprise/7.0/html-single/Configuring_Message_Broker_Persistence/index.html#KahaDBOverview


ActiveMQ消息持久化-KahaDB