持久化消息存储
Primeton MQ支持的存储方案:KahaDB存储(默认存储方式)、JDBC存储、LevelDB存储。
KahaDb
同样在pmq.xml中配置如下:
<persistenceAdapter>
<kahaDB directory="${pmq.data}/kahadb"/>
</persistenceAdapter>
KahaDB主要元素包括:一个内存Metadata Cache用来在内存中检索消息的存储位置、若干用于记录消息内容的Data log文件、一个在磁盘上检索消息存储位置的Metadata Store、还有一个用于在系统异常关闭后恢复Btree结构的redo文件。
在data/kahadb这个目录下,会生成四个文件
- db.data 它是消息的索引文件,本质上是B-Tree(B树),使用B-Tree作为索引指向db-*.log里面存储的消息。
- db.redo 用来进行消息恢复。
- db-*.log 存储消息内容。新的数据以APPEND的方式追加到日志文件末尾。属于顺序写入,因此消息存储是比较快的。默认是32M,达到阀值会自动递增。
- lock文件锁,表示当前获得kahadb读写权限的broker。
常见参数配置:
参数名称 | 默认值 | 描述 |
---|---|---|
directory | pmq-data | 消息文件和日志的存储目录。 |
indexWriteBatchSize | 1000 | 当Metadata cache区域和Metadata store区域不同的索引数量达到这个值后,Metadata cache将会发起checkpoint同步。 |
indexCacheSize | 10000 | 内存中,索引的页大小。超过这个大小Metadata cache将会发起checkpoint同步。 |
enableIndexWriteAsync | false | 索引是否异步写到消息文件中,建议不要设置为true。 |
journalMaxFileLength | 32mb | 一个消息文件的大小。 |
enableJournalDiskSyncs | true | 如果为true,保证使用同步写入的方式持久化消息到journal文件中。 |
cleanupInterval | 30000 | 清除(清除或归档)不再使用的db-*.log文件的时间周期(毫秒)。 |
checkpointInterval | 5000 | 写入索引信息到metadata store中的时间周期(毫秒)。 |
ignoreMissingJournalfiles | false | 是否忽略丢失的journal文件。如果为false,当丢失了journal文件时,broker启动时会抛异常并关闭。 |
checkForCorruptJournalFiles | false | 检查消息文件是否损坏。如果为true,检查发现损坏会尝试修复。 |
checksumJournalFiles | false | 产生一个checksum,以便能够检测journal文件是否损坏。 |
JDBC方式
配置如下:
<broker>
<!-- 配置Primeton MQ连接到Mysql服务 -->
<!-- 记得去掉原来的KahaDB或者LevelDB的配置 -->
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#mysql_ds"
createTablesOnStartup="true"/>
</persistenceAdapter>
......
</broker>
<!-- 就是spring的配置文件结构 -->
<bean id="mysql_ds" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/pmqserver?
relaxAutoCommit=true&useUnicode=true&characterEncoding=utf-8"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
<property name="minPoolSize" value="10"/>
<property name="maxPoolSize" value="30"/>
<property name="initialPoolSize" value="10"/>
</bean>
添加数据库驱动:
mysql-connector-java-5.1.46.jar
在配置关系型数据库作为Primeton MQ的持久化存储方案时,要注意几个事项:
- 在jdbcPersistenceAdapter标签中,我们设置了createTablesOnStartup属性为true,这是为了在第一次启动Primeton MQ时,Primeton MQ服务节点会自动创建所需要的数据表。启动完成后,可以去掉这个属性,或者更改createTablesOnStartup属性为false。
LevelDb存储
配置如下:
<persistenceAdapter>
<levelDB directory="${pmq.data}/levelDB"/>
</persistenceAdapter>