简介:本文详细介绍在Windows环境下搭建RocketMQ双主双从集群的完整流程,涵盖环境准备、配置修改、节点启动及验证测试等关键步骤,为开发者提供可落地的技术方案。
RocketMQ双主双从集群采用2主2从的部署模式,每个主节点(Master)对应一个从节点(Slave),形成两组互为主备的Broker对。这种架构通过数据同步机制实现高可用性,当主节点宕机时,从节点可自动接管服务。
# 下载JDK 11(推荐OpenJDK)choco install openjdk11 -y# 配置环境变量setx JAVA_HOME "C:\Program Files\OpenJDK\jdk-11.0.15"setx PATH "%JAVA_HOME%\bin;%PATH%"
choco install maven -ymvn -v # 验证安装
从Apache官网下载4.9.4版本(最新稳定版),解压至C:\rocketmq目录
编辑conf/broker.conf文件,添加以下核心配置:
# 公共配置brokerClusterName = DefaultClusterbrokerName = broker-a # 主从对需保持一致brokerId = 0 # 0表示Master,1表示SlavenamesrvAddr = 127.0.0.1:9876;192.168.1.102:9876listenPort = 10911# 存储配置storePathRootDir = C:/rocketmq/store/broker-astorePathCommitLog = C:/rocketmq/store/broker-a/commitlogmapedFileSizeCommitLog = 1073741824 # 1GmapedFileSizeConsumeQueue = 300000 # 300K# 复制配置haListenPort = 10912haMasterAddress = 192.168.1.102:10912 # 从节点指向主节点
| 节点类型 | 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 |
创建start-all.bat脚本:
@echo offset NAMESRV_ADDR=127.0.0.1:9876:: 启动NameServerstart "NameServer" mqnamesrv.cmd:: 启动Broker集群start "Broker-A-Master" mqbroker.cmd -n %NAMESRV_ADDR% -c conf\broker-a.confstart "Broker-A-Slave" mqbroker.cmd -n %NAMESRV_ADDR% -c conf\broker-a-s.confstart "Broker-B-Master" mqbroker.cmd -n %NAMESRV_ADDR% -c conf\broker-b.confstart "Broker-B-Slave" mqbroker.cmd -n %NAMESRV_ADDR% -c conf\broker-b-s.confecho RocketMQ集群启动完成pause
# 查看NameServer日志tail -f C:\rocketmq\logs\namesrv.log# 检查Broker状态java -jar mqadmin.jar brokerStatus -n 127.0.0.1:9876 -b 192.168.1.101:10911
创建生产者测试代码:
public class ProducerTest {public static void main(String[] args) throws Exception {DefaultMQProducer producer = new DefaultMQProducer("test_group");producer.setNamesrvAddr("127.0.0.1:9876");producer.start();for (int i = 0; i < 10; i++) {Message msg = new Message("TestTopic","TagA",("Hello RocketMQ " + i).getBytes());SendResult result = producer.send(msg);System.out.println("发送结果: " + result);}producer.shutdown();}}
消费者测试代码:
public class ConsumerTest {public static void main(String[] args) throws Exception {DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_group");consumer.setNamesrvAddr("127.0.0.1:9876");consumer.subscribe("TestTopic", "*");consumer.registerMessageListener((msgs, context) -> {msgs.forEach(msg -> {System.out.println("收到消息: " + new String(msg.getBody()));});return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;});consumer.start();System.out.println("消费者已启动");}}
模拟主节点故障:
数据同步检查:
java -jar mqadmin.cmd printMsg -n 127.0.0.1:9876 -t TestTopic
问题1:Broker无法注册到NameServer
namesrvAddr配置是否正确logs/namesrv.log和logs/broker.log问题2:主从同步延迟
syncFlushTimeout参数(默认5s)replicaDelayOffsetThreshold阈值推荐使用Prometheus+Grafana监控:
mq_broker_delay_time)mq_broker_sync_state)mq_disk_usage)
# 增大commitlog文件大小(默认1G)mapedFileSizeCommitLog = 2147483648 # 2G# 调整flush间隔flushDiskType = ASYNC_FLUSH # 生产环境建议SYNC_FLUSHflushInterval = 1000 # ms
producer.setSendMsgTimeout(3000);producer.setCompressMsgBodyOverHowmuch(1024 * 4);
编辑runbroker.cmd和runserver.cmd:
set "JAVA_OPT=%JAVA_OPT% -server -Xms4g -Xmx4g -Xmn2g"set "JAVA_OPT=%JAVA_OPT% -XX:+UseG1GC -XX:G1HeapRegionSize=16m"set "JAVA_OPT=%JAVA_OPT% -XX:+DisableExplicitGC"
Windows环境下部署RocketMQ双主双从集群需要特别注意:
netstat -ano检查)扩展建议:
通过本方案的实施,可构建出满足生产环境要求的RocketMQ集群,实现99.95%以上的可用性保障。实际部署时建议先在测试环境验证所有配置,再逐步迁移至生产环境。