activeMq集群实现方式

前提

都是通过  networkConnectors 这个节点来配置的,安装就不说了,请自行百度一下....

配的是虚拟集群,如果有多台机器,其实就不需要修改端口了,可以省去不看

第一种方案

有两台activemq 来集群

一台端口为   8161 ,服务端口为 61616 

一台端口为   8262 ,服务端口为 62626

修改这8161 端口请到  /conf/jetty.xml 中修改,搜索一下8161 改为 8162 就行

修改61616 端口请到 /conf/activemq.xml 中修改,搜索一下61616 改为 61626 

同时记得把下面标红的去掉,如果没有,则忽略即可,因为端口太多了,这个应该是其他方式来连接



然后在任意一台的 /conf/activemq.xml 的 broker 节点中加入一个子节点

<networkConnectors>
<networkConnector uri="static:(tcp://127.0.0.1:61616)" duplex="true"/>

</networkConnectors>

duplex 双工的意思

加完启动即可,是不是很简单呢


第二种方案

是建立在第一种方案上面的,因为activemq集群的消息并不会相互存储



那么问题就很明显了,如果有多台机进行集群,那经过的路径就会越来越复杂,这是肯定的,所以出现了另一种方案

再加一个节点来代理这两台

端口为   8263 ,服务端口为 62636

配置就完全不一样了

原来61和62那两台就不需要加networkConnectors 节点了,把这个节点加在63上,而且也跟原来不一样,需要代理另外两台,如下

<networkConnectors>
<networkConnector uri="static:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61626)" duplex="true"/>

</networkConnectors>

然后另外两台只需要保证broker 节点的 brokerName 不同即可

不过这样配置完又会出现一个问题,就是 63这台又会出现一个单点故障的问题,所以再加一台来解决这个问题

端口为   8264 ,服务端口为 62646

只需要再配置这台的文件为

<networkConnectors>
<networkConnector uri="static:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61626,tcp://127.0.0.1:61636)" duplex="true"/>

</networkConnectors>


加入了對上面那台的集群,这样就可以解决这个问题了,这样改进后集群变为下面这样的



然后在说一下activemq的数据存储方式,默认方式在

/conf/activemq.xml中的

 <persistenceAdapter>
            <kahaDB directory="${activemq.data}/kahadb"/>

        </persistenceAdapter>

默认为这个方式,改为mysql的方式来存取的方式

记得要在 activemq的lib上加入数据库的驱动包!!!!

首先在这个文件中加入一个bean,

<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:3306/test?relaxAutoCommit=true"/>  
        <property name="username" value="root"/>  
        <property name="password" value="11111"/>  
        <property name="maxActive" value="200"/>
        <property name="poolPreparedStatements" value="true"/>  
    </bean>

然后把     <kahaDB directory="${activemq.data}/kahadb"/>  注释掉,换为

<jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" createTablesOnStartup="false" useDatabaseLock="true"/>

 createTablesOnStartup="false" useDatabaseLock="true"/> 这两个属性记得加上,注意第一次

createTablesOnStartup 为true,等数据库生成对应的表后就改为false,不用每次都去创建这个表,不要删除就行了

除非你们数据库经常删表。。。


本文参考的文章有如下几篇

http://www.cnblogs.com/yjmyzz/p/activemq-ha-using-networks-of-brokers.html

https://www.cnblogs.com/leihenqianshang/articles/5623858.html

https://blog.csdn.net/jiangxuchen/article/details/8004612


说一下我自己整合遇到的一个问题,就是可能会出现这么一个情况


假设有2台机器,61和62

当我把数据发送给 61时,此时61突然 挂了,消费者还来不及消费,虽然可以自动切换到62上,

但是在61上面的数据就消费不到了,因为集群并不会把消费做一个广播,62上面并没有这条消息

只有当61重启的时候才会被消费,这个问题我也是找了很久,不知道如何解决,如果大家有解决方案的方法,希望可以共享一下,谢谢!!!


----已解决,配置消息回流即可

在/conf/activemq.xml的  destinationPolicy 下面配置如下信息

<policyEntry queue=">" enableAudit="false">
                     <networkBridgeFilterFactory>
                         <conditionalNetworkBridgeFilterFactory replayWhenNoConsumers="true"/>
                     </networkBridgeFilterFactory>
                 </policyEntry>




参考的文章来自

https://blog.csdn.net/keketrtr/article/details/49795257