024. ActiveMQ 高可用集群方案

1. ActiveMQ 高可用集群方案介绍


2. Master-Slave 部署方式


1. Shared filesystem Master-Slave 部署方式

2. Shared database Master-Slave 部署方式

  1. 因 ActiveMQ 默认不支持数据库存储,需要手动添加数据库驱动。在 ${ACTIVEMQ_HOME}/lib/extra/ 下放入 mysql-connector-java-xxx.jar 驱动。

  2. <broker> 节点,设置 persistent="true",开启持久化。

    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" persistent="true" dataDirectory="${activemq.data}">
    
  3. 设置数据库适配,指定 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>
    
  4. 想要多台,直接复制 activemq 目录到其他服务器即可。

  5. 代码连接 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。
  1. 在所有节点中添加 networkConnector 节点,uri 地址为集群内其他节点的信息。

    <networkConnectors>
        <networkConnector uri="static:(tcp://other-broker:port)" duplex="false"/>
    </networkConnectors>
    
  2. 所有的 broker 都启动后,在 web 管理界面的 Network 页面可以看到连接信息。

Dynamic Broker-Cluster 部署配置
  • ${ACTIVEMQ_HOME}/conf/activemq.xml 中静态指定 Broker 需要桥连接的其他 Broker。由 activemq 启动后动态查找。(基于 multicast 技术,确保网络畅通)
  1. 首先在 Broker 节点中添加 networkConnector 节点。

    <networkConnectors>
        <networkConnector uri="multicast://default"/>
    </networkConnectors>
    
  2. 修改 transportConnector,增加 discoveryUri 属性,并添加 publishedAddressPolicy。

    <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;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 配置属性说明
属性默认值描述
namebridge名称
dynamicOnlyfalse如果为 true,持久订阅被激活时才创建对应的持久订阅。
decreaseNetworkConsumerPriorityfalse如果为 true,网络的消费者优先级降低为 -5。<br/>如果为 false,则默认跟本地消费者一样为 0。
networkTTL1消费和订阅在网络上通过的 broker 数量。
conduitSubscriptiontrue多个网络消费者是否被当做一个消费者来对待。
excludedDestinationsempty不通过网络转发的 destination。
dynamicallyIncludedDestinationsempty通过网络转发的 destination,注意空列表代表所有的都转发。
staticallyIncludedDestinationsempty匹配的都将通过网络转发-即使没有对应的消费者。
duplexfalse如果为 true,则既可以消费有课生产消息到网络的 broker。
prefetchSize1000设置网络消费者的 prefetch size 参数。<br/>必须大于 0,因为网络消费者不能自己轮询消息。
suppressDuplicateQueueSubscriptionsfalse如果为 true,重复的订阅关系一产生即被阻止。(注意:从 5.3 版本开始)
bridgeTempDestinationstrue是否广播 advisoty messages 来创建临时的 destination。
alwaysSyncSendfalse如果为 true,非持久化消息也将使用 request/reply 方式替代 oneway 方式发送到远程 broker。(注意:从 5.6 版本开始)
staticBridgefalse如果为 true,只有 staticallyIncludedDestinations 中配置的 destination 可以被处理。(注意:从 5.6 版本开始)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值