Windows下RocketMQ双主双从集群搭建指南

作者:公子世无双2025.10.13 21:51浏览量:0

简介:本文详细介绍在Windows环境下搭建RocketMQ双主双从集群的完整流程,涵盖环境准备、配置修改、节点启动及验证测试等关键步骤,为开发者提供可落地的技术方案。

Windows下RocketMQ双主双从集群搭建指南

一、集群架构与核心概念

RocketMQ双主双从集群采用2主2从的部署模式,每个主节点(Master)对应一个从节点(Slave),形成两组互为主备的Broker对。这种架构通过数据同步机制实现高可用性,当主节点宕机时,从节点可自动接管服务。

关键组件说明

  1. NameServer:路由注册中心,负责Broker节点信息管理和消息路由
  2. Broker:消息存储与处理核心,分为Master和Slave两种角色
  3. Producer:消息生产者,通过NameServer获取路由信息
  4. Consumer:消息消费者,支持集群/广播消费模式

二、环境准备与依赖安装

1. 系统要求

  • Windows 10/Server 2016及以上版本
  • 至少8GB内存(生产环境建议16GB+)
  • 20GB以上可用磁盘空间
  • 稳定的网络环境(节点间延迟<10ms)

2. 依赖安装

Java环境配置

  1. # 下载JDK 11(推荐OpenJDK)
  2. choco install openjdk11 -y
  3. # 配置环境变量
  4. setx JAVA_HOME "C:\Program Files\OpenJDK\jdk-11.0.15"
  5. setx PATH "%JAVA_HOME%\bin;%PATH%"

Maven构建工具

  1. choco install maven -y
  2. mvn -v # 验证安装

RocketMQ二进制包

从Apache官网下载4.9.4版本(最新稳定版),解压至C:\rocketmq目录

三、集群配置详解

1. 基础配置修改

编辑conf/broker.conf文件,添加以下核心配置:

  1. # 公共配置
  2. brokerClusterName = DefaultCluster
  3. brokerName = broker-a # 主从对需保持一致
  4. brokerId = 0 # 0表示Master,1表示Slave
  5. namesrvAddr = 127.0.0.1:9876;192.168.1.102:9876
  6. listenPort = 10911
  7. # 存储配置
  8. storePathRootDir = C:/rocketmq/store/broker-a
  9. storePathCommitLog = C:/rocketmq/store/broker-a/commitlog
  10. mapedFileSizeCommitLog = 1073741824 # 1G
  11. mapedFileSizeConsumeQueue = 300000 # 300K
  12. # 复制配置
  13. haListenPort = 10912
  14. haMasterAddress = 192.168.1.102:10912 # 从节点指向主节点

2. 双主双从配置差异

节点类型 brokerName brokerId haMasterAddress 存储路径
Master1 broker-a 0 - C:/store/a
Slave1 broker-a 1 192.168.1.101:10912 C:/store/a-s
Master2 broker-b 0 - C:/store/b
Slave2 broker-b 1 192.168.1.103:10912 C:/store/b-s

3. 启动脚本优化

创建start-all.bat脚本:

  1. @echo off
  2. set NAMESRV_ADDR=127.0.0.1:9876
  3. :: 启动NameServer
  4. start "NameServer" mqnamesrv.cmd
  5. :: 启动Broker集群
  6. start "Broker-A-Master" mqbroker.cmd -n %NAMESRV_ADDR% -c conf\broker-a.conf
  7. start "Broker-A-Slave" mqbroker.cmd -n %NAMESRV_ADDR% -c conf\broker-a-s.conf
  8. start "Broker-B-Master" mqbroker.cmd -n %NAMESRV_ADDR% -c conf\broker-b.conf
  9. start "Broker-B-Slave" mqbroker.cmd -n %NAMESRV_ADDR% -c conf\broker-b-s.conf
  10. echo RocketMQ集群启动完成
  11. pause

四、集群验证与测试

1. 基础服务检查

  1. # 查看NameServer日志
  2. tail -f C:\rocketmq\logs\namesrv.log
  3. # 检查Broker状态
  4. java -jar mqadmin.jar brokerStatus -n 127.0.0.1:9876 -b 192.168.1.101:10911

2. 消息收发测试

创建生产者测试代码:

  1. public class ProducerTest {
  2. public static void main(String[] args) throws Exception {
  3. DefaultMQProducer producer = new DefaultMQProducer("test_group");
  4. producer.setNamesrvAddr("127.0.0.1:9876");
  5. producer.start();
  6. for (int i = 0; i < 10; i++) {
  7. Message msg = new Message("TestTopic",
  8. "TagA",
  9. ("Hello RocketMQ " + i).getBytes());
  10. SendResult result = producer.send(msg);
  11. System.out.println("发送结果: " + result);
  12. }
  13. producer.shutdown();
  14. }
  15. }

消费者测试代码:

  1. public class ConsumerTest {
  2. public static void main(String[] args) throws Exception {
  3. DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_group");
  4. consumer.setNamesrvAddr("127.0.0.1:9876");
  5. consumer.subscribe("TestTopic", "*");
  6. consumer.registerMessageListener((msgs, context) -> {
  7. msgs.forEach(msg -> {
  8. System.out.println("收到消息: " + new String(msg.getBody()));
  9. });
  10. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  11. });
  12. consumer.start();
  13. System.out.println("消费者已启动");
  14. }
  15. }

3. 高可用验证

  1. 模拟主节点故障:

    • 终止Master1的Broker进程
    • 观察Slave1是否自动切换为主节点
    • 检查消息生产是否持续正常
  2. 数据同步检查:

    1. java -jar mqadmin.cmd printMsg -n 127.0.0.1:9876 -t TestTopic

五、运维与故障排查

1. 常见问题处理

问题1:Broker无法注册到NameServer

  • 检查防火墙设置(开放9876、10911、10912端口)
  • 验证namesrvAddr配置是否正确
  • 查看logs/namesrv.loglogs/broker.log

问题2:主从同步延迟

  • 检查网络带宽和延迟
  • 调整syncFlushTimeout参数(默认5s)
  • 增加replicaDelayOffsetThreshold阈值

2. 监控方案

推荐使用Prometheus+Grafana监控:

  1. 启用RocketMQ Exporter
  2. 配置关键指标:
    • 消息堆积量(mq_broker_delay_time
    • 同步状态(mq_broker_sync_state
    • 磁盘使用率(mq_disk_usage

六、性能优化建议

1. 存储配置优化

  1. # 增大commitlog文件大小(默认1G)
  2. mapedFileSizeCommitLog = 2147483648 # 2G
  3. # 调整flush间隔
  4. flushDiskType = ASYNC_FLUSH # 生产环境建议SYNC_FLUSH
  5. flushInterval = 1000 # ms

2. 网络优化

  • 启用TCP_NODELAY选项
  • 调整发送缓冲区大小:
    1. producer.setSendMsgTimeout(3000);
    2. producer.setCompressMsgBodyOverHowmuch(1024 * 4);

3. JVM参数调优

编辑runbroker.cmdrunserver.cmd

  1. set "JAVA_OPT=%JAVA_OPT% -server -Xms4g -Xmx4g -Xmn2g"
  2. set "JAVA_OPT=%JAVA_OPT% -XX:+UseG1GC -XX:G1HeapRegionSize=16m"
  3. set "JAVA_OPT=%JAVA_OPT% -XX:+DisableExplicitGC"

七、总结与扩展

Windows环境下部署RocketMQ双主双从集群需要特别注意:

  1. 文件系统性能(推荐使用SSD)
  2. 端口冲突问题(使用netstat -ano检查)
  3. 跨主机通信的防火墙配置

扩展建议:

  • 结合Docker实现快速部署(需调整存储路径映射)
  • 集成K8s实现动态扩缩容
  • 实施混沌工程验证系统容错能力

通过本方案的实施,可构建出满足生产环境要求的RocketMQ集群,实现99.95%以上的可用性保障。实际部署时建议先在测试环境验证所有配置,再逐步迁移至生产环境。