RocketMQ 4.9.8 集群安装教程:两主两从同步复制异步刷盘(CentOS 7.9)

发布时间:2026/7/27 12:59:38
RocketMQ 4.9.8 集群安装教程:两主两从同步复制异步刷盘(CentOS 7.9) 目录1. 集群规划与环境准备1.1 机器规划1.2 环境准备所有节点2. 配置 NameServer2.3 NameServer 集群规模选择建议3. 配置与启动 Broker 集群3.1 配置 Master 1 (192.168.1.101, broker-a)3.2 配置 Slave 1 (192.168.1.102, broker-a-s)3.3 配置 Master 2 (192.168.1.103, broker-b)3.4 配置 Slave 2 (192.168.1.104, broker-b-s)3.5 启动所有 Broker4. 集群验证与管理4.1 查看集群状态4.2 生产与消费测试4.3 控制台部署可选5. 关键配置解析与调优建议6. 常见问题排查1. 集群规划与环境准备本教程将指导您在 CentOS 7.92009 版本操作系统上部署一个高可用的 RocketMQ 4.9.8 集群。我们采用经典的“两主两从”架构并配置为同步复制SYNC_MASTER和异步刷盘ASYNC_FLUSH以在保证数据可靠性的同时兼顾写入性能。1.1 机器规划假设我们拥有四台服务器其角色与网络规划如下主机名/IP角色Broker Name监听端口192.168.1.101NameSrv1Master 1broker-a10911 (Broker), 10909 (HA)192.168.1.102NameSrv2Slave 1 (Master 1 的从节点)broker-a-s11911 (Broker), 11909 (HA)192.168.1.103NameSrv3Master 2broker-b10911 (Broker), 10909 (HA)192.168.1.104Slave 2 (Master 2 的从节点)broker-b-s11911 (Broker), 11909 (HA)架构说明两主两从两个主 Brokerbroker-a, broker-b分别处理不同 Topic 的读写请求互为备份。每个主节点都有一个对应的从节点broker-a-s, broker-b-s在主节点故障时提供高可用。同步复制 (SYNC_MASTER)消息在主节点写入成功后必须同步复制到从节点从节点确认后才会向生产者返回成功。这保证了数据在主从间的一致性是数据高可靠的关键。异步刷盘 (ASYNC_FLUSH)消息写入内存后即返回成功由后台线程异步将内存数据持久化到磁盘。这牺牲了极小概率的极端故障数据丢失风险换取了更高的写入吞吐量。1.2 环境准备所有节点在四台服务器上均执行以下操作系统更新与基础工具# 更新系统 sudo yum update -y # 安装必要工具 sudo yum install -y wget vim net-tools lsof java-1.8.0-openjdk-devel配置 Java 环境# 检查 Java 版本 java -version # 应显示 openjdk version 1.8.0_xxx # 设置 JAVA_HOME (根据实际路径调整) echo export JAVA_HOME/usr/lib/jvm/java-1.8.0-openjdk ~/.bashrc echo export PATH\$JAVA_HOME/bin:\$PATH ~/.bashrc source ~/.bashrc下载 RocketMQ# 创建安装目录 sudo mkdir -p /opt/rocketmq cd /opt/rocketmq # 下载 RocketMQ 4.9.8 二进制包 sudo wget https://archive.apache.org/dist/rocketmq/4.9.8/rocketmq-all-4.9.8-bin-release.zip # 解压 sudo unzip rocketmq-all-4.9.8-bin-release.zip sudo mv rocketmq-all-4.9.8-bin-release rocketmq-4.9.8 # 创建日志和数据存储目录 sudo mkdir -p /opt/rocketmq/logs /opt/rocketmq/store配置系统参数编辑/etc/security/limits.conf在文件末尾添加* soft nofile 655350 * hard nofile 655350 * soft nproc 4096 * hard nproc 4096编辑/etc/sysctl.conf添加或修改以下参数vm.max_map_count262144 vm.swappiness10 fs.file-max655350使配置生效sudo sysctl -p2. 配置 NameServerNameServer 是 RocketMQ 的服务发现组件所有 Broker 和客户端都需要连接它。我们可以在四台机器中的任意三台例如 101 102 103上启动 NameServer以实现高可用。启动 NameServer在 101 102 103 上执行cd /opt/rocketmq/rocketmq-4.9.8/bin # 后台启动 NameServer nohup sh mqnamesrv # 检查日志确认启动成功 tail -f ~/logs/rocketmqlogs/namesrv.log # 看到 “The Name Server boot success.” 即表示成功验证 NameServer 运行# 查看进程 jps | grep NamesrvStartup # 应显示进程 ID # 查看监听端口 (9876) netstat -tlnp | grep 98762.3 NameServer 集群规模选择建议在规划 RocketMQ 集群时NameServer 的部署数量是一个常见问题。本文示例部署了两台 NameServer但实际生产环境中部署 3 台或更多奇数台 NameServer 通常是更优的选择原因如下高可用与容错NameServer 采用去中心化设计各节点之间无数据同步仅存储路由信息Broker 心跳上报。客户端和 Broker 会连接所有配置的 NameServer。部署 3 台可以在其中 1 台故障时集群仍能正常提供服务剩余 2 台而 2 台部署在 1 台故障后只剩单点虽然仍能工作但容错能力较弱。避免“脑裂”感知虽然 NameServer 本身无状态但某些客户端 SDK 或管理工具在部分 NameServer 不可达时可能产生警告日志。3 台部署能提供更稳定的连接体验。资源占用极低NameServer 进程非常轻量通常占用内存 100MB增加一台的成本很低但带来的可用性提升显著。部署建议测试/开发环境1 台即可单点风险可接受。中小型生产环境至少 2 台推荐3 台。本文的 2 台部署是经典最小高可用配置3 台是更稳健的选择。大型/金融级生产环境3 台或更多如 3-5 台跨机架或跨可用区部署进一步提升容灾能力。配置方式无论部署几台只需在 Broker 和客户端的namesrvAddr配置中列出所有 NameServer 地址用分号分隔例如# Broker 配置示例3台NameServer namesrvAddr192.168.1.101:9876;192.168.1.103:9876;192.168.1.105:98763. 配置与启动 Broker 集群这是核心步骤需要为每个 Broker 节点创建独立的配置文件。3.1 配置 Master 1 (192.168.1.101, broker-a)进入配置目录并创建配置文件cd /opt/rocketmq/rocketmq-4.9.8/conf/2m-2s-sync # 复制主节点模板 sudo cp broker-a.properties broker-a.properties.backup # 编辑配置文件 sudo vim broker-a.properties修改broker-a.properties关键内容如下# Broker 集群名称同一集群内所有节点必须一致 brokerClusterNameDefaultCluster # Broker 名称主从配对使用相同的 brokerName brokerNamebroker-a # 0 表示 Master大于 0 表示 Slave brokerId0 # 删除文件时间点默认凌晨 4 点 deleteWhen04 # 文件保留时间默认 48 小时 fileReservedTime48 # Broker 角色SYNC_MASTER 表示同步复制主节点 brokerRoleSYNC_MASTER # 刷盘方式ASYNC_FLUSH 表示异步刷盘 flushDiskTypeASYNC_FLUSH # NameServer 地址列表用分号分隔 namesrvAddr192.168.1.101:9876;192.168.1.103:9876 # Broker 监听端口 listenPort10911 # HA 监听端口主从同步 haListenPort10909 # 存储路径 storePathRootDir/opt/rocketmq/store storePathCommitLog/opt/rocketmq/store/commitlog storePathConsumeQueue/opt/rocketmq/store/consumequeue storePathIndex/opt/rocketmq/store/index storeCheckpoint/opt/rocketmq/store/checkpoint abortFile/opt/rocketmq/store/abort # 自动创建 Topic生产环境建议关闭 autoCreateTopicEnabletrue3.2 配置 Slave 1 (192.168.1.102, broker-a-s)在 102 节点上编辑配置文件broker-a-s.propertiesbrokerClusterNameDefaultCluster brokerNamebroker-a # Slave 节点的 brokerId 必须大于 0 brokerId1 brokerRoleSLAVE flushDiskTypeASYNC_FLUSH namesrvAddr192.168.1.101:9876;192.168.1.103:9876 # 从节点使用不同的端口避免冲突 listenPort11911 haListenPort11909 storePathRootDir/opt/rocketmq/store storePathCommitLog/opt/rocketmq/store/commitlog storePathConsumeQueue/opt/rocketmq/store/consumequeue storePathIndex/opt/rocketmq/store/index storeCheckpoint/opt/rocketmq/store/checkpoint abortFile/opt/rocketmq/store/abort autoCreateTopicEnabletrue3.3 配置 Master 2 (192.168.1.103, broker-b)在 103 节点上编辑配置文件broker-b.propertiesbrokerClusterNameDefaultCluster brokerNamebroker-b brokerId0 brokerRoleSYNC_MASTER flushDiskTypeASYNC_FLUSH namesrvAddr192.168.1.101:9876;192.168.1.103:9876 listenPort10911 haListenPort10909 storePathRootDir/opt/rocketmq/store storePathCommitLog/opt/rocketmq/store/commitlog storePathConsumeQueue/opt/rocketmq/store/consumequeue storePathIndex/opt/rocketmq/store/index storeCheckpoint/opt/rocketmq/store/checkpoint abortFile/opt/rocketmq/store/abort autoCreateTopicEnabletrue3.4 配置 Slave 2 (192.168.1.104, broker-b-s)在 104 节点上编辑配置文件broker-b-s.propertiesbrokerClusterNameDefaultCluster brokerNamebroker-b brokerId1 brokerRoleSLAVE flushDiskTypeASYNC_FLUSH namesrvAddr192.168.1.101:9876;192.168.1.103:9876 listenPort11911 haListenPort11909 storePathRootDir/opt/rocketmq/store storePathCommitLog/opt/rocketmq/store/commitlog storePathConsumeQueue/opt/rocketmq/store/consumequeue storePathIndex/opt/rocketmq/store/index storeCheckpoint/opt/rocketmq/store/checkpoint abortFile/opt/rocketmq/store/abort autoCreateTopicEnabletrue3.5 启动所有 Broker分别在四台机器上启动对应的 Broker 服务# 在 101 (Master 1) 上执行 cd /opt/rocketmq/rocketmq-4.9.8/bin nohup sh mqbroker -c /opt/rocketmq/rocketmq-4.9.8/conf/2m-2s-sync/broker-a.properties 在 102 (Slave 1) 上执行 cd /opt/rocketmq/rocketmq-4.9.8/bin nohup sh mqbroker -c /opt/rocketmq/rocketmq-4.9.8/conf/2m-2s-sync/broker-a-s.properties 在 103 (Master 2) 上执行 cd /opt/rocketmq/rocketmq-4.9.8/bin nohup sh mqbroker -c /opt/rocketmq/rocketmq-4.9.8/conf/2m-2s-sync/broker-b.properties 在 104 (Slave 2) 上执行 cd /opt/rocketmq/rocketmq-4.9.8/bin nohup sh mqbroker -c /opt/rocketmq/rocketmq-4.9.8/conf/2m-2s-sync/broker-b-s.properties 启动后查看日志确认tail -f ~/logs/rocketmqlogs/broker.log # 看到 “The broker[broker-name, IP:port] boot success.” 即表示成功4. 集群验证与管理4.1 查看集群状态使用 RocketMQ 自带的管理命令查看集群状态# 在任意一台已启动 NameServer 的机器上执行 cd /opt/rocketmq/rocketmq-4.9.8/bin # 查看集群信息 sh mqadmin clusterList -n 192.168.1.101:9876输出应显示四个 Broker其中两个BROKER_ID0的为 Master两个BROKER_ID1的为 Slave并且主从配对正确。4.2 生产与消费测试设置环境变量测试机export NAMESRV_ADDR192.168.1.101:9876;192.168.1.103:9876发送测试消息cd /opt/rocketmq/rocketmq-4.9.8/bin # 启动一个生产者示例发送 10 条消息到 Topic “TestClusterTopic” sh tools.sh org.apache.rocketmq.example.quickstart.Producer消费测试消息# 启动一个消费者示例消费 “TestClusterTopic” 的消息 sh tools.sh org.apache.rocketmq.example.quickstart.Consumer4.3 控制台部署可选RocketMQ Console 是一个可视化的管理控制台。# 下载并解压 RocketMQ Console cd /opt wget https://github.com/apache/rocketmq-dashboard/archive/refs/tags/rocketmq-dashboard-1.0.0.zip unzip rocketmq-dashboard-1.0.0.zip cd rocketmq-dashboard-rocketmq-dashboard-1.0.0 # 修改配置文件 application.yml 中的 namesrvAddr vim src/main/resources/application.yml # 将 namesrvAddr 改为192.168.1.101:9876;192.168.1.103:9876 # 打包并运行 mvn clean package -Dmaven.test.skiptrue java -jar target/rocketmq-dashboard-1.0.0.jar # 访问 http://服务器IP:8080 即可查看集群状态5. 关键配置解析与调优建议同步复制 (SYNC_MASTER)确保主从数据强一致但会略微增加写入延迟。如果对延迟极度敏感且可容忍主节点故障时少量数据丢失可考虑ASYNC_MASTER。异步刷盘 (ASYNC_FLUSH)性能好是默认推荐。若对数据可靠性要求极高如金融交易可改为SYNC_FLUSH但性能会下降。内存与文件映射根据服务器内存调整broker.conf中的mapedFileSizeCommitLogCommitLog 文件大小默认 1G和mapedFileSizeConsumeQueue消费队列文件大小默认 600W * 20 字节。主从切换当主节点宕机时从节点不会自动升级为主节点。需要借助 RocketMQ 的DLeger组件或外部监控脚本实现自动故障转移。6. 常见问题排查启动失败检查 Java 环境、端口占用、防火墙需开放 9876, 10911, 10909, 11