2

前言

集群分为两种方式:
1.伪集群:集群节点都搭在一台机器上
2.真集群:集群节点分布在多台机器上
更多详细:真集群与伪集群的区别

该教程使用的是伪集群,由于在一个主机上实现ActiveMQ集群,这里直接使用了Shared File System Master Slave模式(共享文件系统)。没有结合ZooKeeper。

该教程是使用3个ActiveMQ服务实现集群。理论知识请参考我前一篇文章:ActiveMQ集群整体认识第三部分Master Slave和Broker Cluster结合使用

clipboard.png

一、配置3个ActiveMQ服务

--- 服务端口 jetty管理端口 存储位置 网络连接器 用途
Node-A 61616 8161 --- Node-B、Node-C 只能作为消费者
Node-B 61617 8162 /opt/activemq/kahadb Node-A 生产者、消费者
Node-C 61618 8163 /opt/activemq/kahadb Node-A 生产者、消费者

1. 下载ActiveMQ安装包

安装和启动一个ActiveMQ服务可以参考之前的文章:ActiveMQ安装

$ wget https://archive.apache.org/dist/activemq/5.14.4/apache-activemq-5.14.4-bin.tar.gz # 下载
$ tar -zxvf apache-activemq-5.14.4-bin.tar.gz # 解压

2. 使用3个ActiveMQ服务

2.1 复制3个ActiveMQ软件
在 activemq文件夹下复制3个ActiveMQ,分别命名为 activemq-a、activemq-b、acativemq-c,后面称之为A、B、C服务:

$ mkdir activemq
$ cp -rf apache-activemq-5.14.4 activemq/activemq-a # 创建activemq-a服务
$ cp -rf apache-activemq-5.14.4 activemq/activemq-b # 创建activemq-b服务
$ cp -rf apache-activemq-5.14.4 activemq/activemq-c # 创建activemq-c服务

$ mkdir activemq/kahadb # 创建之后给B和C服务共享的数据存储文件夹  

2.2 配置 activemq-a 服务:
分别修改 A、B、C服务下 /conf/activemq.xml 文件配置,配置网络连接器(由于知道具体的三台服务器,所以这里使用静态连接器)

  • 配置activemq-a的activemq.xml文件,添加连接B和C服务的网络连接器:
    <transportConnectors>标签下方添加静态连接器<networkConnections>

    <!-- activemq支持5种协议:openwire、amqp、 stomp、mqtt、ws,这里我们只使用openwire协议,注释其它协议 -->
    <transportConnectors>
        <!-- activemq-a 使用默认端口61616 -->
        <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>
    
    <!-- 添加静态连接器连接 activemq-b 和activemq-c 的服务端口 -->
    <networkConnectors>
        <networkConnector name="local_network" uri="static:(tcp://127.0.0.1:61617,tcp://127.0.0.1:61618)"/>
    </networkConnectors>
    
    关于activemq支持的协议可以参考:activeMQ支持的五种协议
  • 配置jetty管理端口为8161
    修改config/jetty.xml文件,找到 id="jettyPort" 的标签:

    <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
        <property name="host" value="0.0.0.0"/>
        <property name="port" value="8161"/> <!-- 在这里修改端口为8161 -->
    </bean>

2.3 配置 activemq-b 服务

  • 配置连接A服务的网络连接器
    /conf/activemq.xml 文件:

    <transportConnectors>
        <!-- 服务端口设为61617 -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61617?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>
    <!-- 添加静态连接器连接 activemq-a 的服务端口 -->
    <networkConnectors>
        <networkConnector name="network_a" uri="static:(tcp://127.0.0.1:61616)"/>
    </networkConnectors>
  • 配置数据存储位置(B和C服务共享的同一个)
    /conf/activemq.xml 文件:

    <persistenceAdapter>
        <kahaDB directory="/opt/activemq/kahadb"/>
    </persistenceAdapter>
  • 配置jetty管理端口8162
    /conf/jetty.xml 文件

    <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
        <property name="host" value="0.0.0.0"/>
        <property name="port" value="8162"/> <!--  端口设为8162 -->
    </bean>

2.4 配置 activemq-c 服务

  • 配置连接A服务的网络连接器
    /conf/activemq.xml 文件:

    <transportConnectors>
        <!-- 服务端口设为61618 -->
        <transportConnector name="openwire" uri="tcp://0.0.0.0:61618?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
    </transportConnectors>
    <!-- 添加静态连接器连接 activemq-a 的服务端口 -->
    <networkConnectors>
        <networkConnector name="network_a" uri="static:(tcp://127.0.0.1:61616)"/>
    </networkConnectors>
  • 配置数据存储位置(B和C服务共享的同一个)
    /conf/activemq.xml 文件:

    <persistenceAdapter>
        <kahaDB directory="/opt/activemq/kahadb"/>
    </persistenceAdapter>
  • 配置jetty管理端口8163
    /conf/jetty.xml 文件

    <bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
        <property name="host" value="0.0.0.0"/>
        <property name="port" value="8163"/> <!--  端口设为8163 -->
    </bean>

二、依次启动A、B、C三个节点

$ /opt/activemq/activemq-a/bin/activemq start # 启动A服务
$ /opt/activemq/activemq-b/bin/activemq start # 启动B服务
$ /opt/activemq/activemq-c/bin/activemq start # 启动C服务

$ ps -ef|grep activemq # 检查进程是否允许,即activemq是否启动成功

#其中B和C服务只会有一个端口对外提供服务,因为它们是Master Slaver主从配置,只有一个能成为Master,获得共享资源的使用权。
$ netstat -anp|grep 61616 # 查看端口61616
$ netstat -anp|grep 61617 # 查看端口61617
$ netstat -anp|grep 61618 # 查看端口61618


$ /opt/activemq/activemq-b/bin/activemq stop # 停止B节点服务(模拟B服务崩溃宕机).这时C服务就会自动变为Master,开始对外提供服务

三、代码编写

在此以对列模式为例,队列模式实现方式请参考我之前的文章:ActiveMQ的消息模式——队列模式(Queue)
在此基础上,做如下修改:

生产者 AppProducer.java

//使用B节点和C节点来实现高可用性,保证其中一个节点宕机,另一个节点可以马上提供服务。
//这里不能配置A节点,因为A节点只能作为消费者
private static final String url = "failover:(tcp://192.168.31.10:61617,tcp://192.168.31.10:61618)?randomize=true";

消费者 AppConsumer.java

//A、B、C节点都可以作为消费者
private static final String url = "failover:(tcp://192.168.31.10:61616,tcp://192.168.31.10:61617,tcp://192.168.31.10:61618)?randomize=true";

Developer
1.4k 声望123 粉丝

只要还在学习,人生就有无限的希望...