JDBC 主从

功能 > 集群 > 主从 > JDBC 主从

JDBC 主从

首次支持 ActiveMQ Classic 版本 4.1

如果您使用的是纯 JDBC 而不是高性能日志,那么您通常依赖于数据库作为您的单点故障和持久性引擎。如果您没有真正的高性能要求,这种方法很有意义,因为您只有一个持久性引擎需要备份和管理等。

启动

当仅使用 JDBC 作为数据源时,您可以使用主从方法,如该图所示,运行任意数量的代理。启动时,一个主代理在代理数据库中获取独占锁 - 所有其他代理都是从属代理,并暂停等待独占锁。

客户端应该使用 故障转移传输 连接到可用的代理。例如,使用类似以下的 URL

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

只有主代理启动其传输连接器,因此客户端只能连接到主代理。

主代理故障

如果主代理丢失与数据库的连接或丢失独占锁,它将立即关闭。如果主代理关闭或故障,其他从属代理之一将获取锁,因此拓扑结构将切换到以下图

其他从属代理之一立即在数据库上获取独占锁,然后开始成为主代理,启动其所有传输连接器。

客户端断开与已停止的主代理的连接,然后故障转移传输尝试连接到可用的代理,其中唯一可用的代理是新的主代理。

主代理重启

在任何时候,您都可以重新启动其他代理,这些代理加入集群并作为从属代理启动,等待在主代理关闭或发生故障时成为主代理。因此,在重新启动旧主代理后,将创建以下拓扑结构…

配置 JDBC 主从

默认情况下,如果您使用 来避免高性能日志,您将默认使用 JDBC 主从。您只需要运行多个代理并将客户端端 URI 指向它们即可获得主/从。这是因为它们都尝试在数据库中的共享表上获取独占锁,只有一个会成功。

以下示例演示了如何在 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>

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛标志和 Apache ActiveMQ 项目标志是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 授权。