Windows下搭建RocketMQ双主双从集群
一、集群架构与核心优势
RocketMQ双主双从集群由2个Master节点和2个Slave节点组成,采用异步复制模式实现高可用。这种架构的核心优势在于:
- 故障自动切换:当Master节点宕机时,Slave节点可自动接管服务
- 负载均衡:生产者消息可轮询发送至不同Master节点
- 数据冗余:每个Master对应一个Slave节点,保障数据安全
在Windows环境下搭建时,需特别注意系统资源限制(如最大文件句柄数、网络端口配置等),建议使用Windows Server 2016及以上版本以获得最佳兼容性。
二、环境准备与软件安装
2.1 系统要求
- 操作系统:Windows Server 2016/2019(推荐)
- 内存:每个节点至少4GB(生产环境建议8GB+)
- 磁盘:SSD存储,每个节点预留50GB+空间
- 网络:千兆以太网,延迟<1ms
2.2 软件依赖
- Java环境:
# 安装OpenJDK 11choco install openjdk11 -y# 验证安装java -version
-
RocketMQ二进制包:
从Apache官网下载最新稳定版(如5.1.0),解压至C:\rocketmq目录 -
NameServer配置:
修改conf/namesrv.properties:listenPort=9876rocketmqHome=C:/rocketmq
三、节点配置详解
3.1 Master节点配置
Master1配置(端口9876):
# conf/2m-2s-async/broker-a.propertiesbrokerClusterName = DefaultClusterbrokerName = broker-abrokerId = 0 # 0表示MasternamesrvAddr = 127.0.0.1:9876listenPort = 10911storePathRootDir = C:/rocketmq/store/broker-astorePathCommitLog = C:/rocketmq/store/broker-a/commitlogdeleteWhen = 04fileReservedTime = 48brokerRole = ASYNC_MASTER # 异步复制模式flushDiskType = ASYNC_FLUSH
Master2配置(端口9877):
# conf/2m-2s-async/broker-b.propertiesbrokerName = broker-bbrokerId = 0namesrvAddr = 127.0.0.1:9876listenPort = 10912storePathRootDir = C:/rocketmq/store/broker-b# 其他参数同broker-a,修改brokerName和端口即可
3.2 Slave节点配置
Slave1配置(对应Master1):
# conf/2m-2s-async/broker-a-s.propertiesbrokerName = broker-abrokerId = 1 # 非0表示Slave# 其他参数与Master1相同,增加:brokerRole = SLAVE
Slave2配置(对应Master2):
# conf/2m-2s-async/broker-b-s.propertiesbrokerName = broker-bbrokerId = 1# 其他参数与Master2相同,增加:brokerRole = SLAVE
四、集群启动流程
4.1 环境变量设置
创建系统环境变量ROCKETMQ_HOME=C:\rocketmq,并将%ROCKETMQ_HOME%\bin添加至PATH。
4.2 启动NameServer
# 新建CMD窗口执行mqnamesrv.cmd
验证日志输出:
The Name Server boot success. serializeType=JSON
4.3 启动Broker节点
按顺序启动Master和Slave节点:
# Master1mqbroker.cmd -n 127.0.0.1:9876 -c conf/2m-2s-async/broker-a.properties# Master2mqbroker.cmd -n 127.0.0.1:9876 -c conf/2m-2s-async/broker-b.properties# Slave1mqbroker.cmd -n 127.0.0.1:9876 -c conf/2m-2s-async/broker-a-s.properties# Slave2mqbroker.cmd -n 127.0.0.1:9876 -c conf/2m-2s-async/broker-b-s.properties
4.4 Windows服务封装(可选)
创建Windows服务脚本install_service.bat:
@echo offset ROCKETMQ_HOME=C:\rocketmqsc 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= autonet start RocketMQ_Broker_A
五、集群验证与测试
5.1 基础验证
使用mqadmin命令检查集群状态:
mqadmin clusterList -n 127.0.0.1:9876
预期输出应显示4个节点,且Slave节点状态为SLAVE。
5.2 生产消费测试
Java生产者示例:
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();}}
5.3 故障模拟测试
- 停止Master1节点,验证Slave1是否自动接管
- 检查
mqadmin topicStatus命令输出,确认消息路由正常
六、运维管理建议
-
日志管理:
- 配置
logback.xml实现日志滚动 - 建议使用
logrotate工具管理日志文件
- 配置
-
性能监控:
mqadmin statsAll -n 127.0.0.1:9876mqadmin topicStatus -t TestTopic -n 127.0.0.1:9876
-
常见问题处理:
- 端口冲突:修改
listenPort和namesrvAddr配置 - 磁盘空间不足:设置
fileReservedTime参数定期清理 - 内存溢出:调整JVM参数
-Xms4g -Xmx4g
- 端口冲突:修改
七、进阶配置选项
7.1 消息过滤配置
在broker配置中添加:
enablePropertyFilter=truefilterServerNums=1
7.2 事务消息支持
修改Master节点配置:
transactionCheckInterval=5
八、总结与最佳实践
- 配置文件管理:建议使用Git管理不同环境的配置文件
- 自动化部署:可结合Ansible实现多节点批量部署
- 备份策略:定期备份
commitlog和consumequeue目录 - Windows优化:
- 禁用Windows Defender实时扫描
- 调整系统页文件大小
- 关闭不必要的服务
通过以上步骤,您可以在Windows环境下成功搭建高可用的RocketMQ双主双从集群。实际生产环境中,建议结合监控系统(如Prometheus+Grafana)实现实时告警,并定期进行故障演练以确保系统稳定性。