ActiveMQ笔记(4):搭建Broker集群(cluster)

上一篇介绍了基于Networks of Borkers的2节点HA方案,这一篇继续来折腾Networks of Brokers,当应用规模日渐增长时,2节点的broker可能仍然抗不住访问压力,这时候就需要多加一些broker,弄一个更大规模的Broker集群,但是怎么合理设置broker之间的网络桥接,却是有讲究的,先来看一种不太好的设计:

 

这个架构看上去没瑕疵,没毛病,3个broker之间两两互通,整体可用性极高,但是从消息的路由角度来看,却不是一个好的设计,当producer向broker1发送一条消息时,Consumer得到消息的路径可能有如下2条:

a) producer -> broker1 -> broker2 

b) producer -> broker1 -> broker3 -> broker2  

当broker更多时,情况会更复杂,比如下面这张图:

消息的路由途径将会更多:

a) producer -> broker1 -> broker4

b) producer -> broker1 -> broker2 -> broker4

c) producer -> broker1 -> broker2 -> broker3 -> broker4

d) producer -> broker1 -> broker3 -> broker4

不难想像,每多经过一个节点,消息处理的延时将会增加一些,如果Broker越多,情况越复杂,最终系统对外表现为消息处理有时很快,有时很慢,整体性能很不稳定,所以实际生产中,不要采用所有Broker之间两两互连的方案。

合理的方案如下:

这张图的灵感,应该来自组建局域网中的星形网络,在中心放置一个Borker充当Hub,与其它所有Broker互连,这样不管Consumer连接到外围的哪个Broker,消息的路由途径都比较稳定(最多经过3个Broker),这种架构性能虽然稳定了,但是中心的Hub就变成单点隐患,如果中间的DockerHub挂了,整个系统也就废了。

改进后的架构如下:

本质上仍然是一个星形网络,只不过将hub弄成二个互备,然后每个hub都与其它外围的broker相连,消费者连接到broker1/broker2/broker3,生产者(Producer)连接到hub1/hub2,消息的最长路径不超过3个broker (注:生产者也可以连接到broker1/2/3,与消费者一样,但是消息经过的最长路径会变成4)

如果以后要扩张,比如增加了Broker4,Broker5...,直接修改hub1/2上的配置,增加与新的broker的连接即可,不影响消息的路由途径长度。

最后,在本机演练一把,给出一些配置示例:

1、端口规划

activemq1: 61616 (broker1)
activemq2: 61626 (broker2)
activemq3: 61636 (broker3)
activemq4: 61646 (broker-hub1)
activemq5: 61656 (broker-hub2)

共5个activemq实例,端口61616、61626、61636为broker1、broker2、broker3,61645、61656为broker-hub1、broker-hub2

2、activemq.xml配置

以boker1为例,配置文件内容如下:

 1 <beans
 2         xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 5   http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
 6
 7   <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 8     <property name="locations">
 9       <value>file:${activemq.conf}/credentials.properties</value>
10     </property>
11   </bean>
12
13   <broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker1">
14     <persistenceAdapter>
15       <kahaDB directory="${activemq.data}/kahadb"/>
16     </persistenceAdapter>
17     <transportConnectors>
18       <transportConnector name="openwire"
19                           uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
20     </transportConnectors>
21   </broker>
22
23   <import resource="jetty.xml"/>
24 </beans>

View Code

broker2及broker3,大家参考该配置修改端口号及brokerName即可。

broker-hub1的配置:

 1 <beans
 2         xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 5   http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
 6
 7   <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 8     <property name="locations">
 9       <value>file:${activemq.conf}/credentials.properties</value>
10     </property>
11   </bean>
12
13   <broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-hub1">
14     <networkConnectors>
15       <networkConnector uri="static:(tcp://127.0.0.1:61656,tcp://127.0.0.1:61616,tcp://127.0.0.1:61626,tcp://127.0.0.1:61636)" duplex="true"/>
16     </networkConnectors>
17     <persistenceAdapter>
18       <kahaDB directory="${activemq.data}/kahadb"/>
19     </persistenceAdapter>
20     <transportConnectors>
21       <transportConnector name="openwire"
22                           uri="tcp://0.0.0.0:61646?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
23     </transportConnectors>
24   </broker>
25
26   <import resource="jetty.xml"/>
27 </beans>

View Code

broker-hub2的配置:

 1 <beans
 2         xmlns="http://www.springframework.org/schema/beans"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 5   http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
 6
 7   <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 8     <property name="locations">
 9       <value>file:${activemq.conf}/credentials.properties</value>
10     </property>
11   </bean>
12
13   <broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-hub2">
14     <networkConnectors>
15       <networkConnector uri="static:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61626,tcp://127.0.0.1:61636)" duplex="true"/>
16     </networkConnectors>
17     <persistenceAdapter>
18       <kahaDB directory="${activemq.data}/kahadb"/>
19     </persistenceAdapter>
20     <transportConnectors>
21       <transportConnector name="openwire"
22                           uri="tcp://0.0.0.0:61656?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
23     </transportConnectors>
24   </broker>
25
26   <import resource="jetty.xml"/>
27 </beans>

View Code

3、java代码中spring配置文件

a) 生产者

 1 <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
 2     <property name="connectionFactory">
 3         <bean class="org.apache.activemq.ActiveMQConnectionFactory">
 4             <!--broker服务的地址-->
 5             <property name="brokerURL" value="failover:(tcp://localhost:61646,tcp://localhost:61656)"/>
 6             <!--默认值为1000,如果不需要这么大,可以调小-->
 7             <property name="maxThreadPoolSize" value="100"/>
 8             <!--<property name="userName" value="system"/>-->
 9             <!--<property name="password" value="manager"/>-->
10         </bean>
11     </property>
12 </bean>

View Code

b) 消费者

 1 <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
 2     <property name="connectionFactory">
 3         <bean class="org.apache.activemq.ActiveMQConnectionFactory">
 4             <!--broker服务的地址-->
 5             <property name="brokerURL" value="failover:(tcp://localhost:61616,tcp://localhost:61626,tcp://localhost:61636)"/>
 6             <!--默认值为1000,如果不需要这么大,可以调小-->
 7             <property name="maxThreadPoolSize" value="100"/>
 8             <!--<property name="userName" value="system"/>-->
 9             <!--<property name="password" value="manager"/>-->
10         </bean>
11     </property>
12 </bean>

View Code

 

参考文章:

http://www.jakubkorab.net/2011/11/understanding-activemq-broker-networks.html

http://activemq.apache.org/networks-of-brokers.html 

时间: 2025-01-18 23:17:58

ActiveMQ笔记(4):搭建Broker集群(cluster)的相关文章

activemq集群-activemq 使用network broker集群后,怎样提高AMQ相互之间的通信速度???

问题描述 activemq 使用network broker集群后,怎样提高AMQ相互之间的通信速度??? activemq使用network broker集群之后,消息的处理速度会被拉下来,每秒只有几百个,反复修改配置文件都没有提高上去,我认为主要修改两个地方一个是networkConnectors,另一个是policyEntry,大家都是怎么配置的,配置分布式之后同步传输速度就慢了,可是我感觉两台服务之间使用的是同步传输的:Network connection between vm://13

activemq使用kahadb持久化搭建分布式集群后发下消息处理速度明显不如单台机器的性能,为什么会下降呢

问题描述 activemq使用kahadb持久化搭建分布式集群后发下消息处理速度明显不如单台机器的性能,为什么会下降呢 最近在linux下测试ActiveMQ5.11 ,使用两台电脑进行分布式布控,测试处理消息性能时,发现对消息的处理速度远不如一台机器工作处理速度,搭建分布式集群后哪里会影响其速度吗? 解决方案 先做性能瓶颈分析,比如网络I/O. CPU, 内存等都有可能是瓶颈.需要先找到瓶颈的地方

activemq 集群-activemq使用kahadb持久化搭建分布式集群后发下消息处理速度明显不如一台机器的性能

问题描述 activemq使用kahadb持久化搭建分布式集群后发下消息处理速度明显不如一台机器的性能 最近在linux下测试ActiveMQ5.11 ,使用两台电脑进行分布式布控,测试处理消息性能时,发现对消息的处理速度远不如一台机器工作处理速度,搭建分布式集群后哪里会影响其速度吗? 解决方案 有谁使用过的?教教怎么配置会提高些消息处理速度 解决方案二: MySQL Master Slave 数据同步,集群mysql master slave projectActiveMq master/sl

Linux下搭建tomcat集群全记录(转)

本文将讲述如何在Linux下搭建tomcat集群,以及搭建过程中可能的遇到的问题和解决方法.为简单起见,本文演示搭建的集群只有两个tomact节点外加一个apache组成,三者将安装在同一机器上:apache: 安装路径:/usr/local/apache2端口:90tomcat1:安装路径:/usr/local/apache-tomcat-6.0.33-1端口:6080tomcat2:安装路径:/usr/local/apache-tomcat-6.0.33-2端口:7080 2.所需要软件列表

使用Windows Azure搭建Hadoop集群

项目中在私有云中使用CDH (Cloudera Distribution Including Apache Hadoop)搭建Hadoop集群进行大数据计算.作为微软的忠实粉丝,将CDH部署到Windows Azure的虚拟机中是我的必然选择.由于CDH中包含多个开源服务,所以虚拟机需要开放的端口众多.Windows Azure中的虚拟机的网络是被安全隔离的,因此在Windows Azure中Virtual machines的服务中创建多个虚拟机安装Hadoop cluster,最佳的方案是为H

树莓派上搭建 Hadoop 集群环境的方法

最近在学习 Hadoop,正好前几天又在玩儿树莓派,查阅了一些文档,感觉在树莓派上搭建 Hadoop 集群是可行的,当然了,别对性能抱太大的希望,主要是感受一下分布式计算的魅力.在这个过程中参考了很多文档,先列在这里,基本上这些文档都非常详细了,大家可以直接参考. How to build 7 node Raspberry Pi Hadoop cluster Hadoop集群安装配置教程 Hadoop2.6.0 Ubuntu/CentOS 实验软硬件清单 以下是我的实验环境所用的硬件和软件版本清

搭建hadoop集群中遇到的各种问题,整理如下:

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;     和同伴一起搭建hadoop集群中遇到的各种问题,整理如下: 前言 在寒假前的一段时间,开始调研Hadoop2.2.0搭建过程,当时苦于没有机器,只是在3台笔记本上,简单跑通一些数据.一转眼一两个月过去了,有些东 西对已经忘了.现在实验室申请下来了,分了10台机器(4G+500G),这足够我们玩的了.开始搭建Hadoop2.2.0分布式集群,也趁着这个机会 把

使用Docker容器搭建Jenkins集群

本文讲的是使用Docker容器搭建Jenkins集群[编者的话]本文使用Jelastic Cloud搭建了Jenkins作业环境,包括手动部署和自动部署两个方式,对Jelastic Cloud感兴趣的用户,可以尝试注册一个免费账户,进行试验. 如果不太了解Jenkins,可以先了解如何"手动设置Jenkins"一节. 如果想自动部署,可以去了解 "自动化"一节. Jenkins,由于其管理大量节点,以及执行器(executor)对大量创建和部署提供响应的能力成为很热

玩转大数据-如何搭建Hbase集群

小编的上一篇文章说了如何搭建hadoop集群,我们的目的还是为了去最终搭建一个成功的Hbase集群,不说太多废话,我们直接上教程. 本文只给出如何搭建Hbase集群的方法.但是Hbase最重要的一个步骤其实是性能调优,Hbase调优之路很漫长,还请各位慢慢研究 重要的事情说三遍: 在此之前确认你的Hadoop集群已经运行起来! 在此之前确认你的Hadoop集群已经运行起来! 在此之前确认你的Hadoop集群已经运行起来! 我们就搭建一套全分布式的Hbase数据库系统(以下步骤和互联网上雷同,但某