JDBC 主从
JDBC 主从
首次支持 ActiveMQ Classic 版本 4.1
如果您使用的是纯 JDBC 而不是高性能日志,那么您通常依赖于数据库作为您的单点故障和持久性引擎。如果您没有真正的高性能要求,这种方法很有意义,因为您只有一个持久性引擎需要备份和管理等。
启动
当仅使用 JDBC 作为数据源时,您可以使用主从方法,如该图所示,运行任意数量的代理。启动时,一个主代理在代理数据库中获取独占锁 - 所有其他代理都是从属代理,并暂停等待独占锁。
客户端应该使用 故障转移传输 连接到可用的代理。例如,使用类似以下的 URL
failover:(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616)
只有主代理启动其传输连接器,因此客户端只能连接到主代理。
主代理故障
如果主代理丢失与数据库的连接或丢失独占锁,它将立即关闭。如果主代理关闭或故障,其他从属代理之一将获取锁,因此拓扑结构将切换到以下图
其他从属代理之一立即在数据库上获取独占锁,然后开始成为主代理,启动其所有传输连接器。
客户端断开与已停止的主代理的连接,然后故障转移传输尝试连接到可用的代理,其中唯一可用的代理是新的主代理。
主代理重启
在任何时候,您都可以重新启动其他代理,这些代理加入集群并作为从属代理启动,等待在主代理关闭或发生故障时成为主代理。因此,在重新启动旧主代理后,将创建以下拓扑结构…
配置 JDBC 主从
默认情况下,如果您使用
以下示例演示了如何在 JDBC 主从模式下配置 ActiveMQ Classic 代理
<beans>
<!-- Allows us to use system properties as variables in this configuration file -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>
<broker xmlns="https://activemq.apache.org/schema/core">
<destinationPolicy>
<policyMap><policyEntries>
<policyEntry topic="FOO.>">
<dispatchPolicy>
<strictOrderDispatchPolicy />
</dispatchPolicy>
<subscriptionRecoveryPolicy>
<lastImageSubscriptionRecoveryPolicy />
</subscriptionRecoveryPolicy>
</policyEntry>
</policyEntries></policyMap>
</destinationPolicy>
<persistenceAdapter>
<jdbcPersistenceAdapter dataDirectory="${activemq.base}/activemq-data"/>
<!--
<jdbcPersistenceAdapter dataDirectory="activemq-data" dataSource="#oracle-ds"/>
-->
</persistenceAdapter>
<transportConnectors>
<transportConnector name="default" uri="tcp://127.0.0.1:61616"/>
</transportConnectors>
</broker>
<!-- This xbean configuration file supports all the standard spring xml configuration options -->
<!-- Postgres DataSource Sample Setup -->
<!--
<bean id="postgres-ds" class="org.postgresql.ds.PGPoolingDataSource">
<property name="serverName" value="localhost"/>
<property name="databaseName" value="activemq"/>
<property name="portNumber" value="0"/>
<property name="user" value="activemq"/>
<property name="password" value="activemq"/>
<property name="dataSourceName" value="postgres"/>
<property name="initialConnections" value="1"/>
<property name="maxConnections" value="10"/>
</bean>
-->
<!-- MySql DataSource Sample Setup -->
<!--
<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1/activemq?relaxAutoCommit=true"/>
<property name="username" value="activemq"/>
<property name="password" value="activemq"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
-->
<!-- Oracle DataSource Sample Setup -->
<!--
<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:@localhost:1521:AMQDB"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
-->
<!-- Embedded Derby DataSource Sample Setup -->
<!--
<bean id="derby-ds" class="org.apache.derby.jdbc.EmbeddedDataSource">
<property name="databaseName" value="derbydb"/>
<property name="createDatabase" value="create"/>
</bean>
-->
</beans>