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

Windows下搭建RocketMQ双主双从集群

一、集群架构与核心优势

RocketMQ双主双从集群由2个Master节点和2个Slave节点组成,采用异步复制模式实现高可用。这种架构的核心优势在于:

  1. 故障自动切换:当Master节点宕机时,Slave节点可自动接管服务
  2. 负载均衡:生产者消息可轮询发送至不同Master节点
  3. 数据冗余:每个Master对应一个Slave节点,保障数据安全

在Windows环境下搭建时,需特别注意系统资源限制(如最大文件句柄数、网络端口配置等),建议使用Windows Server 2016及以上版本以获得最佳兼容性。

二、环境准备与软件安装

2.1 系统要求

  • 操作系统:Windows Server 2016/2019(推荐)
  • 内存:每个节点至少4GB(生产环境建议8GB+)
  • 磁盘:SSD存储,每个节点预留50GB+空间
  • 网络:千兆以太网,延迟<1ms

2.2 软件依赖

  1. Java环境
    1. # 安装OpenJDK 11
    2. choco install openjdk11 -y
    3. # 验证安装
    4. java -version
  2. RocketMQ二进制包
    从Apache官网下载最新稳定版(如5.1.0),解压至C:\rocketmq目录

  3. NameServer配置
    修改conf/namesrv.properties

    1. listenPort=9876
    2. rocketmqHome=C:/rocketmq

三、节点配置详解

3.1 Master节点配置

Master1配置(端口9876)

  1. # conf/2m-2s-async/broker-a.properties
  2. brokerClusterName = DefaultCluster
  3. brokerName = broker-a
  4. brokerId = 0 # 0表示Master
  5. namesrvAddr = 127.0.0.1:9876
  6. listenPort = 10911
  7. storePathRootDir = C:/rocketmq/store/broker-a
  8. storePathCommitLog = C:/rocketmq/store/broker-a/commitlog
  9. deleteWhen = 04
  10. fileReservedTime = 48
  11. brokerRole = ASYNC_MASTER # 异步复制模式
  12. flushDiskType = ASYNC_FLUSH

Master2配置(端口9877)

  1. # conf/2m-2s-async/broker-b.properties
  2. brokerName = broker-b
  3. brokerId = 0
  4. namesrvAddr = 127.0.0.1:9876
  5. listenPort = 10912
  6. storePathRootDir = C:/rocketmq/store/broker-b
  7. # 其他参数同broker-a,修改brokerName和端口即可

3.2 Slave节点配置

Slave1配置(对应Master1)

  1. # conf/2m-2s-async/broker-a-s.properties
  2. brokerName = broker-a
  3. brokerId = 1 # 非0表示Slave
  4. # 其他参数与Master1相同,增加:
  5. brokerRole = SLAVE

Slave2配置(对应Master2)

  1. # conf/2m-2s-async/broker-b-s.properties
  2. brokerName = broker-b
  3. brokerId = 1
  4. # 其他参数与Master2相同,增加:
  5. brokerRole = SLAVE

四、集群启动流程

4.1 环境变量设置

创建系统环境变量ROCKETMQ_HOME=C:\rocketmq,并将%ROCKETMQ_HOME%\bin添加至PATH。

4.2 启动NameServer

  1. # 新建CMD窗口执行
  2. mqnamesrv.cmd

验证日志输出:

  1. The Name Server boot success. serializeType=JSON

4.3 启动Broker节点

按顺序启动Master和Slave节点:

  1. # Master1
  2. mqbroker.cmd -n 127.0.0.1:9876 -c conf/2m-2s-async/broker-a.properties
  3. # Master2
  4. mqbroker.cmd -n 127.0.0.1:9876 -c conf/2m-2s-async/broker-b.properties
  5. # Slave1
  6. mqbroker.cmd -n 127.0.0.1:9876 -c conf/2m-2s-async/broker-a-s.properties
  7. # Slave2
  8. mqbroker.cmd -n 127.0.0.1:9876 -c conf/2m-2s-async/broker-b-s.properties

4.4 Windows服务封装(可选)

创建Windows服务脚本install_service.bat

  1. @echo off
  2. set ROCKETMQ_HOME=C:\rocketmq
  3. sc create RocketMQ_Broker_A binPath= "%ROCKETMQ_HOME%\bin\mqbroker.cmd -n 127.0.0.1:9876 -c %ROCKETMQ_HOME%\conf\2m-2s-async\broker-a.properties" start= auto
  4. net start RocketMQ_Broker_A

五、集群验证与测试

5.1 基础验证

使用mqadmin命令检查集群状态:

  1. mqadmin clusterList -n 127.0.0.1:9876

预期输出应显示4个节点,且Slave节点状态为SLAVE

5.2 生产消费测试

Java生产者示例

  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 -> System.out.println(new String(msg.getBody())));
  8. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  9. });
  10. consumer.start();
  11. }
  12. }

5.3 故障模拟测试

  1. 停止Master1节点,验证Slave1是否自动接管
  2. 检查mqadmin topicStatus命令输出,确认消息路由正常

六、运维管理建议

  1. 日志管理

    • 配置logback.xml实现日志滚动
    • 建议使用logrotate工具管理日志文件
  2. 性能监控

    1. mqadmin statsAll -n 127.0.0.1:9876
    2. mqadmin topicStatus -t TestTopic -n 127.0.0.1:9876
  3. 常见问题处理

    • 端口冲突:修改listenPortnamesrvAddr配置
    • 磁盘空间不足:设置fileReservedTime参数定期清理
    • 内存溢出:调整JVM参数-Xms4g -Xmx4g

七、进阶配置选项

7.1 消息过滤配置

在broker配置中添加:

  1. enablePropertyFilter=true
  2. filterServerNums=1

7.2 事务消息支持

修改Master节点配置:

  1. transactionCheckInterval=5

八、总结与最佳实践

  1. 配置文件管理:建议使用Git管理不同环境的配置文件
  2. 自动化部署:可结合Ansible实现多节点批量部署
  3. 备份策略:定期备份commitlogconsumequeue目录
  4. Windows优化
    • 禁用Windows Defender实时扫描
    • 调整系统页文件大小
    • 关闭不必要的服务

通过以上步骤,您可以在Windows环境下成功搭建高可用的RocketMQ双主双从集群。实际生产环境中,建议结合监控系统(如Prometheus+Grafana)实现实时告警,并定期进行故障演练以确保系统稳定性。