一、activemq官网:http://activemq.apache.org/html
二、解压压缩包:mysql
同时只有一个mq对外提供服务,当master挂掉的状况,slave会自动顶上成为mastersql
使用ActiveMq自带默认数据库kahaDB,底层是文件系统,各个slave去竞争获取共享文件的锁(资源必定要共享:如下主从模式同样),谁抢到了就是谁作master,提供服务,其余作备份,当master挂掉,存活的slave再去竞争锁,成为新一代master。数据库
a、新建,修改数据存放位置apache
修改conf/activema.xml服务器
b、将activemq复制两份,启动。网络
后启动mq日志:负载均衡
能够看到后启动mq属于salve。tcp
打开mq控制面板spa
当咱们把第一台mq关闭,第二台获取锁提供服务
刷新页面,服务依然能够继续提供。
该模式与以上模式相同,将kahaDB文件系统换成数据库共享。
修改 activemq.xml,修改模式,添加数据源
将mysql驱动,以及链接池jar包添加到lib目录下
使用zookeeper管理选举一个节点做为master (注:mq5.9之后版本才能使用)
修改activemq.xml
我这里zookeeper采用集群模式,单机模式直接直接填写 127.0.0.1:2181.
Broker-Cluster部署方式中,各个broker经过网络互相链接,并共享queue,提供了2中部署方式:
static Broker-Cluster和Dynamic Broker-Cluster
只要咱们知道了想要使用的broker的地址,就能够使用static配置方式。
Static connector
用来建立网络中多个broker的静态配置。协议使用组合URI,即URI中包含其余URI。格式以下:
static:(uri1,uri2,uri3,...) ?key=value
XML中配置示例:
1. <networkConnectors>
2. <networkConnector name="local network"
3. uri="static://(tcp://remotehost1:61616,tcp://remotehost2:61616)"/>
4. </networkConnectors>
分别在两台服务器上配置activemq-1,activemq-2
activemq-1:activemq.xml
activemq-2:activemq.xml
acvivemq-1: data/activemq.log
acvivemq-2: data/activemq.log
能够看到已经创建网络链接。
Dynamic Discovery集群方式在配置ActiveMQ实例时,不须要知道全部其它实例的URI地址
activemq-1与activemq-2:activemq.xml
官网配置说明:http://activemq.apache.org/networks-of-brokers.html
能够看到Master-Slave的部署方式虽然解决了高可用的问题,但不支持负载均衡,Broker-Cluster解决了负载均衡,但当其中一个Broker忽然宕掉的话,那么存在于该Broker上处于Pending状态的message将会丢失,没法达到高可用的目的。
这里以Broker-A + Broker-B创建cluster,Broker-C做为Broker-B的slave为例:
1)首先在Broker-A节点中添加networkConnector节点:
<networkConnectors>
<networkConnector uri="masterslave:(tcp://0.0.0.0:61617,tcp:// 0.0.0.0:61618)" duplex="false"/>
</networkConnectors>
2)修改Broker-A节点中的服务提供端口为61616:
<transportConnectors>
<transportConnectorname="openwire"uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
3)在Broker-B节点中添加networkConnector节点:
<networkConnectors>
<networkConnector uri="static:(tcp:// 0.0.0.0:61616)"duplex="false"/>
</networkConnectors>
4)修改Broker-B节点中的服务提供端口为61617:
<transportConnectors>
<transportConnectorname="openwire"uri="tcp://0.0.0.0:61617?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
5)修改Broker-B节点中的持久化方式:
<persistenceAdapter>
<kahaDB directory="/localhost/kahadb"/>
</persistenceAdapter>
6)在Broker-C节点中添加networkConnector节点:
<networkConnectors>
<networkConnector uri="static:(tcp:// 0.0.0.0:61616)"duplex="false"/>
</networkConnectors>
7)修改Broker-C节点中的服务提供端口为61618:
<transportConnectors>
<transportConnectorname="openwire"uri="tcp://0.0.0.0:61618?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
8)修改Broker-C节点中的持久化方式:
<persistenceAdapter>
<kahaDB directory="/localhost/kahadb"/>
</persistenceAdapter>
9)分别启动broker-A、broker-B、broker-C,由于是broker-B先启动,因此“/localhost/kahadb”目录被lock住,broker-C将一直处于挂起状态,当人为停掉broker-B以后,broker-C将获取目录“/localhost/kahadb”的控制权,从新与broker-A组成cluster提供服务。