D 的个人博客

全职做开源,自由职业者

  menu

ActiveMQ JDBC 主从集群

从 ActiveMQ 4.1 版本开始支持 JDBC 主从集群。

如果你正在使用纯 JDBC 以及非高性能日志,那可以认为数据库是一个存在单点故障的地方。

如果你的应用没有高性能需求,那单一数据库的方式是最容易备份与管理的。(译注:可以理解为使用 JDBC 主从集群使用单一数据库容易配置)

启动

当你使用 JDBC 作为数据源时,你可以使用主从方式进行 ActiveMQ 集群,运行多个代理如下图。

启动时,一个主代理将从数据库获取排它锁——所有其他的从代理将暂停服务,等待获取锁。

Startup

客户端应该使用故障转移传输来连接 ActiveMQ 服务代理。例如使用如下形式的 URL:

failover:(tcp://broker1:61616,tcp://broker2:61616,tcp://broker3:61616)

主代理必须启动传输连接器后客户端才能连接到,详见文末配置示例。(译注:获取排它锁后,主代理才会启动传输连接器)

主代理故障

当主代理丢失数据库连接或丢失排它锁时,主代理将被关闭。当主代理关闭或故障时,其他任一从代理将获取到排它锁,拓扑逻辑如下图:

MasterFailed

一旦某一从代理获取了数据库排它锁,则它将成为主代理,并启用传输连接器。

客户端丢失对已经停止服务的代理,并使用故障转移传输尝试连接其他代理——唯一可用的就是刚才新启的主代理。(译注:客户端应该是逐一尝试,因为此时客户端并不知道哪个地址的代理成为了主代理)

主代理重启

任何时刻你都可以重启集群中已经挂了的代理,重启后拓扑逻辑如下图:

MasterRestarted

配置 JDBC 主从

使用 <jdbcPersistenceAdapter/> 避免高性能日志,从而使用默认的 JDBC 主从配置。你只需启动多个代理并配置客户端 URLs 来连接该主从集群。

这些代理都会尝试获取数据库表排它锁,并且只有一个代理会获取到从而成为主代理。

 

如下的配置示例展示了如何配置 ActiveMQ JDBC 主从集群:

<beans>

<!-- Allows us to use system properties as variables in this configuration file -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"/>

<broker xmlns="http://activemq.apache.org/schema/core">

 1&lt;destinationPolicy&gt;
 2  &lt;policyMap&gt;&lt;policyEntries&gt;
 3    
 4      &lt;policyEntry topic="FOO.&gt;"&gt;
 5        &lt;dispatchPolicy&gt;
 6          &lt;strictOrderDispatchPolicy /&gt;
 7        &lt;/dispatchPolicy&gt;
 8        &lt;subscriptionRecoveryPolicy&gt;
 9          &lt;lastImageSubscriptionRecoveryPolicy /&gt;
10        &lt;/subscriptionRecoveryPolicy&gt;
11      &lt;/policyEntry&gt;
12
13  &lt;/policyEntries&gt;&lt;/policyMap&gt;
14&lt;/destinationPolicy&gt;
15
16
17&lt;persistenceAdapter&gt;
18    &lt;jdbcPersistenceAdapter dataDirectory="${activemq.base}/activemq-data"/&gt;
19
20    &lt;!-- 
21    &lt;jdbcPersistenceAdapter dataDirectory="activemq-data" dataSource="#oracle-ds"/&gt;
22    --&gt; 
23&lt;/persistenceAdapter&gt;
24
25&lt;transportConnectors&gt;
26   &lt;transportConnector name="default" uri="tcp://localhost:61616"/&gt;
27&lt;/transportConnectors&gt;

</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://localhost/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>

 

译自:http://activemq.apache.org/jdbc-master-slave.html