持久化消息存储

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&amp;useUnicode=true&amp;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>

results matching ""

    No results matching ""