集群搭建
一:静态网络集群
1.简介
当ActiveMQ面对大量消息存储和大量Client交互时,性能消耗将会达到单个broker极限,此时我们需要对ActiveMQ进行水平扩展。ActiveMQ提供了“network”机制,可以把多个broker实例“串联”一起,形成“Forward Bridge”模型(转发桥)。这些Broker通过有向网络(networker Connector)链接在一起,组成broker集群,任何一个Borker都可以与Client数据交互,消息也将在Broker网络中“流动”直到被消费,之所以“流动”,因为“producer”和“consumer”会与不同的broker建立链接,我们认为“转发桥”架构模式是“较大”集群数据的解决方案。
2.拓扑图
3.配置示例
在activemq.xml配置文件中加入
<beans
<networkConnector
s
>
<networkConnect
or ur
i="static:(tcp://172.22.30.17:61616,tcp://172.22.30.18:61616
)" duple
x="tru
e"
/
></networkConnecto
r
s><\beans
参数:
- url 对端mq的连接地址,如果有多台,以","为分隔符
- duplex true为双向订阅,两台mq之间互为消费者和生产者,如果为false,即配置主机为消费者,远端主机为生产者
二:主从集群
1.简介
在master-slave模式中,消息将会在多个broker上备份,即集群中每个broker上消息都一样,在故障转移时不会发生消息丢失的问题(持久化消息)。
2.拓扑图
目前mq支持三种持久化方式,如下:
- kahadb:以本地的数据库形式存储,速度没有AMQ快,扩展性好,目前mq默认的持久化方式。
- AMQ:文件存储方式,写入速度快和容易恢复,默认文件大小为32M,5.3版本以前默认支持。
- JDBC:使用外置数据库的形式存储消息。
特性对比:
- AMQ/kahadb:读写性能一般
- jdbc:受限于数据库性能,也比较一般
- zookeeper:性能比较好
3.配置示例
修改activemq.xml文件,更改kahadb持久化方式为mysql
修改activemq.xml文件,更改kahadb持久化方式为mysql
<persistenceAdapter
>
<jdbcPersistenceAdapt
er dataDirector
y="${activemq.base}/dat
a" dataSourc
e="#mysql-d
s" useDatabaseLoc
k="tru
e"
/>
<!-- <kahaDB directory="${activemq.data}/kahadb"/>
-->
</persistenceAd
apter>
修改activemq,在后添加数据库连接信息
<bean
id=
"mysql-ds"
class=
"org.apache.commons.dbcp.BasicDataSource"
destroy-method=
"close"
>
<propert
y name
="driverClassName
" value
="com.mysql.jdbc.Driver
"/
>
<proper
ty nam
e="ur
l" valu
e="jdbc:mysql://192.168.30.130:3306/activemq?relaxAutoCommit=tru
e"
/>
<prope
rty na
me="userna
me" val
ue="ro
ot
"/>
<prop
erty n
ame="passw
ord" va
lue="p3tem
p_
S"/>
<pro
perty
name="poolPreparedStatem
ents" v
alue="
true"/><
/bean>
4.切换说明
- 当master启动后,会自动在activemq中创建三个表
- ACTIVEMQ_ACKS 为第三张表的外键连接ACTIVEMQ_LOCK master锁定,保证只有一个masterACTIVEMQ_MSGS 存储消息
- 优先读取到db的ACTIVEMQ_LOCK的为master
- 处于slave状态的Broker,服务端口(61616)和manage(6181)端口是没有启动的。
- 处于slave状态的Broker,会定时去读取MySQL,如果发现已经被锁了,则继续等待
- 2018-01-03 11:10:53,698 | INFO | Failed to acquire lock. Sleeping for 1000 milli(s) before trying again... | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | main2018-01-03 11:11:45,715 | INFO | Failed to acquire lock. Sleeping for 1000 milli(s) before trying again... | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | main2018-01-03 11:12:37,735 | INFO | Failed to acquire lock. Sleeping for 1000 milli(s) before trying again... | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | main2018-01-03 11:13:29,751 | INFO | Failed to acquire lock. Sleeping for 1000 milli(s) before trying again... | org.apache.activemq.store.jdbc.DefaultDatabaseLocker | main
三:客户端
1.连接url说明
failover:(tcp://local:61616,tcp://remote:61616)?randomize=false
&
priorityBackup=true
- failover:连接地址池为多个,以","号为分隔符,当其中一个失效后,会自动切换
- randomize:false关闭随机选择
- priorityBackup:当randomize为false时,pri为true时,会默认为第一个为优先
- timeout:超时时间
四:环境介绍
测试环境