搭建Broker集群(cluster)

本文探讨了如何合理搭建大规模Broker集群,避免消息路由复杂性导致的性能不稳定问题,并提供了一种中心化Hub架构及其配置示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一篇继续来折腾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、端口规划

1
2
3
4
5
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为例,配置文件内容如下:

复制代码

<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>file:${activemq.conf}/credentials.properties</value>
</property>
</bean>

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker1"> 
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
<transportConnectors>
<transportConnector name="openwire"
uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
</broker>

<import resource="jetty.xml"/>
</beans>

复制代码

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

broker-hub1的配置:

复制代码

<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>file:${activemq.conf}/credentials.properties</value>
</property>
</bean>

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-hub1">
<networkConnectors>
<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"/> 
</networkConnectors>
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
<transportConnectors>
<transportConnector name="openwire"
uri="tcp://0.0.0.0:61646?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
</broker>

<import resource="jetty.xml"/>
</beans>

复制代码

broker-hub2的配置:

复制代码

<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>file:${activemq.conf}/credentials.properties</value>
</property>
</bean>

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="broker-hub2">
<networkConnectors> 
<networkConnector uri="static:(tcp://127.0.0.1:61616,tcp://127.0.0.1:61626,tcp://127.0.0.1:61636)" duplex="true"/>
</networkConnectors>
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb"/>
</persistenceAdapter>
<transportConnectors>
<transportConnector name="openwire"
uri="tcp://0.0.0.0:61656?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
</broker>

<import resource="jetty.xml"/>
</beans>

复制代码

3、java代码中spring配置文件

a) 生产者

复制代码

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

复制代码

b) 消费者

复制代码

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

 

参考文章:

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

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

### 在 AMR 系统中使用三台服务器部署 EMQX 5.0 集群的方案 #### 1. 环境准备 在开始部署之前,确保所有三台服务器满足以下条件: - 操作系统:推荐使用 Ubuntu 20.04 LTS 或 CentOS 7/8[^1]。 - 网络连通性:确保三台服务器之间可以通过 IP 地址互相访问,并开放必要的端口(如 4369、1883 和 11883)[^2]。 - 节点名称唯一性:每台服务器需要配置唯一的节点名称。 #### 2. 安装 EMQX 在每台服务器上安装 EMQX 5.0。以下是具体操作步骤: ```bash # 下载并解压 EMQX wget https://www.emqx.io/downloads/broker/v5.0/emqx-5.0.0-linux-amd64.tar.gz tar -xvzf emqx-5.0.0-linux-amd64.tar.gz cd emqx ``` 启动 EMQX 服务: ```bash ./bin/emqx start ``` #### 3. 配置集群 编辑每台服务器上的 `etc/emqx.conf` 文件以配置集群参数。 ##### 节点名称配置 为每个节点设置唯一的名称: ```ini node.name = emqx@<IP地址> ``` 例如: - 节点 1:`node.name = emqx@192.168.1.101` - 节点 2:`node.name = emqx@192.168.1.102` - 节点 3:`node.name = emqx@192.168.1.103` ##### 静态种子节点配置 选择一个节点作为种子节点,并在其他节点中指定该种子节点: ```ini cluster.discovery = static cluster.static.seeds = emqx@192.168.1.101,emqx@192.168.1.102,emqx@192.168.1.103 ``` ##### 数据持久化配置 为了防止 AMR 系统断电或重启导致数据丢失,启用持久化存储功能: ```ini persistence.file.path = /var/lib/emqx/persistence ``` #### 4. 启动集群 在每台服务器上启动 EMQX 服务,并检查集群状态: ```bash ./bin/emqx start ``` 通过以下命令查看集群状态: ```bash ./bin/emqx_ctl cluster status ``` #### 5. 监控与维护 为了确保集群的稳定运行,可以使用以下工具进行监控和维护: - **EMQX Dashboard**:通过 Web 界面查看集群状态和性能指标。 - **Prometheus 和 Grafana**:集成 EMQX 的 Prometheus 插件,实现更全面的监控。 - **日志分析**:定期检查 EMQX 日志文件,及时发现并解决潜在问题。 示例代码:通过 API 查询 EMQX 节点状态 ```python import requests response = requests.get("http://localhost:8081/api/v5/nodes") print(response.json()) ``` #### 注意事项 - 确保所有节点之间的网络连通性良好,避免因网络问题导致集群分裂[^3]。 - 在资源受限的 AMR 系统上,优化 EMQX 的配置以减少资源消耗。例如,禁用不必要的插件或调整日志级别: ```ini log.level = warning plugins.builtins = false ``` - 根据实际需求选择合适的 QoS 等级。对于实时性要求较高的场景,建议使用 QoS 0 模式以加快消息传输速度[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值