D 的个人博客

开源程序员,自由职业者

小而美的 Java 博客系统 Solo
Golang 在线 IDE Wide
黑客与画家的社区 Sym
  menu
401 文章
1,868 评论
3399509 浏览
7 当前访客
ღゝ◡╹)ノ❤️

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">

&lt;destinationPolicy&gt;
  &lt;policyMap&gt;&lt;policyEntries&gt;
    
      &lt;policyEntry topic="FOO.&gt;"&gt;
        &lt;dispatchPolicy&gt;
          &lt;strictOrderDispatchPolicy /&gt;
        &lt;/dispatchPolicy&gt;
        &lt;subscriptionRecoveryPolicy&gt;
          &lt;lastImageSubscriptionRecoveryPolicy /&gt;
        &lt;/subscriptionRecoveryPolicy&gt;
      &lt;/policyEntry&gt;

  &lt;/policyEntries&gt;&lt;/policyMap&gt;
&lt;/destinationPolicy&gt;


&lt;persistenceAdapter&gt;
    &lt;jdbcPersistenceAdapter dataDirectory="${activemq.base}/activemq-data"/&gt;

    &lt;!-- 
    &lt;jdbcPersistenceAdapter dataDirectory="activemq-data" dataSource="#oracle-ds"/&gt;
    --&gt; 
&lt;/persistenceAdapter&gt;

&lt;transportConnectors&gt;
   &lt;transportConnector name="default" uri="tcp://localhost:61616"/&gt;
&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

评论
  • RabbitMQ

    关注这方面技术的码农可以加 珠三角码农交流群 13139268

    Reply
  • eddy

    @88250 那这一层应该是 向队列中添加需要执行的sql或者实体对象,数据库作为消息处理服务去执行ddl

    该评论同步自 B3log 社区

    Reply
  • @eddy 不用自己执行 SQL 的,这个是透明的,ActiveMQ 会自己管理。

    该评论同步自 B3log 社区

    Reply
  • eddy

    这个有样例么, 我想了解下当我做了如下配制时,消息通道是否对代码调用数据库处理层透明,如果透明, 我只是调用dataSource来获取连接然后执行sql 么

    该评论同步自 B3log 社区

    Reply