Windows下搭建RocketMQ双主双从集群全攻略
引言
在分布式系统架构中,消息中间件作为核心组件承担着异步解耦、流量削峰等关键职责。Apache RocketMQ作为一款高性能、高可用的分布式消息系统,其双主双从集群架构通过主从复制机制实现了数据高可用和故障自动切换。本文将详细阐述如何在Windows环境下搭建RocketMQ双主双从集群,为开发者提供可落地的技术方案。
一、环境准备与基础配置
1.1 系统环境要求
- 操作系统:Windows 10/11专业版或服务器版(需支持Hyper-V)
- 硬件配置:建议8核CPU、16GB内存、50GB可用磁盘空间
- 软件依赖:
- JDK 1.8+(推荐OpenJDK或Oracle JDK)
- Maven 3.6+(用于编译RocketMQ源码)
- Git(用于克隆官方仓库)
1.2 安装与配置步骤
-
JDK安装:
# 验证JDK安装java -version# 设置JAVA_HOME环境变量setx JAVA_HOME "C:\Program Files\Java\jdk1.8.0_301"
-
Maven配置:
<!-- 在Maven的settings.xml中配置阿里云镜像加速 --><mirrors><mirror><id>aliyunmaven</id><url>https://maven.aliyun.com/repository/public</url></mirror></mirrors>
-
RocketMQ源码编译:
git clone https://github.com/apache/rocketmq.gitcd rocketmqmvn clean install -Dmaven.test.skip=true
二、集群架构设计
2.1 双主双从拓扑结构
+-----------+ +-----------+| Master1 |------>| Slave1 |+-----------+ +-----------+| || |+-----------+ +-----------+| Master2 |------>| Slave2 |+-----------+ +-----------+
- 主从同步机制:采用异步复制模式,Master接收写请求后立即返回,Slave通过拉取方式同步数据
- 故障切换策略:当Master宕机时,BrokerController自动将Slave升级为Master
2.2 端口规划
| 节点类型 | 端口范围 | 用途 |
|---|---|---|
| Master1 | 9876,10911 | 命名服务、通信服务 |
| Slave1 | 10912 | 通信服务 |
| Master2 | 9877,10921 | 命名服务、通信服务 |
| Slave2 | 10922 | 通信服务 |
三、节点配置详解
3.1 Master节点配置
-
修改broker-a.conf(Master1):
brokerClusterName = DefaultClusterbrokerName = broker-abrokerId = 0namesrvAddr = 127.0.0.1:9876;127.0.0.1:9877listenPort = 10911storePathRootDir = D:/rocketmq/store/broker-astorePathCommitLog = D:/rocketmq/store/broker-a/commitlogautoCreateTopicEnable = true# 主从同步配置brokerRole = ASYNC_MASTERflushDiskType = ASYNC_FLUSH
-
修改broker-b.conf(Master2):
brokerName = broker-bbrokerId = 0listenPort = 10921storePathRootDir = D:/rocketmq/store/broker-b# 其他配置同broker-a,注意端口和存储路径区分brokerRole = ASYNC_MASTER
3.2 Slave节点配置
-
Slave1配置:
brokerName = broker-abrokerId = 1listenPort = 10912# 指定主节点地址haMasterAddress = 127.0.0.1:10911
-
Slave2配置:
brokerName = broker-bbrokerId = 1listenPort = 10922haMasterAddress = 127.0.0.1:10921
四、集群启动与验证
4.1 启动顺序
-
启动NameServer集群:
# 在两个命名服务目录下分别执行nohup mqnamesrv > namesrv.log 2>&1 &
-
启动Master节点:
# Master1启动mqbroker -c D:\rocketmq\conf\broker-a.conf# Master2启动mqbroker -c D:\rocketmq\conf\broker-b.conf
-
启动Slave节点:
# Slave1启动mqbroker -c D:\rocketmq\conf\slave-a.conf# Slave2启动mqbroker -c D:\rocketmq\conf\slave-b.conf
4.2 集群验证
-
JMX监控检查:
// 使用JConsole连接10911和10921端口验证Broker状态public class BrokerMonitor {public static void main(String[] args) throws Exception {JMXServiceURL url = new JMXServiceURL("service
rmi:///jndi/rmi://127.0.0.1:1099/jmxrmi");JMXConnector jmxc = JMXConnectorFactory.connect(url, null);// 获取Broker运行指标...}}
-
消息收发测试:
// 生产者测试DefaultMQProducer producer = new DefaultMQProducer("test_group");producer.setNamesrvAddr("127.0.0.1:9876;127.0.0.1:9877");producer.start();Message msg = new Message("TestTopic", "Hello RocketMQ".getBytes());SendResult result = producer.send(msg);// 消费者测试DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_group");consumer.setNamesrvAddr("127.0.0.1:9876;127.0.0.1:9877");consumer.subscribe("TestTopic", "*");consumer.registerMessageListener((msgs, context) -> {msgs.forEach(m -> System.out.println("Received: " + new String(m.getBody())));return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;});consumer.start();
五、生产环境优化建议
5.1 性能调优参数
| 参数名 | 推荐值 | 说明 |
|---|---|---|
sendMessageThreadPoolNums |
CPU核数*2 | 发送消息线程池大小 |
pullMessageThreadPoolNums |
16 | 拉取消息线程池大小 |
diskMaxUsedSpaceRatio |
0.75 | 磁盘使用率阈值 |
5.2 监控体系搭建
-
Prometheus+Grafana方案:
# prometheus.yml配置示例scrape_configs:- job_name: 'rocketmq'static_configs:- targets: ['localhost:10911', 'localhost:10921']labels:instance: 'broker-a'
-
关键监控指标:
- 消息堆积量(
putMessageTotalTimes) - 主从同步延迟(
slaveFallBehindMaster) - 磁盘IO利用率(
diskWriteRate)
- 消息堆积量(
六、常见问题处理
6.1 主从同步失败排查
-
检查网络连通性:
telnet 127.0.0.1 10911
-
查看Broker日志:
# 查找HAConnection相关错误ERROR HAConnection not established after 3000ms
-
调整同步参数:
haSendHeartbeatInterval = 5000haReceiveHeartbeatInterval = 5000
6.2 命名服务注册失败
-
检查端口冲突:
netstat -ano | findstr 9876
-
验证配置文件:
# 确保namesrvAddr配置正确namesrvAddr = 127.0.0.1:9876;127.0.0.1:9877
结论
通过本文的详细指导,开发者可以在Windows环境下成功搭建RocketMQ双主双从集群。该架构不仅提供了数据高可用性保障,还通过主从复制机制实现了故障自动转移。在实际生产环境中,建议结合容器化部署和自动化运维工具进一步提升集群的可靠性和可维护性。对于大规模部署场景,可考虑采用Kubernetes Operator实现集群的声明式管理。