1. ActiveMQ 高可用集群方案介绍
2. Master-Slave 部署方式
1. Shared filesystem Master-Slave 部署方式
2. Shared database Master-Slave 部署方式
-
因 ActiveMQ 默认不支持数据库存储,需要手动添加数据库驱动。在
${ACTIVEMQ_HOME}/lib/extra/
下放入mysql-connector-java-xxx.jar
驱动。 -
<broker> 节点,设置
persistent="true"
,开启持久化。<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" persistent="true" dataDirectory="${activemq.data}">
-
设置数据库适配,指定 mysql 数据源。
<persistenceAdapter> <!-- <kahaDB directory="${activemq.data}/kahadb"/> --> <!-- 这里是关键 --> <jdbcPersistenceAdapter dataSource="#mysql-ds" useDatabaseLock="false" transactionIsolation="4"/> </persistenceAdapter> <bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test_activemq?relaxAutoCommit=true"/> <property name="username" value="root"/> <property name="password" value="123456"/> <property name="poolPreparedStatements" value="true"/> </bean>
-
想要多台,直接复制 activemq 目录到其他服务器即可。
-
代码连接 mq 地址配置。
// 非failover的公共参数配置通过nested.*,例如 failover:(...)?nested.wireFormat.maxInactivityDuration=1000 // randomize=false 随机选择,默认是顺序 // 指定优先切换 failover:(tcp://host1:61616,tcp://host2:61616,tcp://host3:61616)?priorityBackup=true&priorityURIs=tcp://local1:61616,tcp://local2:61616 // maxReconnectDelay重连的最大间隔时间(毫秒) String brokerUrl = "failover:(tcp://activemq.tony.com:61616,tcp://activemq-slave.tony.com:61616)?initialReconnectDelay=100";
3. Replicated LevelDB Store 方式(弃用)
3. Broker-Cluster 部署方式
-
该方式有一个问题,假如某一个数据库宕机,数据将变得不可用。
-
通过网络连接,将多个 broker 组合,对外构成一个整体,集群间共享队列和主题列表。
Static Broker-Cluster 部署配置
- 在
${ACTIVEMQ_HOME}/conf/activemq.xml
中静态指定 Broker 需要桥连接的其他 Broker。
-
在所有节点中添加
networkConnector
节点,uri 地址为集群内其他节点的信息。<networkConnectors> <networkConnector uri="static:(tcp://other-broker:port)" duplex="false"/> </networkConnectors>
-
所有的 broker 都启动后,在 web 管理界面的 Network 页面可以看到连接信息。
Dynamic Broker-Cluster 部署配置
- 在
${ACTIVEMQ_HOME}/conf/activemq.xml
中静态指定 Broker 需要桥连接的其他 Broker。由 activemq 启动后动态查找。(基于 multicast 技术,确保网络畅通)
-
首先在 Broker 节点中添加 networkConnector 节点。
<networkConnectors> <networkConnector uri="multicast://default"/> </networkConnectors>
-
修改 transportConnector,增加 discoveryUri 属性,并添加 publishedAddressPolicy。
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600" discoveryUri="multicast://default"> <publishedAddressPolicy publishedHostStrategy="IPADDRESS"> </publishedAddressPolicy> </transportConnector>
4. Master-Slave 和 Broker—Cluster 相结合的部署方式
部署配置
- 修改
${ACTIVEMQ_HOME}/conf/activemq.xml
,在 Broker 节点中添加多个 networkConnector,连接到多个 broker 集群。
<networkConnectors>
<networkConnector uri="masterslave:(tcp://other-cluster-1-master:port,tcp://cluster-1-slave:port)" duplex="false"/>
<networkConnector uri="masterslave:(tcp://other-cluster-2-master:port,tcp://cluster-2-slave:port)" duplex="false"/>
......
</networkConnectors>
5. networkConnector 网络连接器配置说明
1. networkConnector 配置属性说明
属性 | 默认值 | 描述 |
---|---|---|
name | bridge | 名称 |
dynamicOnly | false | 如果为 true,持久订阅被激活时才创建对应的持久订阅。 |
decreaseNetworkConsumerPriority | false | 如果为 true,网络的消费者优先级降低为 -5。<br/>如果为 false,则默认跟本地消费者一样为 0。 |
networkTTL | 1 | 消费和订阅在网络上通过的 broker 数量。 |
conduitSubscription | true | 多个网络消费者是否被当做一个消费者来对待。 |
excludedDestinations | empty | 不通过网络转发的 destination。 |
dynamicallyIncludedDestinations | empty | 通过网络转发的 destination,注意空列表代表所有的都转发。 |
staticallyIncludedDestinations | empty | 匹配的都将通过网络转发-即使没有对应的消费者。 |
duplex | false | 如果为 true,则既可以消费有课生产消息到网络的 broker。 |
prefetchSize | 1000 | 设置网络消费者的 prefetch size 参数。<br/>必须大于 0,因为网络消费者不能自己轮询消息。 |
suppressDuplicateQueueSubscriptions | false | 如果为 true,重复的订阅关系一产生即被阻止。(注意:从 5.3 版本开始) |
bridgeTempDestinations | true | 是否广播 advisoty messages 来创建临时的 destination。 |
alwaysSyncSend | false | 如果为 true,非持久化消息也将使用 request/reply 方式替代 oneway 方式发送到远程 broker。(注意:从 5.6 版本开始) |
staticBridge | false | 如果为 true,只有 staticallyIncludedDestinations 中配置的 destination 可以被处理。(注意:从 5.6 版本开始) |
来源:oschina
链接:https://my.oschina.net/shadowolf/blog/4304502