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