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

一、环境准备与基础配置

1.1 硬件与软件要求

在Windows环境下部署RocketMQ双主双从集群,建议使用Windows Server 2016/2019或Windows 10专业版系统,需配置至少8GB内存(推荐16GB+)、4核CPU及50GB以上磁盘空间。需提前安装JDK 1.8+、Maven 3.6+及Git客户端,并配置JAVA_HOME、MAVEN_HOME环境变量。

1.2 RocketMQ版本选择

推荐使用Apache RocketMQ 4.9.4或5.0.0版本,这两个版本在Windows下的兼容性较好。通过Git克隆官方仓库:

  1. git clone https://github.com/apache/rocketmq.git
  2. cd rocketmq
  3. git checkout 4.9.4

1.3 依赖服务部署

需部署ZooKeeper 3.6.3作为协调服务,建议使用Windows版ZooKeeper二进制包。配置zoo.cfg文件时,需设置:

  1. tickTime=2000
  2. dataDir=D:\\zookeeper\\data
  3. clientPort=2181
  4. server.1=localhost:2888:3888

二、集群架构设计

2.1 双主双从拓扑结构

设计两个Master节点(Master1、Master2)和两个Slave节点(Slave1、Slave2),采用异步复制模式。物理部署建议:

  • Master1与Slave2同机部署
  • Master2与Slave1同机部署
    实现高可用与资源隔离平衡。

2.2 网络配置要点

需确保各节点间网络互通,防火墙开放9876(Broker)、10911(NameServer)、2181(ZooKeeper)端口。Windows防火墙规则配置示例:

  1. New-NetFirewallRule -DisplayName "RocketMQ Broker" -Direction Inbound -Protocol TCP -LocalPort 9876 -Action Allow

2.3 存储路径规划

建议创建专用目录结构:

  1. D:\rocketmq\
  2. ├── namesrv\
  3. ├── broker-a\ (Master1)
  4. ├── broker-b\ (Master2)
  5. ├── broker-a-s\ (Slave1)
  6. └── broker-b-s\ (Slave2)

三、核心配置文件修改

3.1 NameServer配置

修改conf/namesrv.properties:

  1. listenPort=9876
  2. rocketmqHome=D:\\rocketmq

3.2 Master节点配置

以broker-a(Master1)为例,修改conf/brokers/broker-a.conf:

  1. brokerClusterName = DefaultCluster
  2. brokerName = broker-a
  3. brokerId = 0
  4. namesrvAddr = localhost:9876
  5. listenPort = 10911
  6. storePathRootDir = D:\\rocketmq\\broker-a
  7. storePathCommitLog = D:\\rocketmq\\broker-a\\commitlog
  8. deleteWhen = 04
  9. fileReservedTime = 48
  10. brokerRole = ASYNC_MASTER
  11. flushDiskType = ASYNC_FLUSH

3.3 Slave节点配置

Slave1(对应Master2)配置conf/brokers/broker-b-s.conf:

  1. brokerClusterName = DefaultCluster
  2. brokerName = broker-b
  3. brokerId = 1 # Slave节点ID为1
  4. namesrvAddr = localhost:9876
  5. listenPort = 11011
  6. storePathRootDir = D:\\rocketmq\\broker-b-s
  7. haListenPort = 10921 # 主从同步端口

四、集群启动流程

4.1 启动顺序规范

  1. 启动ZooKeeper服务:

    1. zkServer.cmd start
  2. 启动NameServer集群:

    1. # 主节点
    2. nohup mqnamesrv.cmd > D:\rocketmq\namesrv\namesrv.log 2>&1 &
  3. 按顺序启动Broker节点:
    ```bash

    Master1

    mqbroker.cmd -n localhost:9876 -c D:\rocketmq\conf\brokers\broker-a.conf

Master2

mqbroker.cmd -n localhost:9876 -c D:\rocketmq\conf\brokers\broker-b.conf

Slave1

mqbroker.cmd -n localhost:9876 -c D:\rocketmq\conf\brokers\broker-b-s.conf

Slave2

mqbroker.cmd -n localhost:9876 -c D:\rocketmq\conf\brokers\broker-a-s.conf

  1. ## 4.2 启动日志验证
  2. 检查各节点日志文件,重点关注:
  3. - NameServer日志中的注册信息
  4. - Broker日志中的主从同步状态
  5. - ZooKeeper节点创建情况
  6. # 五、集群验证与测试
  7. ## 5.1 基础功能验证
  8. 使用mqadmin命令检查集群状态:
  9. ```bash
  10. mqadmin clusterList -n localhost:9876
  11. mqadmin brokerStatus -b broker-a -n localhost:9876

5.2 生产消费测试

创建测试Topic:

  1. mqadmin updateTopic -n localhost:9876 -b broker-a -t TestTopic

发送测试消息:

  1. // 生产者示例
  2. DefaultMQProducer producer = new DefaultMQProducer("test_group");
  3. producer.setNamesrvAddr("localhost:9876");
  4. producer.start();
  5. Message msg = new Message("TestTopic", "Hello RocketMQ".getBytes());
  6. SendResult result = producer.send(msg);

5.3 故障转移测试

模拟Master1宕机:

  1. 终止broker-a进程
  2. 验证Slave2是否自动接管
  3. 检查消息生产消费是否持续可用

六、运维管理建议

6.1 监控指标配置

建议监控以下关键指标:

  • Broker磁盘使用率(>85%预警)
  • 主从同步延迟(>5秒预警)
  • 消息堆积量(>10万条预警)

6.2 日常维护操作

  1. 定期清理过期消息:

    1. mqadmin cleanExpiredCQ -n localhost:9876 -b broker-a
  2. 滚动升级流程:

  • 先升级Slave节点
  • 验证同步正常后升级Master节点
  • 每次升级间隔不少于10分钟

6.3 常见问题处理

  1. 端口冲突:使用netstat -ano | findstr 9876检查占用进程
  2. 主从不同步:检查haListenPort配置及网络连通性
  3. 内存溢出:修改runbroker.cmd中的JVM参数:
    1. set "JAVA_OPT=%JAVA_OPT% -Xms4g -Xmx4g -Xmn2g"

七、性能优化建议

7.1 参数调优

  1. 消息存储优化:

    1. mapedFileSizeCommitLog=1073741824 # 1GB
    2. mapedFileSizeConsumeQueue=300000 # 300KB
  2. 网络传输优化:

    1. transferMsgByHeap=true
    2. fastFailIfNoBufferInHeap=true

7.2 硬件配置建议

  • 使用SSD存储commitlog
  • 为每个Broker分配独立磁盘
  • 千兆以上网络环境

7.3 客户端优化

生产者端配置:

  1. producer.setRetryTimesWhenSendFailed(3);
  2. producer.setSendMsgTimeout(3000);

消费者端配置:

  1. consumer.setPullBatchSize(32);
  2. consumer.setConsumeThreadMin(20);
  3. consumer.setConsumeThreadMax(64);

通过以上步骤,可在Windows环境下成功部署RocketMQ双主双从集群。实际生产环境中,建议结合Prometheus+Grafana构建监控体系,并定期进行灾备演练。对于大规模部署,可考虑使用Kubernetes进行容器化改造,提升资源利用率和管理效率。