ActiveMQ消息持久化-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的配置選項
屬性 | 默認值 | 描述 |
directory | activemq-data | 消息文件和日誌的存儲目錄 |
journalMaxFileLength | 32mb | 一個消息文件的大小。當存儲的消息達到32MB時,新建一個新文件來保存消息。這個配置對生產者或消息者的速率有影響。比如,生產者速率很快而消費者速率很慢時,將它配置得大一點比較好。 |
indexWriteBatchSize | 1000 | 當Metadata Cache中更新的索引到達了1000時,才同步到磁盤上的Metadata Store中。不是每次更新都寫磁盤,而是批量更新寫磁盤,比較寫磁盤的代價是很大的。 |
indexCacheSize | 10000 | 在內存中最多分配多個頁面來緩存index。緩存的index越多,命中的概率就越大,檢索的效率就越高。 |
enableJournalDiskSyncs | true | 默認采用同步寫磁盤,即消息先存儲到磁盤中再向Producer返回ACK。 |
cleanupInterval | 30000 | 清除操作周期,單位ms。當消息被消息者成功消費之後,Broker就可以將消息刪除了。 |
checkpointInterval | 5000 | 索引寫入到消息文件的周期,單位ms。每隔5s將內存中的Index(Metadata Cache)更新到磁盤的Index文件中(Metadata Store) |
參考文檔:
http://activemq.apache.org/kahadb.html
http://www.cnblogs.com/hapjin/p/5674257.html
https://access.redhat.com/documentation/en-US/Fuse_ESB_Enterprise/7.0/html-single/Configuring_Message_Broker_Persistence/index.html#KahaDBOverview
ActiveMQ消息持久化-KahaDB