ActiveMQ使用JDBC持久化

young 567 2021-11-03

activemq集群 master/slave主从模式 jdbc持久化存储配置总结

版本:5.14.5

三台activemq服务器
机器1   机器2    机器3

主要配置文件

conf/activemq.xml

1. brokerName 配置

将三台机器的brokerName分别设置为 localhost0,localhost1,localhost2三个不同的名字

2. 开启jmx监控

useJmx="true"

3. 添加splitSystemUsageForProducersConsumers

添加splitSystemUsageForProducersConsumers="true",将生产者和消费者使用的内存分开,以防因为生产者过多导致消费阻塞

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost1" dataDirectory="${activemq.data}"
        useJmx="true" splitSystemUsageForProducersConsumers="true">
    ...
</broker>

4. 编写数据源配置

在broker标签之外添加数据源,本次采用的是dbcp连接池

<bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@ (DESCRIPTION =   (ADDRESS_LIST =    (ADDRESS =     (PROTOCOL = TCP)     (HOST = 192.168.0.1)     (PORT = 1521)    )   )   (CONNECT_DATA =     (SERVER = DEDICATED)     (SERVICE_NAME = orcl)  ))"/>
    <property name="username" value="mq"/>
    <property name="password" value="mq"/>
    <property name="maxTotal" value="200"/>
    <property name="maxIdle" value="30"/>
    <property name="maxWaitMillis" value="-1"/>
    <property name="minIdle" value="5"/>
    <property name="validationQuery" value="select 1 from dual"/>
    <property name="testWhileIdle" value="true"/>
    <property name="maxActive" value="200"/>
    <property name="poolPreparedStatements" value="true"/>
    <property name="timeBetweenEvictionRunsMillis" value="60000"/>
    <property name="minEvictableIdleTimeMillis" value="1800000"/>
</bean>

5.修改持久化方式

注释掉原来broker标签中的的持久化方式,新增jdbc持久化

<persistenceAdapter>
     <jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#oracle-ds"
        useDatabaseLock="true" lockKeepAlivePeriod="10000">
        <locker>
          <lease-database-locker lockAcquireSleepInterval="10000"/>
        </locker>
     </jdbcPersistenceAdapter>
</persistenceAdapter>

createTablesOnStratup 指是否在节点启动时创建数据库,一般在启动第一个节点时设置为true,之后都改为false
useDatabaseLock 指是否使用数据库锁
lockKeepAlivePeriod  指节点定期检查自己是否是master节点的时间间隔
lockAcquireSleepInterval  指slave节点尝试成为master节点的时间间隔

6.修改使用的系统资源

<systemUsage>
    <systemUsage sendFailIfNoSpaceAfterTimeout="3000">
        <memoryUsage>
            <memoryUsage percentOfJvmHeap="70" />
        </memoryUsage>
        <storeUsage>
            <storeUsage limit="10 gb"/>
        </storeUsage>
        <tempUsage>
            <tempUsage limit="2 gb"/>
        </tempUsage>
    </systemUsage>
</systemUsage>

sendFailIfNoSpaceAfterTimeout 表示如果因为消费者正忙而无法消费,则在3秒后再次发送
percentOfJvmHeap 表示占堆内存的百分比
storeUsage 表示持久化磁盘的最大容量(这里因为是持久化到数据库,所以并不使用)
tempUsage 表示因为消费者正忙而无法及时消费时,缓存到磁盘中的最大容量

7.设置activemq的内存

在activemq的bin目录下的activemq中,修改ACTIVEMQ_OPTS

ACTIVEMQ_OPTS="-Xms1G -Xmx1G -Dorg.apache.activemq.SERIALIZABLE_PACKAGES=bis.api,bets.api,java"

Xms表示最小堆内存,Xmx表示最大堆内存
后面一行表示信任的包名,作用是可以在8161的web端看到队列中的具体内容

6.启动activemq

  1. 将机器1的createTablesOnStartup属性设置为true,在activemq下的bin目录使用 ./activemq start启动机器1,
    因为机器1是第一个启动的节点,所以机器1可以获取锁并成为master节点
  2. 将机器2的createTablesOnStartup属性设置为false,启动机器2,
    因为机器1已经占据锁,所以机器2启动为slave,不能接收消息,当机器1down掉之后,机器2会获取锁成为master节点接收消息,
    并继承机器1的所有消息
  3. 将机器3的createTablesOnStartup属性设置为false,启动机器3
  4. 将机器1的createTablesOnStartup属性设置为false
  1. 除了之外,activemq还有另外一种锁机制,
    如果采用,当运行一段时间后,master节点down掉之后,slave会无法启动成为新的master节点。
  2. jdbcPersistenceAdapter默认 useDatabaseLock="false",
    如果使用默认配置,启动slave节点后,slave节点会取代master节点成为新的节点,而原来的master节点又会成为slave节点
    经过lockAcquireSleepInterval毫秒后,新的slave节点又会取代master节点,导致master节点频繁变动。