金氧

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 主从

使用 避免高性能日志,从而使用默认的 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">
 
    <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://localhost: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://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>

« 互联网中继聊天协议(IRC) 为什么这段代码输出的是”Hello World” »