参考ActiveMQ的集群方案对比及部署
本文使用的是activemq的master slave集群,俗称高可用,并没有考虑负载均衡。使用Zookeeper来管理各个broker.
由于zookeeper选举原则是2N+1,所以至少要有3个broker。否则会提示“Not enough cluster members when using LevelDB replication”。这样就没法选择Master。
本文的例子是在Windows64位环境。
下载就不说了,我下载的是zookeeper-3.3.6版本。下载下来后解压缩,然后在conf目录新建zoo.cfg文件,内容如下:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
dataDir=D:/luckystar88/soft/zookeeper-3.3.6/zookeeper-3.3.6/data/1
# the port at which the clients will connect
clientPort=2181
启动zookeeper
执行 zookeeperhome z o o k e e p e r h o m e /bin下的zkServer.cmd即可。
下载不多说,我这里使用的是apache-activemq-5.14.2版本。
解压缩,新建目录activemqtest,复制到该目录,并重命名为brokerA。
同样的,复制brokerA的副本,并重命名,得到brokerB,brokerC。这样就有3个broker。
brokerA的配置
打开brokerA/conf下的activemq.xml文件。
1.找到
2.找到下面的代码,并注释掉。
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
persistenceAdapter>
3.增加下面的代码
<persistenceAdapter>
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:0"
zkAddress="192.168.33.87:2181"
zkPassword=""
hostname="192.168.33.87"
sync="local_disk"
zkPath="/activemq/leveldb-stores/group1"
/>
persistenceAdapter>
zkAddress的IP即为安装和打开zookeeper的电脑的IP,port即为zoo.cfg中配置的clientPort。
4.修改transportConnector的端口为61616.
<transportConnectors>
<transportConnector name="openwire" uri="tcp://192.168.33.87:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
transportConnectors>
5.修改jetty.xml中的端口为8161.
<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"/>
bean>
brokerB的配置
修改同brokerA,但transportConnector的端口改为61617,jetty的端口改为8162.
brokerC的配置
修改同brokerA,但transportConnector的端口改为61618,jetty的端口改为8163.
为了启动方便,我写了一个bat脚本,即activemqtest目录下的startCluster.bat。内容如下:
d:
cd luckystar88/soft/activemqtest
cd brokerA/bin/win64
start activemq.bat
cd ../../../brokerB/bin/win64/
start activemq.bat
cd ../../../brokerC/bin/win64/
start activemq.bat
双击startCluster.bat,即可启动。(前提是zookeeper要先启动)
如上图所示,其中一个broker成为了master,其他2个成为了slave。
配置如下:
<bean id="jmsFactory1_node1" class="org.apache.activemq.pool.PooledConnectionFactory" init-method="start"
destroy-method="stop">
<property name="connectionFactory">
<bean class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="failover:(tcp://192.168.33.87:61616,tcp://192.168.33.87:61617,tcp://192.168.33.87:61618)" >property>
<property name="userName" value="admin">property>
<property name="password" value="admin">property>
<property name="useAsyncSend" value="true">property>
<property name="alwaysSessionAsync" value="false">property>
<property name="optimizeAcknowledge" value="true">property>
<property name="producerWindowSize" value="1024000">property>
bean>
property>
<property name="maxConnections" value="5">property>
<property name="idleTimeout" value="0">property>
<property name="expiryTimeout" value="600000">property>
bean>
消息生产者可以每隔几秒钟发送一条数据到mq,消费者一直监听消息。
在发送几条数据后,关闭master的broker,可以发现还是可以继续发送信息,并不会出错。而且http://localhost:8161,http://localhost:8162,http://localhost:8163同一时间只有一个能打开。
注意事项
3个broker的brokerName,zkPath等必须一致。