當broker正常關閉時, KahaDB message store會將所有的緩存數據刷到文件系統中。尤其是這些數據:
1、所有未處理的日誌數據
2、所有緩存的metadata
最後meta store中的信息與journal數據文件中的數據保持一致性。
正常情況下,在系統恢復時優先讀取journal中的數據。因爲metacache中的索引信息是週期性的更新到meta store中的。當系統異常關閉時,可能journal中有的數據meta store中並沒有不存在索引。但是KahaDB在恢復時會先讀取meta store中的數據,然後再讀取journal有但是meta store不存在的數據(因爲KahaDB根據meta store中的索引信息快速定位到metastore沒有但是journal文件中包含的數據,然後根據這些數據重新在meta store中建立索引信息)
KahaDB會在更新metadata store之前,保存更新操作的概要信息到重做日誌(db.redo)中。減少系統異常關閉時的風險。因爲重做日誌非常小,所以在系統異常關閉時能快速寫入。當系統恢復時會判斷重做日誌中的信息是否需要更新到metadata中。
如果 metadata store 已被不可挽回的損壞了,可以刪除metadata store文件(db.data)來強制恢復;只不過這個時候,broker會讀取所有的journal文件來重建metadata store,需要一段比較長的時間。
KahaDB可以檢測是否有journal文件丟失,如果有丟失,默認將會拋出一個異常然後關閉。便於管理員調查丟失的journal文件,並手動還原。可以通過設置ignoreMissingJournalfiles爲true,讓broker在啓動時忽略這些丟失的journal文件。
KahaDB同樣可以檢測journal文件的完整性。不過這些特性需要明確的配置來啓用。
- <persistenceAdapter>
- <kahaDB directory="activemq-data"
- journalMaxFileLength="32mb"
- checksumJournalFiles="true"
- checkForCorruptJournalFiles="true"
- />
- </persistenceAdapter>
KahaDB的各個可配置屬性:
屬性 | 默認值 | 描述 |
directory | activemq-data | 保存message store數據文件的目錄 |
indexWriteBatchSize | 1000 | 批量更新索引的閥值,當要更新的索引到達這個索引時,批量更新到metadata store中 |
indexCacheSize | 10000 | 指定metadata cache的大小 |
enableIndexWriteAsync | false | 寫入索引文件到metadata store中的方式是否採用異步寫入 |
journalMaxFileLength | 32mb | 消息持久數據文件的大小 |
enableJournalDiskSyncs | true | 如果爲true,保證使用同步寫入的方式持久化消息到journal文件中 |
cleanupInterval | 30000 | 清除(清除或歸檔)不再使用的journal 文件的時間週期(毫秒)。 |
checkpointInterval | 5000 | 寫入索引信息到metadata store中的時間週期(毫秒) |
ignoreMissingJournalfiles | false | 是否忽略丟失的journal文件。如果爲false,當丟失了journal文件時,broker啓動時會拋異常並關閉 |
checkForCorruptJournalFiles | false | 如果爲true,broker在啓動的時候會檢測journal文件是否損壞,若損壞便嘗試恢復它。 |
checksumJournalFiles | false | 如果爲true。KahaDB爲journal文件生產一個checksum,以便能夠檢測journal文件是否損壞。 |
archiveDataLogs | false | 如果爲true,當達到cleanupInterval週期時,會歸檔journal文件而不是刪除 |
directoryArchive | null | 指定歸檔journal文件存放的路徑 |
databaseLockedWaitDelay | 10000 | 在使用主從數據庫備份時,等待獲取DB上的lock的延遲時間。 |
maxAsyncJobs | 10000 | 等待寫入journal文件的任務隊列的最大數量。應該大於或等於最大併發producer的數量。配合並行存儲轉發屬性使用。 |
concurrentStoreAndDispatchTransactions | false | 如果爲true,轉發消息的時候同時提交事務 |
concurrentStoreAndDispatchTopics | false | 如果爲true,轉發Topic消息的時候同時存儲消息的message store中。 |
concurrentStoreAndDispatchQueues | true |
如果爲true,轉發Queue消息的時候同時存儲消息到message store中。 |