转载请注明出处:http://blog.csdn.net/l1028386804/article/details/72615194

一、说明

从 ActiveMQ 5.9 开始, ActiveMQ 的集群实现方式取消了传统的 Master-Slave 方式,增加了基于ZooKeeper + LevelDB 的 Master-Slave 实现方式,其他两种方式目录共享和数据库共享依然存在。
三种集群方式的对比:

1、基于共享文件系统(KahaDB, 默认)

<persistenceAdapter><kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>

2、基于 JDBC

<bean id="mysql-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/amq?relaxAutoCommit=true"/><property name="username" value="root"/><property name="password" value="root"/><property name="maxActive" value="20"/><property name="poolPreparedStatements" value="true"/>
</bean>
<persistenceAdapter><jdbcPersistenceAdapter dataDirectory="${activemq.data}" dataSource="#mysql-ds" createTablesOnStartup="false"/>
</persistenceAdapter>

3、基于可复制的 LevelDB(本博文采用这种集群方式)

LevelDB 是 Google 开发的一套用于持久化数据的高性能类库。 LevelDB 并不是一种服务,用户需要自行实现 Server。 是单进程的服务,能够处理十亿级别规模 Key-Value 型数据,占用内存小。

<persistenceAdapter><replicatedLevelDBdirectory="${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"/>
</persistenceAdapter>

二、原理

官方文档:http://activemq.apache.org/replicated-leveldb-store.html
集群原理图:

高可用的原理:使用 ZooKeeper(集群)注册所有的 ActiveMQ Broker。只有其中的一个 Broker 可以提供服务,被视为 Master,其他的 Broker 处于待机状态,被视为 Slave。如果 Master 因故障而不能提供服务,ZooKeeper 会从 Slave 中选举出一个 Broker 充当 Master。Slave 连接 Master 并同步他们的存储状态, Slave 不接受客户端连接。所有的存储操作都将被复制到连接至 Master 的 Slaves。 如果 Master 宕了,得到了最新更新的 Slave 会成为 Master。 故障节点在恢复后会重新加入到集群中并连接 Master 进入 Slave 模式。所有需要同步的 disk 的消息操作都将等待存储状态被复制到其他法定节点的操作完成才能完成。所以,如果你配置了 replicas=3,那么法定大小是(3/2)+1=2。 Master 将会存储并更新然后等待 (2-1)=1 个Slave 存储和更新完成,才汇报 success。 至于为什么是 2-1,熟悉 Zookeeper 的应该知道,有一个 node要作为观擦者存在。当一个新的 Master 被选中,你需要至少保障一个法定 node 在线以能够找到拥有最新状态的 node。这个 node 可以成为新的 Master。因此,推荐运行至少 3 个 replica nodes,以防止一个 node失败了,服务中断。(原理与 ZooKeeper 集群的高可用实现方式类似)

三、部署规划

1、ActiveMQ 集群部署规划

环境: CentOS 6.5 x64 、 JDK7
版本: ActiveMQ 5.14.4
ZooKeeper 集群环境: 192.168.50.132:2181,192.168.50.133:2182,192.168.50.134:2183
(ZooKeeper 集群部署请参考《Dubbo之——Dubbo 注册中心集群Zookeeper-3.4.9的安装、 配置 》)

主机 集群端口 消息端口 控制台端口 节点安装目录
192.168.50.132 62621 51511 8161 /usr/local/activemq/node-01
192.168.50.133 62622 51512 8162 /usr/local/activemq/node-02
192.168.50.134 62623 51513 8163 /usr/local/activemq/node-03

2、 防火墙打开对应的端口

## mq cluster
## 192.168.50.132
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8361 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53531 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 63631 -j ACCEPT## 192.168.50.133
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8362 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53532 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 63632 -j ACCEPT## 192.168.50.134
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8363 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 53533 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 63633 -j ACCEPT

3、 创建/usr/local/activemq 目录

分别在三台主机中创建/usr/local/activemq 目录

$ mkdir /usr/local/activemq

上传 apache-activemq-5.14.4-bin.tar.gz 到/usr/local/activemq 目录

4、 解压并按节点命名

$ cd /usr/local/activemq
$ tar -xvf apache-activemq-5.14.4-bin.tar.gz
$ mv apache-activemq-5.14.4 node-0X #(X 代表节点号 1、 2、 3, 下同)

5、修改conf/jetty.xml

修改管理控制台端口(默认为 8161) 可在 conf/jetty.xml 中修改, 如下:
Node-01 管控台端口:

<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"><!-- the default port number for the web console --><property name="host" value="0.0.0.0"/><property name="port" value="8161"/>
</bean>

Node-02 管控台端口:

<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"><!-- the default port number for the web console --><property name="host" value="0.0.0.0"/><property name="port" value="8162"/>
</bean>

Node-03 管控台端口:

<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start"><!-- the default port number for the web console --><property name="host" value="0.0.0.0"/><property name="port" value="8163"/>
</bean>

6、 集群配置

在 3 个 ActiveMQ 节点中配置 conf/activemq.xml 中的持久化适配器。修改其中 bind、 zkAddress、hostname 和 zkPath。 注意: 每个 ActiveMQ 的 BrokerName 必须相同,否则不能加入集群。
Node-01 中的持久化配置:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="liuyazhuang" dataDirectory="${activemq.data}"><persistenceAdapter><!-- kahaDB directory="${activemq.data}/kahadb"/ --><replicatedLevelDBdirectory="${activemq.data}/leveldb"replicas="3"bind="tcp://0.0.0.0:62621"zkAddress="192.168.50.132:2181,192.168.50.133:2182,192.168.50.134:2183"hostname="liuyazhuang132"zkPath="/activemq/leveldb-stores"/></persistenceAdapter>
</broker>

Node-02 中的持久化配置:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="liuyazhuang" dataDirectory="${activemq.data}"><persistenceAdapter><!-- kahaDB directory="${activemq.data}/kahadb"/ --><replicatedLevelDBdirectory="${activemq.data}/leveldb"replicas="3"bind="tcp://0.0.0.0:62622"zkAddress="192.168.50.132:2181,192.168.50.133:2182,192.168.50.134:2183"hostname="liuyazhuang133"zkPath="/activemq/leveldb-stores"/></persistenceAdapter>
</broker>

Node-03 中的持久化配置:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="liuyazhuang" dataDirectory="${activemq.data}"><persistenceAdapter><!-- kahaDB directory="${activemq.data}/kahadb"/ --><replicatedLevelDBdirectory="${activemq.data}/leveldb"replicas="3"bind="tcp://0.0.0.0:62623"zkAddress="192.168.50.132:2181,192.168.50.133:2182,192.168.50.134:2183"hostname="liuyazhuang134"zkPath="/activemq/leveldb-stores"/></persistenceAdapter>
</broker>

修改各节点的消息端口(注意,避免端口冲突):
Node-01 中的消息端口配置:

<transportConnectors><!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --><transportConnector name="openwire" uri="tcp://0.0.0.0:51511?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

Node-02 中的消息端口配置:

<transportConnectors><!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --><transportConnector name="openwire" uri="tcp://0.0.0.0:51512?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
/transportConnectors>

Node-03 中的消息端口配置:

<transportConnectors><!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --><transportConnector name="openwire" uri="tcp://0.0.0.0:51513?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/><transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

7、 启动ActiveMQ并监听日志

按顺序启动 3 个 ActiveMQ 节点

$ /usr/local/activemq/node-01/bin/activemq start
$ /usr/local/activemq/node-02/bin/activemq start
$ /usr/local/activemq/node-03/bin/activemq start

监听日志:

$ tail -f /usr/local/activemq/node-01/data/activemq.log
$ tail -f /usr/local/activemq/node-02/data/activemq.log
$ tail -f /usr/local/activemq/node-03/data/activemq.log

8、集群的节点状态分析

集群启动后对 ZooKeeper 数据的抓图,可以看到 ActiveMQ 的有 3 个节点,分别是 00000000000,00000000001, 00000000002。
以下第一张图展现了 00000000000 的值,可以看到 elected 的值是不为空,说明这个节点是 Master,其他两个节点是 Slave。

9、 集群可用性测试

ActiveMQ 的客户端只能访问 Master 的 Broker,其他处于 Slave 的 Broker 不能访问。所以客户端连接 Broker 应该使用 failover 协议。

failover:(tcp://192.168.50.132:51511,tcp://192.168.50.133:51512,tcp://192.168.50.134:51513)?randomize=false

10、 集群高可用测试

当一个 ActiveMQ 节点挂掉,或者一个 ZooKeeper 节点挂掉, ActiveMQ 服务依然正常运转。如果仅剩一个 ActiveMQ 节点,因为不能选举 Master, ActiveMQ 不能正常运转; 同样的,如果 ZooKeeper 仅剩一个节点活动,不管 ActiveMQ 各节点是否存活, ActiveMQ 也不能正常提供服务。(ActiveMQ 集群的高可用,依赖于 ZooKeeper 集群的高可用。)

11、 设置开机启动

# vi /etc/rc.local
/usr/local/activemq/node-01/bin/activemq start
/usr/local/activemq/node-02/bin/activemq start
/usr/local/activemq/node-03/bin/activemq start

12、 配置优化

updateURIsURL,通过 URL(或者本地路径)获取重连的 url,这样做具有良好的扩展性,因为客户端每次连接都是从 URL(或文件)中加载一次,所以可以随时从文件中更新 url 列表,做到动态添加 MQ 的备点。failover:()?randomize=false&updateURIsURL=file:/home/wusc/activemq/urllist.txt
urllist.txt 中的地址通过英文逗号分隔,示例:

tcp://192.168.50.132:51511,tcp://192.168.50.133:51512,tcp://192.168.50.134:51513

13、官方文档的一则警告

附上官方文档的一则警告,请使用者注意。 replicatedLevelDB 不支持延迟或者计划任务消息。这些消息存储在另外的 LevelDB 文件中,如果使用延迟或者计划任务消息,将不会复制到 slave Broker 上,不能实现消息的高可用。

四、高可用+负载均衡实现

Broker-Cluster 可以解实现载均衡,但当其中一个 Broker 突然宕掉的话,那么存在于该 Broker 上处于 Pending 状态的 message 将会丢失,无法达到高可用的目的。Master-Slave 与 Broker-Cluster 相结合的部署

1、集群 1 链接集群 2

<networkConnectors><networkConnector uri="static:(tcp://192.168.1.101:53531,tcp://192.168.1.101:53532,tcp://192.168.1.101:53533)" duplex="false"/>
</networkConnectors>

2、集群 2 链接集群 1

<networkConnectors><networkConnector uri="static:(tcp://192.168.50.132:51511,tcp://192.168.50.133:51512,tcp://192.168.50.134:51513)" duplex="false"/>
</networkConnectors>

注:以上配置需配置到activemq.xml文件中 <persistenceAdapter>... </persistenceAdapter>节点上面,与其为同级节点,具体如下图:

至此,所有配置完毕

五、相关文章

《JMS之——ActiveMQ的安装与配置(单机版) 》

《JMS之——ActiveMQ高可用集群安装、配置(基于ZooKeeper + LevelDB的伪集群)》

JMS之——ActiveMQ 高可用与负载均衡集群安装、配置(ZooKeeper + LevelDB + Static discovery)相关推荐

  1. JMS之——ActiveMQ 高可用与负载均衡集群安装、配置(ZooKeeper + LevelDB + Static discovery)...

    一.说明 从 ActiveMQ 5.9 开始, ActiveMQ 的集群实现方式取消了传统的 Master-Slave 方式,增加了基于ZooKeeper + LevelDB 的 Master-Sla ...

  2. keepalive+nginx实现负载均衡高可用_高可用、负载均衡 集群部署方案:Keepalived + Nginx + Tomcat...

    前言:初期应用较小,一般以单机部署为主,即可满足业务的需求,随着业务的不断扩大,单机部署的模式无法承载这么大的业务量,需要进行服务集群化的部署,本文主要介绍服务器Tomcat多实例部署,搭载Keepa ...

  3. nginx+keepalived 高可用兼负载均衡集群

    Nginx是一个高性能的web服务器,同时也是一个优秀的反向代理服务器,本文利用两台Dell R720 构建一个高可用兼负载均衡的Linux web集群. 原理 通过nginx分别搭建两个web服务器 ...

  4. haproxy + keepalived + mycat 高可用与负载均衡集群配置 centos7

    架构如上,但是其实keepalived.haproxy.Mycat都可以多台(比如keepalived.haproxy.Mycat各3台,3台keepalived抢占vip,然后抢到vip的hapro ...

  5. kamailio,asteisk,realtime 实现负载均衡(集群)完整配置笔记

    环境 负载均衡+数据库服务器 Centos-5.4 + kamailio-3.1.4 + mysql-5.0.77-4.el5_6.6 IP:192.168.1.30 asterisk服务器1 Cen ...

  6. 使用pgpool-ii 搭建postgresql 高可用、负载均衡架构

    pgpool有很多功能,其中最重要的我觉得是如下几个:提供连接池(负载均衡模式),复制模式(能通过pgpool分发sql,因此是基于sql语句的分发复制),主备模式(依赖其他的复制,如snoly和流复 ...

  7. 高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群

    高性能Linux服务器 第11章 构建高可用的LVS负载均衡集群 libnet软件包<-依赖-heartbeat(包含ldirectord插件(需要perl-MailTools的rpm包)) l ...

  8. LVS负载均衡集群介绍(4种工作模式10种调度算法)

    文章目录 集群简介 集群的特点 集群的分类 负载均衡 负载均衡集群技术的实现 负载均衡分类 四层负载均衡(基于IP+端口的负载均衡) 七层的负载均衡(基于虚拟的URL或主机IP的负载均衡) 高可用性集 ...

  9. haproxy实现高可用及负载均衡

    Haproxy简介:          Haproxy是一个使用c语言编写的自由开发源代码软件,它提供高可用性.负载均衡.以及基于http和tcp的应用程序代理.Haproxy特别使用于那些负载特别大 ...

  10. LVS+keepalived 实现高可用与负载均衡实施方案

    LVS+keepalived 实现高可用与负载均衡实施方案 <Alvin-zeng:孤独0-1> 目录 一.安装LVS1 1.1.环境IP描述:1 1.2.所需软件2 1.3.安装步骤主备 ...

最新文章

  1. 【图像】直方图均衡化
  2. 监管大屏系统_餐饮公示大屏广告位招商正式启动!
  3. Apache以及PHP的默认编码问题解决(详解)
  4. 数据结构—— 基于二叉树的算术表达式求值
  5. pt-online-schema-change 修改主键导致数据删除失败的问题调查
  6. php笔试有多少分钟,PHP研发工程师笔试题(半小时)
  7. linux建立数列文本,Linux实验内容.doc
  8. NeatUpload的安装使用,可传大文件,显示进度条
  9. 高端存储“四十不惑”
  10. IntelliJ IDEA的maven如何提高下载速度
  11. AI中的几种搜索算法---A*搜索算法
  12. Oracle Sqlplus显示不足问题
  13. 微信开发者工具 wxmi修改模版颜色_Logo设计模版与设计管理
  14. 喜羊羊与灰太狼——深度优先搜索
  15. 一个方便查找SCI的爬虫软件
  16. 如何用计算机测摄像头信号,如何使用ping命令测试网络摄像头连通性?这篇文章告诉你...
  17. Linux查看pcie槽位
  18. CentOS安装BBR加速
  19. 什么是交换机!什么是路由器!
  20. 印象笔记(Evenote)导出到Onenote的方法2022

热门文章

  1. matlab幻方置乱,幻方置乱,magic scrambling,音标,读音,翻译,英文例句,英语词典
  2. python3+selenium实现126邮箱登陆 _修改个人设置(未封装)
  3. 台式计算机风扇一直响,台式电脑风扇声音大怎么办(笔记本风扇一直嗡嗡响)...
  4. 电脑系统里如何设置dns服务器
  5. 自定义jsx解析工厂函数
  6. Udacity-A/B TEST
  7. # UDIG配图(sld)
  8. 主成分之综合竞争力案例分析
  9. [Kaldi] MFCC特征提取源码详解
  10. 第1章 MVX模式与Vue.js