ActiveMQ⾼可⽤集⽅案
在⾼并发、对稳定性要求极⾼的系统中,⾼可⽤的是必不可少的,当然ActiveMQ也有⾃⼰的集⽅案。从ActiveMQ 5.9开
始,ActiveMQ的集实现⽅式取消了传统的Master-Slave⽅式,增加了基于ZooKeeper + LevelDB 的 Master-Slave 实现⽅式。
相关⽂章:
范例项⽬:
ActiveMQ的简单实⽤:
⼀. ActiveMQ的⾼可⽤原理
使⽤ZooKeeper(集)注册所有的ActiveMQ Broker。只有其中的⼀个Broker可以提供服务,被视为 Master,其他的 Broker 处于待机状态,被视为Slave。如果Master因故障⽽不能提供服务,Zookeeper会从Slave中选举出⼀个Broker充当Master。
Slave连接Master并同步他们的存储状态,Slave不接受客户端连接。所有的存储操作都将被复制到连接⾄ Master的Slaves。如果Master宕了,得到了最新更新的Slave会成为 Master。故障节点在恢复后会重新加⼊到集中并连接Master进⼊Slave模式。
是不是觉得和Redis Sentinel主从⾼可⽤的⽅式很像,这⾥的zookeeper起到的作⽤和reids⾥的sentinel作⽤差不多。
另外,附上官⽅⽂档的⼀则警告,请使⽤者注意。replicated LevelDB 不⽀持延迟或者计划任务消息。这些消息存储在另外的LevelDB⽂件中,如果使⽤延迟或者计划任务消息,将不会复制到Slave Broker上,不能实现消息的⾼可⽤。activemq集环境搭建
⼆. ActiveMQ的持久化⽅式
ActiveMQ有三种持久化⽅式(在l可配):
(1) 基于共享⽂件系统(KahaDB,默认)
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
(2) 基于JDBC
<persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#MySQL-DS"/>
</persistenceAdapter>
<!--注意:需要添加mysql-connector-java相关的jar包到avtivemq的lib包下-->
<bean id="MySQL-DS" class="org.apachemons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="sql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/beautyssm_mq?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="xxxx"/>
</bean>
(3) 基于可复制的LevelDB(常⽤于集)
<persistenceAdapter>
<replicatedLevelDB
directory="${activemq.data}/leveldb" #数据存储路径
replicas="3" #节点个数
bind="tcp://0.0.0.0:62621" #⽤于各个节点之间的通讯
zkAddress="localhost:2181,localhost:2182,localhost:2183"
hostname="localhost"
zkPath="/activemq/leveldb-stores"/>#在zookeeper中集相关数据存放路径
</persistenceAdapter>
LevelDB是Google开发的⼀套⽤于持久化数据的⾼性能类库。LevelDB并不是⼀种服务,⽤户需要⾃⾏实现Server。是单进程的服务,能够处理⼗亿级别规模Key-Value型数据,占⽤内存⼩。
这⾥我们采⽤第三种⽅式,也是官⽹推荐的⽅式。
三. ⾼可⽤的部署
1、ActiveMQ的⾼可⽤集基于Zookeeper的⾼可⽤集,所以要先部署Zookeeper集
见:
2、在3个ActiveMQ节点中配置l中的监控端⼝
节点1:
<property name="port" value="8161"/>
节点2:
<property name="port" value="8162"/>
节点3:
<property name="port" value="8163"/>
3、在3个ActiveMQ节点中配置l中的持久化适配器
<broker xmlns="/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
<persistenceAdapter>
<replicatedLevelDB
directory="${activemq.data}/leveldb"
replicas="3"
bind="tcp://0.0.0.0:6262?"
zkAddress="localhost:2181,localhost:2182,localhost:2183"
hostname="localhost"
zkPath="/activemq/leveldb-stores"/>
</persistenceAdapter>
</broker>
注:每个 ActiveMQ 的 BrokerName 必须相同,否则不能加⼊集。
4、修改各节点的消息端⼝:
节点1:
<transportConnector name="openwire" uri="tcp://0.0.0.0:61611maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
节点2:
<transportConnector name="openwire" uri="tcp://0.0.0.0:61612maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
节点3:
<transportConnector name="openwire" uri="tcp://0.0.0.0:61613maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
5、按顺序启动 3 个 ActiveMQ 节点:
$ /usr/local/activemq/activemq-01/bin/activemq start
$ /usr/local/activemq/activemq-02/bin/activemq start
$ /usr/local/activemq/activemq-03/bin/activemq start
监听⽇志:
$ tail -f /usr/local/activemq/activemq-01/data/activemq.log
$ tail -f /usr/local/activemq/activemq-02/data/activemq.log
$ tail -f /usr/local/activemq/activemq-03/data/activemq.log
四. 集部署
之前已经实现了ActiveMQ的⾼可⽤部署,单仅仅是⾼可⽤集,⽆法达到负载均衡的作⽤,接下来只需简单配置就能完成可以实现负载均衡的集功能:
在集1的l中链接集2(在persistenceAdapter标签前配置):
<networkConnectors>
<networkConnector uri="static:(tcp://192.168.2.100:61611,tcp://192.168.2.101:61612,tcp://192.168.2.102:61613)" duplex="false"/>
</networkConnectors>
在集2的l中链接集1(在persistenceAdapter标签前配置):
<networkConnectors>
<networkConnector uri="static:(tcp://192.168.1.100:61611,tcp://192.168.1.101:61612,tcp://192.168.1.102:61613)" duplex="false"/>
</networkConnectors>
这样就实现了ActiveMQ的集⾼可⽤负载均衡功能。
三. 客户端连接:
ActiveMQ 的客户端只能访问Master的Broker,其他处于Slave的Broker不能访问。所以客户端连接Broker应该使⽤failover协议。
配置⽂件地址应为:
failover:(tcp://192.168.1.100:61611,tcp://192.168.1.100:61612,tcp://192.168.1.100:61613)?randomize=false
或:
failover:(tcp://192.168.2.100:61611,tcp://192.168.2.100:61612,tcp://192.168.2.100:61613)?randomize=false

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。