上一篇文章较为复杂不太适合初学者,初学者学习集群安装可以看这篇文章。
目录
1. 集群规划与环境准备
1.1 机器规划
1.2 环境准备(所有节点)
2. 配置 NameServer
2.1 修改runserver.sh脚本
3. 配置broker
3.1 修改runbroker.sh
4. 传送包
5. 启动 NameServer
5.1 启动
5.2 验证 NameServer 运行
5.3 NameServer 集群规模选择建议
6. 启动broker
7. 验证部署
1. 集群规划与环境准备
本教程将指导您在 CentOS 7.9(2009 版本)操作系统上,部署一个高可用的 RocketMQ 4.9.8 集群。我们采用经典的“两主两从”架构,并配置为同步复制(SYNC_MASTER)和异步刷盘(ASYNC_FLUSH),以在保证数据可靠性的同时,兼顾写入性能。
1.1 机器规划
假设我们拥有四台服务器,其角色与网络规划如下:
| 主机名/IP | host | 角色 | Broker Name | 监听端口 |
|---|---|---|---|---|
| 192.168.1.101 | node1 | NameSrv1,Master 1 | broker-a | 10911 (Broker), 10909 (HA) |
| 192.168.1.102 | node2 | NameSrv2,Slave 1 (Master 1 的从节点) | broker-a-s | 11911 (Broker), 11909 (HA) |
| 192.168.1.103 | node3 | NameSrv3,Master 2 | broker-b | 10911 (Broker), 10909 (HA) |
| 192.168.1.104 | node4 | Slave 2 (Master 2 的从节点) | broker-b-s | 11911 (Broker), 11909 (HA) |
架构说明:
- 两主两从:两个主 Broker(broker-a, broker-b)分别处理不同 Topic 的读写请求,互为备份。每个主节点都有一个对应的从节点(broker-a-s, broker-b-s),在主节点故障时提供高可用。
- 同步复制 (SYNC_MASTER):消息在主节点写入成功后,必须同步复制到从节点,从节点确认后才会向生产者返回成功。这保证了数据在主从间的一致性,是数据高可靠的关键。
- 异步刷盘 (ASYNC_FLUSH):消息写入内存后即返回成功,由后台线程异步将内存数据持久化到磁盘。这牺牲了极小概率的极端故障数据丢失风险,换取了更高的写入吞吐量。
1.2 环境准备(所有节点)
在四台服务器上均执行以下操作:
- 系统更新与基础工具
# 安装必要工具 sudo yum install -y 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(node1)
# 创建安装目录 sudo mkdir -p /home/erbao/rocketmq cd /home/erbao/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.82. 配置 NameServer
NameServer 是 RocketMQ 的服务发现组件,所有 Broker 和客户端都需要连接它。我们可以在四台机器中的任意三台(例如 101 102 103)上启动 NameServer,以实现高可用。
2.1 修改runserver.sh脚本
RocketMQ 官方建议需要 8G 内存,但开发测试环境或我们的虚拟机中内存一般分配较小,所以需要先修改启动脚本中的堆内存大小。注意生产环境一定要配置8G内存
3. 配置broker
3.1 修改runbroker.sh
配置完namesrv和broker启动脚本中堆内存大小之后不需要再修改别的配置,直接使用默认的就可以。
4. 传送包
将修改好的包传送到其他服务器上
# 其他三台机器需要先创建目录 /home/erbao/rocketmq scp -r /home/erbao/rocketmq/rocketmq-4.9.8/ node2:/home/erbao/rocketmq/ scp -r /home/erbao/rocketmq/rocketmq-4.9.8/ node3:/home/erbao/rocketmq/ scp -r /home/erbao/rocketmq/rocketmq-4.9.8/ node4:/home/erbao/rocketmq/5. 启动 NameServer
在node1 node2 node3都执行启动脚本
5.1 启动
cd /home/erbao/rocketmq/rocketmq-4.9.8 # 后台启动 NameServer nohup sh bin/mqnamesrv & # 检查日志,确认启动成功 tail -f ~/logs/rocketmqlogs/namesrv.log # 看到 “The Name Server boot success.” 即表示成功5.2 验证 NameServer 运行
# 查看进程 jps | grep NamesrvStartup # 应显示进程 ID # 查看监听端口 (9876) netstat -tlnp | grep 98765.3 NameServer 集群规模选择建议
在规划 RocketMQ 集群时,NameServer 的部署数量是一个常见问题。本文示例部署了两台 NameServer,但实际生产环境中,部署 3 台或更多奇数台 NameServer 通常是更优的选择,原因如下:
- 高可用与容错:NameServer 采用去中心化设计,各节点之间无数据同步,仅存储路由信息(Broker 心跳上报)。客户端和 Broker 会连接所有配置的 NameServer。部署 3 台可以在其中 1 台故障时,集群仍能正常提供服务(剩余 2 台),而 2 台部署在 1 台故障后只剩单点,虽然仍能工作,但容错能力较弱。
- 避免“脑裂”感知:虽然 NameServer 本身无状态,但某些客户端 SDK 或管理工具在部分 NameServer 不可达时可能产生警告日志。3 台部署能提供更稳定的连接体验。
- 资源占用极低:NameServer 进程非常轻量(通常占用内存 < 100MB),增加一台的成本很低,但带来的可用性提升显著。
6. 启动broker
分别在四台机器上执行启动脚本
# 首先进入目录:/home/erbao/rocketmq/rocketmq-4.9.8 # node1 注意namesrv地址之间的分号需要使用转义字符,因为;是bash的命令分隔符,没有转移字符不会当作一条命令执行 nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a.properties -n 192.168.1.101:9876\;192.168.1.102:9876\;192.168.1.103:9876 & # node2 nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a-s.properties -n 192.168.1.101:9876\;192.168.1.102:9876\;192.168.1.103:9876 & # node3 nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b.properties -n 192.168.1.101:9876\;192.168.1.102:9876\;192.168.1.103:9876 & # node4 nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b-s.properties -n 192.168.1.101:9876\;192.168.1.102:9876\;192.168.1.103:9876 &7. 验证部署
name server地址,首先(node1 node3)执行命令
export NAMESRV_ADDR=192.168.1.101:9876\;192.168.1.102:9876\;192.168.1.103:9876node1执行生产者
cd /home/erbao/rocketmq/rocketmq-4.9.8 sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer发送到队列成功,SEND_OK
node3执行消费者
cd /home/erbao/rocketmq/rocketmq-4.9.8 sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer消费成功