RocketMQ生产拓扑结构

RocketMQ单Master部署
- 使用者:一般是指生产、消费程序的直接研发人员、RocketMQ中间件的维护人员等。
- Console管理平台:管理RocketMQ生产者组、Topic、消费者组和RocketMQ元数据的平台。管理平台可以自研,也可以基于社区提供的 RocketMQ Console二次开发而来,或者直接使用社区提供的RocketMQ Console。
- Namesrv集群:一个无状态的元数据管理,Namesrv相当于RocketMQ的注册中心,提供节点发现。
- Broker 集群:消息中间商或消息代理。主要用于保存消息,处理生产者、消费者的各种请求的代理。包含Master和Slave两种角色,与MySQL中的主从角色类似。
- 生产者集群:消息发送方,通常由一个或多个生产者实例组成。
- 消费者集群:消息接收方,通常由一个或多个消费者实例组成。
RocketMQ的部署模式
Namesrv部署
推荐一个集群并部署2~3个Namesrv节点。
Broker集群部署
- 第一种:单 Master。“集群”中只有一个节点,宕机后不可用。通常用于个人入门学习,比如测试发送消息代码、测试消费消息代码等,建议在生产环境中不要使用这种部署方式。
- 第二种:单 Master,单 Salve。单主从模式,Master 宕机后集群不可写入消息,但可以读取消息。通常用于个人深入学习,比如研究源码、设计原理等,建议在生产环境中不要使用这种部署方式。
- 第三种:多 Master,无 Salve。该种部署方式性能最好,并且当单个 Master节点宕机时,不影响正常使用。
- 第四种:多Master、多Slave,异步复制。在第三种方式上增加了Slave,当一个Master节点宕机时,该Master不能写入消息,消费可以在其对应的Slave上进行。新消息的生产、消费不受影响。添加Salve后,消费者可以从对应的Slave中读取已发送到宕机Master中的消息。生产环境中可以使用这种部署方式。
- 第五种:多 Master、多 Slave,同步复制。这种部署方式完全解决了第四种部署方式的弊端,虽然由于Master-Salve同步复制导致发送消息耗时增加,集群性能大大下降,但是这仍然是最可靠的部署方式。生产环境中可以使用这种部署方式。
RocketMQ单Master部署
单台虚拟机:192.168.31.103
部署NameServer
# 修改IP地址到103
cd /etc/sysconfig/network-scripts
sed -i 's/dhcp/static/g' ifcfg-ens33
sudo cat >> ifcfg-ens33 <<-'EOF'
IPADDR=192.168.31.103
GATEWAY=192.168.31.1
NETMASK=255.255.255.0
DNS1=114.114.114.114
DNS2=8.8.8.8
EOF
service network restart
- 环境准备CentOS 7.x系统 ,YUM安装OpenJDK 1.8,并配置
yum -y install java-1.8.0-openjdk-devel.x86_64
sudo cat >> /etc/profile <<-'EOF'
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
EOF
source /etc/profile
echo $JAVA_HOME
cd /usr/local
# 官网下的太慢,用我提供的OSS加速下载
# wget --no-check-certificate https://manongbiji.oss-cnbeijing.aliyuncs.com/ittailkshow/rocketmq/download/rocketmq-all-4.9.2-binrelease.zip
wget --no-check-certificate https://manongbiji.oss-cnbeijing.aliyuncs.com/ittailkshow/rocketmq/download/rocketmq-all-4.9.2-binrelease.zip
unzip rocketmq-all-4.9.2-bin-release.zip
cd /usr/local/rocketmq-4.9.2
sed -i 's/-Xms4g -Xmx4g -XX:MetaspaceSize=128m/-Xms1g -Xmx1g -
XX:MetaspaceSize=128m/g' ./bin/runserver.sh
firewall-cmd --zone=public --add-port=9876/tcp --permanent
firewall-cmd --reload
# sh ./bin/mqnamesrv
nohup sh ./bin/mqnamesrv > nqnamesrv.log &
部署单Master
cd /etc/sysconfig/network-scripts
sed -i 's/dhcp/static/g' ifcfg-ens33
sudo cat >> ifcfg-ens33 <<-'EOF'
IPADDR=192.168.31.105
GATEWAY=192.168.31.1
NETMASK=255.255.255.0
DNS1=114.114.114.114
DNS2=8.8.8.8
EOF
service network restart
yum -y install java-1.8.0-openjdk-devel.x86_64
sudo cat >> /etc/profile <<-'EOF'
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
EOF
source /etc/profile
echo $JAVA_HOME
cd /usr/local
# 官网下的太慢,用我提供的OSS加速下载
# wget --no-check-certificate https://dlcdn.apache.org/rocketmq/4.9.2/rocketmqall-4.9.2-bin-release.zip
wget --no-check-certificate https://manongbiji.oss-cnbeijing.aliyuncs.com/ittailkshow/rocketmq/download/rocketmq-all-4.9.2-binrelease.zip
unzip rocketmq-all-4.9.2-bin-release.zip
cd /usr/local/rocketmq-4.9.2
sed -i 's/-Xms8g -Xmx8g/-Xms1g -Xmx1g/g' ./bin/runbroker.sh
cat > single-master.properties <<-'EOF'
#集群名称,同一个集群下的broker要求统一
brokerClusterName=DefaultCluster
#broker名称
brokerName=broker-a
#brokerId=0代表主节点,大于零代表从节点
brokerId=0
#删除日志文件时间点,默认凌晨 4 点
deleteWhen=04
#日志文件保留时间,默认 48 小时
fileReservedTime=48
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘,性能好宕机会丢数
#- SYNC_FLUSH 同步刷盘,性能较差不会丢数
flushDiskType=SYNC_FLUSH
#末尾追加,NameServer节点列表,使用分号分割
namesrvAddr=192.168.31.103:9876
autoCreateTopicEnable=true
EOF
firewall-cmd --zone=public --add-port=10911/tcp --permanent
firewall-cmd --reload
# sh ./bin/mqbroker -c ./single-master.properties
nohup sh ./bin/mqbroker -c ./single-master.properties > broker.log &
cd /usr/local/rocketmq-4.9.2/bin
sh mqadmin clusterList -n 192.168.31.103:9876
cd /usr/local/rocketmq-4.9.2/bin
export NAMESRV_ADDR=192.168.31.103:9876
sh tools.sh org.apache.rocketmq.example.quickstart.Producer
cd /usr/local/rocketmq-4.9.2/bin
export NAMESRV_ADDR=192.168.31.103:9876
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
快速部署RocketMQ (Console)Dashboard监控
RocketMQ Dashboard监控中心
Github官网首页
https://github.com/apache/rocketmq-dashboard
Dashboard中文文档
https://github.com/apache/rocketmqdashboard/blob/master/docs/1_0_0/UserGuide_CN.md
下载Dashboard Jar包
https://developer.aliyun.com/mvn/search 搜索 rocketmq-dashboard

RocketMQ启动方式
#安装JDK8
yum -y install java-1.8.0-openjdk-devel.x86_64
sudo cat >> /etc/profile <<-'EOF'
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
EOF
source /etc/profile
echo $JAVA_HOME
#开放端口8080
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
#下载启动dashboard
wget --no-check-certificate https://manongbiji.oss-cnbeijing.aliyuncs.com/ittailkshow/rocketmq/download/rocketmq-dashboard-1.0.0.jar
# java -jar rocketmq-dashboard-1.0.0.jar
nohup java -jar rocketmq-dashboard-1.0.0.jar > dashboard.log &
RocketMQ Dashboard创建主题与读写队列的关系
Dashboard创建主题面板
RocketMQ-Dashboard部署后点击Topic菜单,点击“ADD/UPDATE”按钮新增主题

新增主题包含6项:
- ClusterName:集群名称
- Broker_Name:当前主题与哪些Broker绑定,可以多选
- 绑定多个Broker,将均摊写队列的数量,例如选中2个Broker,4条写队列,则每个分配两条。

- TopicName:主题名称
- WriteQueueNums:写队列数量
- ReadQueueNums:读队列数量
- 读写队列,则是在做路由信息时使用。
举个例子:写队列个数是8,设置的读队列个数是4.这个时候,会创建8个文件夹,代表0 1
2 3 4 5 6 7,但在消息消费时,路由信息只返回4,在具体拉取消息时,就只会消费0 1 2
3这4个队列中的消息,4 5 6 7压根就没有被消费。
反过来,如果写队列个数是4,读队列个数是8,在生产消息时只会往0 1 2 3中生产消息,
消费消息时则会从0 1 2 3 4 5 6 7所有的队列中消费,当然4 5 6 7中压根就没有消息 ,
假设消费group有两个消费者,事实上只有第一个消费者在真正的消费消息(0 1 2 3),第二
个消费者压根就消费不到消息。
- Perm:执行权限,2表示只写,4表示只读

single-master.properties
autoCreateTopicEnable=false # 必须先创建主题,否则报主题不存在,生产要关闭
或者
autoCreateTopicEnable=true # 发送消息时,如果主题不存在,则自动创建
defaultTopicQueueNums=4 #自动创建时读写队列数量为4
生产多Master多Slave环境部署
环境说明
NameServer
- 192.168.31.103
- 192.168.31.113
Broker-A
- Master:192.168.31.104
- Slave:192.168.31.114
Broker-B
- Master:192.168.31.105
- Slave:192.168.31.115
关闭清除已有实例
清除原有并关闭已有线程
pkill java
rm -rf /usr/local/rocketmq-4.9.2
rm -f /usr/local/rocketmq-all-4.9.2-bin-release.zip
部署Name Server
103 NameServer
yum -y install java-1.8.0-openjdk-devel.x86_64
sudo cat >> /etc/profile <<-'EOF'
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
EOF
source /etc/profile
echo $JAVA_HOME
cd /usr/local
# 官网下的太慢,用我提供的OSS加速下载
# wget --no-check-certificate https://manongbiji.oss-cnbeijing.aliyuncs.com/ittailkshow/rocketmq/download/rocketmq-all-4.9.2-binrelease.zip
wget --no-check-certificate https://manongbiji.oss-cnbeijing.aliyuncs.com/ittailkshow/rocketmq/download/rocketmq-all-4.9.2-bin-
release.zip
unzip rocketmq-all-4.9.2-bin-release.zip
cd /usr/local/rocketmq-4.9.2
sed -i 's/-Xms4g -Xmx4g -XX:MetaspaceSize=128m/-Xms1g -Xmx1g -
XX:MetaspaceSize=128m/g' ./bin/runserver.sh
firewall-cmd --zone=public --add-port=9876/tcp --permanent
firewall-cmd --reload
# sh ./bin/mqnamesrv
nohup sh ./bin/mqnamesrv > nqnamesrv.log &
113 NameServer
yum -y install java-1.8.0-openjdk-devel.x86_64
sudo cat >> /etc/profile <<-'EOF'
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
EOF
source /etc/profile
echo $JAVA_HOME
cd /usr/local
# 官网下的太慢,用我提供的OSS加速下载
# wget --no-check-certificate https://manongbiji.oss-cnbeijing.aliyuncs.com/ittailkshow/rocketmq/download/rocketmq-all-4.9.2-binrelease.zip
wget --no-check-certificate https://manongbiji.oss-cnbeijing.aliyuncs.com/ittailkshow/rocketmq/download/rocketmq-all-4.9.2-binrelease.zip
unzip rocketmq-all-4.9.2-bin-release.zip
cd /usr/local/rocketmq-4.9.2
sed -i 's/-Xms4g -Xmx4g -XX:MetaspaceSize=128m/-Xms1g -Xmx1g -
XX:MetaspaceSize=128m/g' ./bin/runserver.sh
firewall-cmd --zone=public --add-port=9876/tcp --permanent
firewall-cmd --reload
# sh ./bin/mqnamesrv
nohup sh ./bin/mqnamesrv > nqnamesrv.log &
部署2Master-2Slave
Broker-A:104主
yum -y install java-1.8.0-openjdk-devel.x86_64
sudo cat >> /etc/profile <<-'EOF'
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
EOF
source /etc/profile
echo $JAVA_HOME
cd /usr/local
#官网下的太慢,用我提供的OSS加速下载
#wget --no-check-certificate https://dlcdn.apache.org/rocketmq/4.9.2/rocketmqall-4.9.2-bin-release.zip
wget --no-check-certificate https://manongbiji.oss-cnbeijing.aliyuncs.com/ittailkshow/rocketmq/download/rocketmq-all-4.9.2-binrelease.zip
unzip rocketmq-all-4.9.2-bin-release.zip
cd /usr/local/rocketmq-4.9.2
sed -i 's/-Xms8g -Xmx8g/-Xms1g -Xmx1g/g' ./bin/runbroker.sh
cat > master-a.properties <<-'EOF'
#集群名称,同一个集群下的broker要求统一
brokerClusterName=DefaultCluster
#broker名称
brokerName=broker-a
#brokerId=0代表主节点,大于零代表从节点
brokerId=0
#删除日志文件时间点,默认凌晨 4 点
deleteWhen=04
#日志文件保留时间,默认 48 小时
fileReservedTime=48
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#SLAVE 从属服务器
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘,性能好宕机会丢数
#- SYNC_FLUSH 同步刷盘,性能较差不会丢数
flushDiskType=SYNC_FLUSH
#末尾追加,NameServer节点列表,使用分号分割
namesrvAddr=192.168.31.103:9876;192.168.31.113:9876
autoCreateTopicEnable=false
EOF
firewall-cmd --zone=public --add-port=10911/tcp --permanent
firewall-cmd --reload
#sh ./bin/mqbroker -c ./single-master.properties
nohup sh ./bin/mqbroker -c ./master-a.properties > broker.log &
Broker-A:114从
yum -y install java-1.8.0-openjdk-devel.x86_64
sudo cat >> /etc/profile <<-'EOF'
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
EOF
source /etc/profile
echo $JAVA_HOME
cd /usr/local
#官网下的太慢,用我提供的OSS加速下载
#wget --no-check-certificate https://dlcdn.apache.org/rocketmq/4.9.2/rocketmqall-4.9.2-bin-release.zip
wget --no-check-certificate https://manongbiji.oss-cnbeijing.aliyuncs.com/ittailkshow/rocketmq/download/rocketmq-all-4.9.2-binrelease.zip
unzip rocketmq-all-4.9.2-bin-release.zip
cd /usr/local/rocketmq-4.9.2
sed -i 's/-Xms8g -Xmx8g/-Xms1g -Xmx1g/g' ./bin/runbroker.sh
cat > slave-a.properties <<-'EOF'
#集群名称,同一个集群下的broker要求统一
brokerClusterName=DefaultCluster
#broker名称
brokerName=broker-a
#brokerId=0代表主节点,大于零代表从节点
brokerId=1
#删除日志文件时间点,默认凌晨 4 点
deleteWhen=04
#日志文件保留时间,默认 48 小时
fileReservedTime=48
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘,性能好宕机会丢数
#- SYNC_FLUSH 同步刷盘,性能较差不会丢数
flushDiskType=SYNC_FLUSH
#末尾追加,NameServer节点列表,使用分号分割
namesrvAddr=192.168.31.103:9876;192.168.31.113:9876
autoCreateTopicEnable=false
EOF
firewall-cmd --zone=public --add-port=10911/tcp --permanent
firewall-cmd --reload
# sh ./bin/mqbroker -c ./slave-a.properties
nohup sh ./bin/mqbroker -c ./slave-a.properties > broker.log &
Broker-B:105主
yum -y install java-1.8.0-openjdk-devel.x86_64
sudo cat >> /etc/profile <<-'EOF'
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
EOF
source /etc/profile
echo $JAVA_HOME
cd /usr/local
# 官网下的太慢,用我提供的OSS加速下载
# wget --no-check-certificate https://dlcdn.apache.org/rocketmq/4.9.2/rocketmqall-4.9.2-bin-release.zip
wget --no-check-certificate https://manongbiji.oss-cnbeijing.aliyuncs.com/ittailkshow/rocketmq/download/rocketmq-all-4.9.2-binrelease.zip
unzip rocketmq-all-4.9.2-bin-release.zip
cd /usr/local/rocketmq-4.9.2
sed -i 's/-Xms8g -Xmx8g/-Xms1g -Xmx1g/g' ./bin/runbroker.sh
cat > master-b.properties <<-'EOF'
#集群名称,同一个集群下的broker要求统一
brokerClusterName=DefaultCluster
#broker名称
brokerName=broker-b
#brokerId=0代表主节点,大于零代表从节点
brokerId=0
#删除日志文件时间点,默认凌晨 4 点
deleteWhen=04
#日志文件保留时间,默认 48 小时
fileReservedTime=48
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘,性能好宕机会丢数
#- SYNC_FLUSH 同步刷盘,性能较差不会丢数
flushDiskType=SYNC_FLUSH
#末尾追加,NameServer节点列表,使用分号分割
namesrvAddr=192.168.31.103:9876;192.168.31.113:9876
autoCreateTopicEnable=false
EOF
firewall-cmd --zone=public --add-port=10911/tcp --permanent
firewall-cmd --reload
# sh ./bin/mqbroker -c ./master-b.properties
nohup sh ./bin/mqbroker -c ./master-b.properties > broker.log &
Broker-B:115从
yum -y install java-1.8.0-openjdk-devel.x86_64
sudo cat >> /etc/profile <<-'EOF'
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
EOF
source /etc/profile
echo $JAVA_HOME
cd /usr/local
# 官网下的太慢,用我提供的OSS加速下载
# wget --no-check-certificate https://dlcdn.apache.org/rocketmq/4.9.2/rocketmqall-4.9.2-bin-release.zip
wget --no-check-certificate https://manongbiji.oss-cnbeijing.aliyuncs.com/ittailkshow/rocketmq/download/rocketmq-all-4.9.2-binrelease.zip
unzip rocketmq-all-4.9.2-bin-release.zip
cd /usr/local/rocketmq-4.9.2
sed -i 's/-Xms8g -Xmx8g/-Xms1g -Xmx1g/g' ./bin/runbroker.sh
cat > slave-b.properties <<-'EOF'
#集群名称,同一个集群下的broker要求统一
brokerClusterName=DefaultCluster
#broker名称
brokerName=broker-b
#brokerId=0代表主节点,大于零代表从节点
brokerId=1
#删除日志文件时间点,默认凌晨 4 点
deleteWhen=04
#日志文件保留时间,默认 48 小时
fileReservedTime=48
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘,性能好宕机会丢数
#- SYNC_FLUSH 同步刷盘,性能较差不会丢数
flushDiskType=SYNC_FLUSH
#末尾追加,NameServer节点列表,使用分号分割
namesrvAddr=192.168.31.103:9876;192.168.31.113:9876
autoCreateTopicEnable=false
EOF
firewall-cmd --zone=public --add-port=10911/tcp --permanent
firewall-cmd --reload
# sh ./bin/mqbroker -c ./slave-b.properties
nohup sh ./bin/mqbroker -c ./slave-b.properties > broker.log &
验证集群有效
cd /usr/local/rocketmq-4.9.2/bin
sh mqadmin clusterList -n 192.168.31.113:9876
评论区