024. ActiveMQ 高可用集群方案

自作多情 提交于 2020-10-02 20:56:39

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 配置属性说明

属性 默认值 描述
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 版本开始)
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!