1. 服务器配置
推荐集群的数量为基数,并且在这些机器上安装JDK,配置环境变量。
2. 集群方式
常用的集群方式有三种:
- 基于共享文件系统的集群(KahaDB,默认);
- 基于JDBC的集群;
- 基于可复制的LevelDB(推荐);
LevelDB 是 Google 开发的一套用于持久化数据的高性能类库。LevelDB 并不是一种服务,用户需要自
行实现 Server。是单进程的服务,能够处理十亿级别规模 Key-Value 型数据,占用内存小。
本次使用该方式配置activemq集群。
3. 目录配置
这次集群配置准备了三台计算机,将activemq安装到它们中,对端口和目录进行配置:
主机 | 集群端口 | 消息端口 | 管控台端口 | activemq节点目录 |
192.168.240.132 | 62621 | 51511 | 8161 | /opt/activemq-node-01 |
192.168.240.133 | 62622 | 51512 | 8162 | /opt/activemq-node-02 |
192.168.240.134 | 62623 | 51513 | 8163 | /opt/activemq-node-03 |
4. 配置防火墙
## 使用firewall命令配置防火墙端口
firewall-cmd --zone=public --add-port=xxxxx/tcp --permanent
firewall-cmd --reload
将三台机器所需的端口都配置到防火墙中。
5. 修改管控台端口
将三台机器的管控台端口修改一遍,文件位于conf/jetty.xml:
<!-- 192.168.240.132 -->
<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="8161"/>
</bean>
<!-- 192.168.240.133 -->
<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="8162"/>
</bean>
<!-- 192.168.240.134 -->
<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>
6. 配置集群
配置三台机器的集群信息,文件位于conf/activemq.xml。
先配置集群的brokerName:
<!-- 三台机器broker节点的brokerName必须相同 -->
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="ems" dataDirectory="${activemq.data}">
在配置集群方式,还在activemq.xml文件中,使用LevelDB:
<!-- 192.168.240.132 -->
<persistenceAdapter>
<!-- kahaDB directory="${activemq.data}/kahadb"/ -->
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:62621"
zkAddress="192.168.240.132:2181,192.168.240.133:2182,192.168.240.134:2183"
hostname="server01"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
<!-- 192.168.240.133 -->
<persistenceAdapter>
<!-- kahaDB directory="${activemq.data}/kahadb"/ -->
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:62622"
zkAddress="192.168.240.132:2181,192.168.240.133:2182,192.168.240.134:2183"
hostname="server02"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
<!-- 192.168.240.134 -->
<persistenceAdapter>
<!-- kahaDB directory="${activemq.data}/kahadb"/ -->
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:62623"
zkAddress="192.168.240.132:2181,192.168.240.133:2182,192.168.240.134:2183"
hostname="server03"
zkPath="/activemq/leveldb-stores"
/>
</persistenceAdapter>
replicatedLevelDB的属性含义如下:
- directory:leveldb目录;
- replicas:节点数量;
- binid:集群端口号;
- zkAddress:zookeeper集群地址;
- hostname:本机的hosts映射名;
- zkPath:集群数据仓库;
接着配置消息端口,还在activemq.xml文件中:
<!-- 192.168.240.132,端口设置撑51511 -->
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:51511?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>
<!-- 192.168.240.133,端口设置撑51512 -->
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:51512?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>
<!-- 192.168.240.134,端口设置撑51513 -->
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:51513?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>
7. 启动节点
按照顺序启动节点,启动后,可以使用ZooInspector查看,ZooInspector需要您的机器安装了JDK并配置了环境变量:
左侧activemq节点下有三个子节点,就是我们配置的三个集群节点了。
8. 使用程序访问集群
## MQ
mq.brokerURL=failover:(tcp://192.168.240.132:51511,tcp://192.168.240.133:51512,tcp://192.168.240.134:51513)?randomize=false
mq.userName=admin
mq.password=admin
mq.pool.maxConnections=10
#queueName
queueName=energyConsumptionData
通过失败转移策略failover,配置三个集群的IP地址。
9. 使用该方法需要注意的事情
请使用者注意。replicatedLevelDB 不支持延迟或者计划任务消息。这些消息存储在另外的 LevelDB 文件中,如果使用延迟或者计划任务消息,将不会复制到 slave Broker 上,不能实现消息的高可用。
这种配置方式也不支持负载均衡。