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
驱动。 节点,设置
persistent="true"
,开启持久化。<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" persistent="true" dataDirectory="${activemq.data}">
设置数据库适配,指定 mysql 数据源。 ```xml
4. 想要多台,直接复制 activemq 目录到其他服务器即可。
4. 代码连接 mq 地址配置。
```java
// 非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。 如果为 false,则默认跟本地消费者一样为 0。 |
networkTTL | 1 | 消费和订阅在网络上通过的 broker 数量。 |
conduitSubscription | true | 多个网络消费者是否被当做一个消费者来对待。 |
excludedDestinations | empty | 不通过网络转发的 destination。 |
dynamicallyIncludedDestinations | empty | 通过网络转发的 destination,注意空列表代表所有的都转发。 |
staticallyIncludedDestinations | empty | 匹配的都将通过网络转发-即使没有对应的消费者。 |
duplex | false | 如果为 true,则既可以消费有课生产消息到网络的 broker。 |
prefetchSize | 1000 | 设置网络消费者的 prefetch size 参数。 必须大于 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 版本开始) |