Windows下RocketMQ双主双从集群搭建全攻略

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 安装与配置步骤

  1. JDK安装

    1. # 验证JDK安装
    2. java -version
    3. # 设置JAVA_HOME环境变量
    4. setx JAVA_HOME "C:\Program Files\Java\jdk1.8.0_301"
  2. Maven配置

    1. <!-- 在Maven的settings.xml中配置阿里云镜像加速 -->
    2. <mirrors>
    3. <mirror>
    4. <id>aliyunmaven</id>
    5. <url>https://maven.aliyun.com/repository/public</url>
    6. </mirror>
    7. </mirrors>
  3. RocketMQ源码编译

    1. git clone https://github.com/apache/rocketmq.git
    2. cd rocketmq
    3. mvn clean install -Dmaven.test.skip=true

二、集群架构设计

2.1 双主双从拓扑结构

  1. +-----------+ +-----------+
  2. | Master1 |------>| Slave1 |
  3. +-----------+ +-----------+
  4. | |
  5. | |
  6. +-----------+ +-----------+
  7. | Master2 |------>| Slave2 |
  8. +-----------+ +-----------+
  • 主从同步机制:采用异步复制模式,Master接收写请求后立即返回,Slave通过拉取方式同步数据
  • 故障切换策略:当Master宕机时,BrokerController自动将Slave升级为Master

2.2 端口规划

节点类型 端口范围 用途
Master1 9876,10911 命名服务、通信服务
Slave1 10912 通信服务
Master2 9877,10921 命名服务、通信服务
Slave2 10922 通信服务

三、节点配置详解

3.1 Master节点配置

  1. 修改broker-a.conf(Master1):

    1. brokerClusterName = DefaultCluster
    2. brokerName = broker-a
    3. brokerId = 0
    4. namesrvAddr = 127.0.0.1:9876;127.0.0.1:9877
    5. listenPort = 10911
    6. storePathRootDir = D:/rocketmq/store/broker-a
    7. storePathCommitLog = D:/rocketmq/store/broker-a/commitlog
    8. autoCreateTopicEnable = true
    9. # 主从同步配置
    10. brokerRole = ASYNC_MASTER
    11. flushDiskType = ASYNC_FLUSH
  2. 修改broker-b.conf(Master2):

    1. brokerName = broker-b
    2. brokerId = 0
    3. listenPort = 10921
    4. storePathRootDir = D:/rocketmq/store/broker-b
    5. # 其他配置同broker-a,注意端口和存储路径区分
    6. brokerRole = ASYNC_MASTER

3.2 Slave节点配置

  1. Slave1配置

    1. brokerName = broker-a
    2. brokerId = 1
    3. listenPort = 10912
    4. # 指定主节点地址
    5. haMasterAddress = 127.0.0.1:10911
  2. Slave2配置

    1. brokerName = broker-b
    2. brokerId = 1
    3. listenPort = 10922
    4. haMasterAddress = 127.0.0.1:10921

四、集群启动与验证

4.1 启动顺序

  1. 启动NameServer集群:

    1. # 在两个命名服务目录下分别执行
    2. nohup mqnamesrv > namesrv.log 2>&1 &
  2. 启动Master节点:

    1. # Master1启动
    2. mqbroker -c D:\rocketmq\conf\broker-a.conf
    3. # Master2启动
    4. mqbroker -c D:\rocketmq\conf\broker-b.conf
  3. 启动Slave节点:

    1. # Slave1启动
    2. mqbroker -c D:\rocketmq\conf\slave-a.conf
    3. # Slave2启动
    4. mqbroker -c D:\rocketmq\conf\slave-b.conf

4.2 集群验证

  1. JMX监控检查

    1. // 使用JConsole连接10911和10921端口验证Broker状态
    2. public class BrokerMonitor {
    3. public static void main(String[] args) throws Exception {
    4. JMXServiceURL url = new JMXServiceURL(
    5. "service:jmx:rmi:///jndi/rmi://127.0.0.1:1099/jmxrmi");
    6. JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
    7. // 获取Broker运行指标...
    8. }
    9. }
  2. 消息收发测试

    1. // 生产者测试
    2. DefaultMQProducer producer = new DefaultMQProducer("test_group");
    3. producer.setNamesrvAddr("127.0.0.1:9876;127.0.0.1:9877");
    4. producer.start();
    5. Message msg = new Message("TestTopic", "Hello RocketMQ".getBytes());
    6. SendResult result = producer.send(msg);
    7. // 消费者测试
    8. DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_group");
    9. consumer.setNamesrvAddr("127.0.0.1:9876;127.0.0.1:9877");
    10. consumer.subscribe("TestTopic", "*");
    11. consumer.registerMessageListener((msgs, context) -> {
    12. msgs.forEach(m -> System.out.println("Received: " + new String(m.getBody())));
    13. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
    14. });
    15. consumer.start();

五、生产环境优化建议

5.1 性能调优参数

参数名 推荐值 说明
sendMessageThreadPoolNums CPU核数*2 发送消息线程池大小
pullMessageThreadPoolNums 16 拉取消息线程池大小
diskMaxUsedSpaceRatio 0.75 磁盘使用率阈值

5.2 监控体系搭建

  1. Prometheus+Grafana方案

    1. # prometheus.yml配置示例
    2. scrape_configs:
    3. - job_name: 'rocketmq'
    4. static_configs:
    5. - targets: ['localhost:10911', 'localhost:10921']
    6. labels:
    7. instance: 'broker-a'
  2. 关键监控指标

    • 消息堆积量(putMessageTotalTimes
    • 主从同步延迟(slaveFallBehindMaster
    • 磁盘IO利用率(diskWriteRate

六、常见问题处理

6.1 主从同步失败排查

  1. 检查网络连通性

    1. telnet 127.0.0.1 10911
  2. 查看Broker日志

    1. # 查找HAConnection相关错误
    2. ERROR HAConnection not established after 3000ms
  3. 调整同步参数

    1. haSendHeartbeatInterval = 5000
    2. haReceiveHeartbeatInterval = 5000

6.2 命名服务注册失败

  1. 检查端口冲突

    1. netstat -ano | findstr 9876
  2. 验证配置文件

    1. # 确保namesrvAddr配置正确
    2. namesrvAddr = 127.0.0.1:9876;127.0.0.1:9877

结论

通过本文的详细指导,开发者可以在Windows环境下成功搭建RocketMQ双主双从集群。该架构不仅提供了数据高可用性保障,还通过主从复制机制实现了故障自动转移。在实际生产环境中,建议结合容器化部署和自动化运维工具进一步提升集群的可靠性和可维护性。对于大规模部署场景,可考虑采用Kubernetes Operator实现集群的声明式管理。