ActiveMQ集群

一个人想着一个人 提交于 2020-10-30 08:54:46

1 ActiveMQ消息集群

  1.1 集群方式

    客户端集群:让多个消费者消费同一个队列

    Broker Clusters:多个Broker之间同步消息,实现负载均衡,但是没有高可用

    Master Slave:实现高可用,但是没有负载均衡

  1.2 客户端集群配置

    ActiveMQ失效转移(failover):允许当其中一台消息服务器宕机时,客户端在传输层上重新连接到其它消息服务器,语法为:failover:(uri1,...,uriN)?transportOptions                      

    transportOptions参数说明:

      randomize默认为ture,表示在URI列表中使用URI连接时是否采用随机策略

      initialReconnectDelay默认为10,单位毫秒,表示第一次重新连接的等待时间

      maxReconnectDelay默认为3000,单位毫秒,表示最长重新连接的等待时间

  1.3 Broker Cluster集群配置

    NetworkConnector(网络连接器):主要用于配置ActiveMQ服务器与服务器之间的网络通讯方式,用于服务器透传消息;分为动态连接器和静态连接器

    静态连接器如:

      <networkConnectors>

        <networkConnector uri="static:(tcp://127.0.0.1:61617,tcp://127.0.0.1:61618)" />

      </networkConnectors>

    动态连接器如:

      <networkConnectors>

        <networkConnector uri="multicast://default" />

      </networkConnectors>

      <transportConnectors>

        <transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default" />

      </transportConnectors>

2 ActiveMQ消息集群的搭建

  在本地创建一个文件夹,名为activemq,将ActiveMQ的安装包下载到这个文件夹中,我下载的版本是5.14.2,然后将其解压,修改名字为activemq-a,然后再复制两份,分别命名为activemq-b和activemq-c,再次新建一个share文件夹用于消息存储共享文件夹。三台服务器的集群方案如下图所示。NodeA在这里是Broker集群,作为消费者的。因为此时的网络连接是双向连接,如果A节点作为生产者,也是可以被B节点和C节点消费的,但是一旦当A节点上面有消息没有被消费的时候宕机,那么B节点和C节点就不能接收到A节点上面的消息,B节点和C节点作为消费者和生产者都是没有问题的。

  2.1 修改activemq-a中的配置

    $ cd activemq-a/conf

    $ vim activemq.xml   

      <transportConnectors>
        <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <!--<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>-->
      </transportConnectors>
      <networkConnectors>
        <networkConnector name="local_network" uri="static:(tcp://127.0.0.1:61617,tcp://127.0.0.1:61618)" />
      </networkConnectors>

  2.2 修改activemq-b中的配置

    $ cd activemq-b/conf

    $ vim activemq.xml    

      <persistenceAdapter>
        <kahaDB directory="/home/huyj/Downloads/activemq/share"/>
      </persistenceAdapter>

      ...    

      <transportConnectors>
        <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <!--<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>-->
      </transportConnectors>
      <networkConnectors>
        <networkConnector name="network_a" uri="static:(tcp://127.0.0.1:61616)" />
      </networkConnectors>

  2.3 修改activemq-c中的配置

    $ cd activemq-c/conf

    $ vim activemq.xml    

      <persistenceAdapter>
        <kahaDB directory="/home/huyj/Downloads/activemq/share"/>
      </persistenceAdapter>

      ...    

      <transportConnectors>
        <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <!--<transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
        <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>-->
      </transportConnectors>
      <networkConnectors>
        <networkConnector name="network_a" uri="static:(tcp://127.0.0.1:61616)" />
      </networkConnectors>

    最后再修改activemq-a,activemq-b,activemq-c文件中conf下的jetty.xml,端口号分别改为8161,8162,8163

      <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
        <!-- the default port number for the web console -->
        <property name="host" value="0.0.0.0"/>
        <property name="port" value="8163"/>
      </bean>

  2.4 启动集群

    在完成以上配置之后,分别进入每个activemq安装包的目录下键入启动命令即可:

      # ./bin/activemq start

    需要注意的是:在我们通过代码连接集群运行主程序之前,记得一定要开放虚拟机中的61616、61617和61618端口,不然程序会报连接超时错误的。开放端口的命令如下:

      # iptables -I INPUT -p tcp --dport 61616 -j ACCEPT

      # iptables -I INPUT -p tcp --dport 61617 -j ACCEPT

      # iptables -I INPUT -p tcp --dport 61618 -j ACCEPT

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!