前言
集群分为两种方式:
1.伪集群:集群节点都搭在一台机器上
2.真集群:集群节点分布在多台机器上
更多详细:真集群与伪集群的区别
该教程使用的是伪集群,由于在一个主机上实现ActiveMQ集群,这里直接使用了Shared File System Master Slave模式
(共享文件系统)。没有结合ZooKeeper。
该教程是使用3个ActiveMQ服务实现集群。理论知识请参考我前一篇文章:ActiveMQ集群整体认识第三部分Master Slave和Broker Cluster结合使用
一、配置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&wireFormat.maxFrameSize=104857600"/> <!-- <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&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&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&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";
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。