1、ActiveMq
1.1、ACtiveMq下载,安装
1、activemq官网:http://activemq.apache.org/
2、解压压缩包:
1.2、Master-Slave模式(主从)
同时只有一个mq对外提供服务,当master挂掉的情况,slave会自动顶上成为master
1)、Shared File System Master Slave
使用ActiveMq自带默认数据库kahaDB,底层是文件系统,各个slave去竞争获取共享文件的锁(资源一定要共享:以下主从模式一样),谁抢到了就是谁做master,提供服务,其他做备份,当master挂掉,存活的slave再去竞争锁,成为新一代master。
a、新建,修改数据存放位置
修改conf/activema.xml
b、将activemq复制两份,启动。
后启动mq日志:
可以看到后启动mq属于salve。
打开mq控制面板
当我们把第一台mq关闭,第二台获取锁提供服务
刷新页面,服务依然可以继续提供。
2)、JDBC Master Slave
该模式与以上模式相同,将kahaDB文件系统换成数据库共享。
修改 activemq.xml,修改模式,添加数据源
将mysql驱动,以及连接池jar包添加到lib目录下
3)、Replicated LevelDB Store
使用zookeeper管理选举一个节点作为master (注:mq5.9以后版本才能使用)
修改activemq.xml
我这里zookeeper采用集群模式,单机模式直接直接填写 127.0.0.1:2181.
1.3、Broker-Cluster(负载均衡)
Broker-Cluster部署方式中,各个broker通过网络互相连接,并共享queue,提供了2中部署方式:
static Broker-Cluster和Dynamic Broker-Cluster
1)、static 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
可以看到已经建立网络连接。
2)、Dynamic Broker-Cluster
Dynamic Discovery集群方式在配置ActiveMQ实例时,不需要知道所有其它实例的URI地址
activemq-1与activemq-2:activemq.xml
官网配置说明:http://activemq.apache.org/networks-of-brokers.html
1.4、Master-Slave与Broker-Cluster相结合的部署方式
可以看到Master-Slave的部署方式虽然解决了高可用的问题,但不支持负载均衡,Broker-Cluster解决了负载均衡,但当其中一个Broker突然宕掉的话,那么存在于该Broker上处于Pending状态的message将会丢失,无法达到高可用的目的。
1)、部署的配置修改
这里以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提供服务。