Apache RocketMQ 官网:https://rocketmq.apache.org/zh/
1.安装
RocketMQ 的安装包分为两种,二进制包和源码包。 点击这里 下载 Apache RocketMQ 5.1.4的源码包。你也可以从这里 下载到二进制包。二进制包是已经编译完成后可以直接运行的,源码包是需要编译后运行的。
1、下载解压
# rocketmq-all-5.1.4-bin-release.zip
# 将下载的压缩包上传到/data/service/rocketmq
[admin@test-webapp-svr20 ~]$ cd /data/service/rocketmq
# 解压
[admin@test-webapp-svr20 rocketmq]$ unzip rocketmq-all-5.1.4-bin-release.zip
[admin@test-webapp-svr20 rocketmq]$ ll
total 86056
drwxr-xr-x 6 admin grpadmin 4096 Jan 23 10:39 rocketmq-all-5.1.4-bin-release
-rw-r--r-- 1 admin grpadmin 88109546 Jan 23 10:35 rocketmq-all-5.1.4-bin-release.zip
2、配置环境变量
# 打开环境变量
[admin@test-webapp-svr20 rocketmq] vi /etc/profile
# 添加以下内容
export ROCKETMQ_HOME=/data/service/rocketmq/rocketmq-all-5.1.4-bin-release
export PATH=$ROCKETMQ_HOME/bin:$PATH
# 保存并退出
:wq
# 刷新环境变量
source /etc/profile
3、修改配置文件,根据实际服务器修改,以下配置不为实际生产配置
# 修改内存相关配置
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
[admin@test-webapp-svr20 bin] vim runbroker.sh
# 修改 JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g" 改为512m
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m"
[admin@test-webapp-svr20 bin] vim runserver.sh
# 修改 JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
# 修改 JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
4、修改/conf/broker.conf(启动时可选择该配置文件)
### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf
[admin@test-webapp-svr20 conf]$ vim broker.conf
#集群名称,可自定义
brokerClusterName=DefaultCluster
brokerName=broker‐a
brokerId=0
# 定义服务地址,主存地址
namesrvAddr=987.65.43.211:9876
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
autoCreateTopicEnable=true
#消息存储根路径
storePathRootDir=/data/service/rocketmq/rocketmq-all-5.1.4-bin-release/logs
#日志路径
storePathCommitLog=/data/service/rocketmq/rocketmq-all-5.1.4-bin-release/logs/commitlog
2.启动NameServer
安装完RocketMQ包后,我们启动NameServer
### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 启动namesrv
[admin@test-webapp-svr20 bin] nohup sh mqnamesrv &
### 验证namesrv是否启动成功
[admin@test-webapp-svr20 bin] tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
3.启动Broker+Proxy
NameServer成功启动后,我们启动Broker和Proxy,5.x 版本下我们建议使用 Local 模式部署,即 Broker 和 Proxy 同进程部署。5.x 版本也支持 Broker 和 Proxy 分离部署以实现更灵活的集群能力。详情参考部署教程。
启动Broker+Proxy
### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 先启动broker 192.168.0.128为服务器的内网ip
[admin@test-webapp-svr20 bin] nohup sh mqbroker -n 987.65.43.211:9876 --enable-proxy &
### 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a
[admin@test-webapp-svr20 bin] tail -f ~/logs/rocketmqlogs/proxy.log
The broker[broker-a,192.169.1.2:10911] boot success...
报错:
java.io.IOException: Failed to bind to address 0.0.0.0/0.0.0.0:8081
原因:
rocketmq默认的Proxy、Dashboard端口分别为8081、8080,和原有系统中的端口冲突,需进行调整
解决:
修改/data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/rmq-proxy.json
{
"rocketMQClusterName": "DefaultCluster",
# Dashboard 默认端口 8080
"remotingListenPort": 9080,
# Proxy默认端口 8081
"grpcServerPort": 9081
}
4.关闭Broker、NameServer
关闭命令
### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
# 关闭时请先关闭broker
[admin@test-webapp-svr20 rocketmq] sh mqshutdown broker
# 后关闭nameserver
[admin@test-webapp-svr20 rocketmq] sh mqshutdown namesrv
# 查看rocketmq进程是否关闭
[admin@test-webapp-svr20 rocketmq] ps -ef|grep rocketmq
5.修改默认端口
5.1. 修改NameServer端口
NameServer默认端口9876
#在rocketmq的conf目录下添加namesrv.properties文件,文件中添加端口配置
listenPort=8876
#使用配置信息后台启动namesrv
nohup sh mqnamesrv -c conf/namesrv.properties &
5.2. 修改Broker端口
Broker默认端口10911
#在rocketmq的conf/broker.conf,文件中添加端口配置
#使用配置信息后台启动Broker
nohup sh mqbroker -n 192.168.0.128:9876 -c conf/broker.conf --enable-proxy &
5.3. 修改Proxy、Dashboard端口
Dashboard 默认端口 8080
Proxy默认端口 8081
修改/data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/rmq-proxy.json
{
"rocketMQClusterName": "DefaultCluster",
# Dashboard 默认端口 8080
"remotingListenPort": 9080,
# Proxy默认端口 8081
"grpcServerPort": 9081
}
6.安装RocketMQ Dashboard
RocketMQ Dashboard
是 RocketMQ 的管控利器,为用户提供客户端和应用程序的各种事件、性能的统计信息,支持以可视化工具代替 Topic 配置、Broker 管理等命令行操作。
6.1.介绍
6.1.1.功能概览
面板 | 功能 |
---|---|
运维 | 修改nameserver 地址; 选用 VIPChannel |
驾驶舱 | 查看 broker, topic 消息量 |
集群 | 集群分布,broker 配置、运行信息 |
主题 | 搜索、筛选、删除、更新/新增主题,消息路由,发送消息,重置消费位点 |
消费者 | 搜索、删除、新增/更新消费者组,终端,消费详情,配置 |
消息 | 消息记录,私信消息,消息轨迹等消息详情 |
操作面板:
6.2.快速开始
系统要求:
- Linux/Unix/Mac
- 64bit JDK 1.8+
- Maven 3.2.x
- 启动 RocketMQ
网络配置:
- 云服务器可远程访问或本地虚拟机可 PING 通外网
rocketmq
配置文件broker.conf / broker-x.properties
设置 nameserver 地址和端口号- 用配置文件启动 broker
6.2.1.源码安装
源码地址:apache/rocketmq-dashboard
下载并解压,切换至源码目录 rocketmq-dashboard-master/
① 编译 rocketmq-dashboard
$ mvn clean package -Dmaven.test.skip=true
② 运行 rocketmq-dashboard
$ java -jar target/rocketmq-dashboard-1.0.1-SNAPSHOT.jar
默认端口8080,若修改端口,调整代码中的application.yml配置文件重新进行打包
注意:
默认启动项目后,会再/home/admin/logs/rocketmqlogs 下生成对应日志,日志很大,使用-Drocketmq.client.logUseSlf4j=true启动项目取消日志生成
脚本运行
#!/bin/bash
PROJECT_NAME="rocketmq-dashboard-1.0.1-SNAPSHOT.jar"
echo "查询进程id-->${PROJECT_NAME}"
PID=`ps -ef | grep ${PROJECT_NAME} | awk '{print $2}'`
echo "得到进程ID:${PID}"
echo "结束进程"
for id in ${PID}
do
kill -9 ${id}
echo "killed ${id}"
done
echo "结束进程完成"
echo "启动服务"
BUILD_ID=mqdontKillMe nohup java -Xms1024m -Xmx1024m -Dfile.encoding=UTF-8 -jar -Drocketmq.client.logUseSlf4j=true target/${PROJECT_NAME} > /dev/null 2>&1 &
echo "服务完成"
提示:Started App in x.xxx seconds (JVM running for x.xxx) 启动成功
浏览器页面访问:namesrv.addr:8080
关闭 rocketmq-dashboard
: ctrl + c
再次启动:执行 ②
tips:下载后的源码需要上传到 Linux 系统上编译,本地编译可能会报错。
使用教程:https://rocketmq.apache.org/zh/docs/deploymentOperations/04Dashboard
7.双主双从安装
7.1. 服务器环境
ip (外/内) | 角色 | 架构模式 |
---|---|---|
123.45.56.789/192.168.0.162 | nameserver1:6789、broker-master1:12911、broker-slave2:13021 | Master1、Slave2 |
987.65.43.211/192.168.0.128 | nameserver2:6789、broker-master2:12921、broker-slave1:13011 | Master2、Slave1 |
7.1.2.开通端口
每个服务器需开放七个端口,生产可以进行调整端口
namesrv
- 6789
broker主节点
- 12911、12909、12912
broker从节点
- 13011、13009、13012
端口规则说明:
namesrv默认端口:9876
假设broker配置的 ListenPort 端口:10911
则vip 通道端口为:ListenPort - 2 = 10909
则HA 通道端口为: ListenPort + 1 = 10912
7.2. 部署
本次在开发和测试环境部署rocketmq采用SYNC_MASTER 同步双写,ASYNC_FLUSH 异步刷盘进行
注:关于同步复制、异步复制、同步刷盘与异步刷盘区别,参考8.5专项解释
7.2.1.host解析
# 服务器123.45.56.789
vim /etc/hosts
# nameserver
123.45.56.789 nameserver1 # 6789
987.65.43.211 nameserver2 # 6789
# broker
123.45.56.789 broker-master1 # 12911
123.45.56.789 broker-slave2 # 13021
987.65.43.211 broker-master2 # 12921
987.65.43.211 broker-slave1 # 13011
# 配置完成后,重启网卡
systemctl restart network
service network restart
# Centos 8 重启网卡
nmcli c reload
# 服务器987.65.43.211
vim /etc/hosts
# nameserver
123.45.56.789 nameserver1 # 6789
987.65.43.211 nameserver2 # 6789
# broker
123.45.56.789 broker-master1 # 12911
123.45.56.789 broker-slave2 # 13021
987.65.43.211 broker-master2 # 12921
987.65.43.211 broker-slave1 # 13011
# 配置完成后,重启网卡
systemctl restart network
# Centos 8 重启网卡
nmcli c reload
7.2.2.安全组配置
为了安全只开放特定的端口号:6789(NameServer1 和 NameServer2)、12911(Master1)、12921(Master2)、13011(Slave1)、13021(Slave2)
7.2.3.创建消息存储路径
1号服务器:123.45.56.789
mkdir -p /data/service/rocketmq/store/broker-a/commitlog
mkdir -p /data/service/rocketmq/store/broker-a/consumequeue
mkdir -p /data/service/rocketmq/store/broker-a/index
mkdir -p /data/service/rocketmq/store/broker-b-s/commitlog
mkdir -p /data/service/rocketmq/store/broker-b-s/consumequeue
mkdir -p /data/service/rocketmq/store/broker-b-s/index
2号服务器 :987.65.43.211
mkdir -p /data/service/rocketmq/store/broker-b/commitlog
mkdir -p /data/service/rocketmq/store/broker-b/consumequeue
mkdir -p /data/service/rocketmq/store/broker-b/index
mkdir -p /data/service/rocketmq/store/broker-a-s/commitlog
mkdir -p /data/service/rocketmq/store/broker-a-s/consumequeue
mkdir -p /data/service/rocketmq/store/broker-a-s/index
7.2.4. broker配置文件
分别在2台服务器上执行以下命令,编辑 broker.conf 文件,改成对应服务器的外网IP
# 两台服务器同时执行
# 服务器 123.45.56.789
vim /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/broker.conf
namesrvAddr=987.65.43.211:9876
brokerIP=987.65.43.211
# 服务器 987.65.43.211
vim /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/broker.conf
namesrvAddr=987.65.43.211:9876
brokerIP=987.65.43.211
7.2.5. master1(服务器一)
服务器一:123.45.56.789、192.168.0.162
# 修改同步复制配置文件
vim /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-a.properties
#Broker服务地址
brokerIP1=123.45.56.789
brokerIP2=123.45.56.789
#所属集群名字
brokerClusterName=test-dh-rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=123.45.56.789:6789;987.65.43.211:6789
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=false
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=false
#Broker 对外服务的监听端口
listenPort=12911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/service/rocketmq/store/broker-a
#commitLog 存储路径
storePathCommitLog=/data/service/rocketmq/store/broker-a/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/service/rocketmq/store/broker-a/consumequeue
#消息索引存储路径
storePathIndex=/data/service/rocketmq/store/broker-a/index
#checkpoint 文件存储路径
storeCheckpoint=/data/service/rocketmq/store/broker-a/checkpoint
#abort 文件存储路径
abortFile=/data/service/rocketmq/store/broker-a/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
7.2.6. slave2(服务器一)
服务器一:123.45.56.789、192.168.0.162
# 修改同步复制配置文件
vim /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-b-s.properties
#Broker服务地址
brokerIP1=123.45.56.789
#所属集群名字
brokerClusterName=test-dh-rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=123.45.56.789:6789;987.65.43.211:6789
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=false
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=false
#Broker 对外服务的监听端口
listenPort=13021
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/service/rocketmq/store/broker-b-s
#commitLog 存储路径
storePathCommitLog=/data/service/rocketmq/store/broker-b-s/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/service/rocketmq/store/broker-b-s/consumequeue
#消息索引存储路径
storePathIndex=/data/service/rocketmq/store/broker-b-s/index
#checkpoint 文件存储路径
storeCheckpoint=/data/service/rocketmq/store/broker-b-s/checkpoint
#abort 文件存储路径
abortFile=/data/service/rocketmq/store/broker-b-s/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
7.2.7. master2(服务器二)
服务器一:987.65.43.211、192.168.0.128
# 修改同步复制配置文件
vim /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-b.properties
#Broker服务地址,设置broker节点所在服务器的ip地址(这个非常重要,主从模式下,从节点会根据主节点的brokerIP2来同步数据,#如果不配置,主从无法同步,brokerIP1设置为自己外网能访问的ip,服务器双网卡情况下必须配置,比如阿里云这$种,#主节点需要配置ip1和ip2,从节点只需要配置ip1即可)
brokerIP1=987.65.43.211
brokerIP2=987.65.43.211
#所属集群名字
brokerClusterName=test-dh-rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=123.45.56.789:6789;987.65.43.211:6789
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=false
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=false
#Broker 对外服务的监听端口
listenPort=12921
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/service/rocketmq/store/broker-b
#commitLog 存储路径
storePathCommitLog=/data/service/rocketmq/store/broker-b/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/service/rocketmq/store/broker-b/consumequeue
#消息索引存储路径
storePathIndex=/data/service/rocketmq/store/broker-b/index
#checkpoint 文件存储路径
storeCheckpoint=/data/service/rocketmq/store/broker-b/checkpoint
#abort 文件存储路径
abortFile=/data/service/rocketmq/store/broker-b/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
7.2.8. slave1(服务器二)
服务器一:987.65.43.211、192.168.0.128
# 修改同步复制配置文件
vim /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-a-s.properties
#所属集群名字
brokerClusterName=test-dh-rocketmq-cluster
#broker 名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer 地址,分号分割
namesrvAddr=123.45.56.789:6789;987.65.43.211:6789
#安装可视化界面使用,需要是IP,不能是host
#设置broker节点所在服务器的ip地址(**这个非常重要,主从模式下,从节点会根据主节点的brokerIP2来同步数据,#如果不配置,主从无法同步,brokerIP1设置为自己外网能访问的ip,服务器双网卡情况下必须配置,比如阿里云这$种,#主节点需要配置ip1和ip2,从节点只需要配置ip1即可)
brokerIP1=987.65.43.211
#在发送消息时,自动创建服务器不存在的 topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭
#进行发消息时,必须要指定topic,对于topic的设置有一个开关autoCreateTopicEnable,一#般在开发测试环境中会使用默认设置autoCreateTopicEnable = true,但是这样就会导致#topic的设置不容易规范管理,没有统一的审核。所以在正式环境中会在Broker启动时#设置参数autoCreateTopicEnable = false。这样当需要增加topic时就需要在web管理界面上#添加即可。
autoCreateTopicEnable=false
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=false
#Broker 对外服务的监听端口,如果从节点是单独服务器,则可以使用默认端口19011
listenPort=13011
#删除文件时间点,默认凌晨 4 点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog 每个文件的大小默认 1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/service/rocketmq/store/broker-a-s
#commitLog 存储路径
storePathCommitLog=/data/service/rocketmq/store/broker-a-s/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/service/rocketmq/store/broker-a-s/consumequeue
#消息索引存储路径
storePathIndex=/data/service/rocketmq/store/broker-a-s/index
#checkpoint 文件存储路径
storeCheckpoint=/data/service/rocketmq/store/broker-a-s/checkpoint
#abort 文件存储路径
abortFile=/data/service/rocketmq/store/broker-a-s/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制 Master
#- SYNC_MASTER 同步双写 Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
7.2.9.服务启动
7.2.9.1.启动NameServer集群
分别在服务器一和服务器二启动NameServer1 和 NameServer2
# 两个服务器都需要操作
#在rocketmq的conf目录下添加namesrv.properties文件,文件中添加端口配置
listenPort=6789
### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 启动namesrv
[admin@test-webapp-svr20 bin] nohup sh mqnamesrv -c ../conf/namesrv.properties &
### 验证namesrv是否启动成功
[admin@test-webapp-svr20 bin] tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
7.2.9.2.启动Broker集群
启动顺序
注意:如果不使用代理proxy模式,启动命令不需要带 --enable-proxy
5.x版本使用代理启动会报错,目前还未找到集群启动代理的方法,后续进行补充
------------2024-03-28-------------------
使用代理模式集群部署可以看我的下一篇文章:Apache RocketMQ5.x使用代理proxy集群部署
1、在123.45.56.789 启动 master1
### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 先启动broker 如果不使用代理proxy模式,启动命令不需要带 --enable-proxy
[admin@test-webapp-svr20 bin] nohup sh mqbroker -c /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-a.properties --enable-proxy &
### 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a
[admin@test-webapp-svr20 bin] tail -1000f ~/logs/rocketmqlogs/proxy.log
The broker[broker-a,192.169.1.2:10911] boot success...
2、在987.65.43.211 启动 master2
### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 先启动broker 如果不使用代理proxy模式,启动命令不需要带 --enable-proxy
[admin@test-webapp-svr20 bin] nohup sh mqbroker -c /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-b.properties --enable-proxy &
### 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a
[admin@test-webapp-svr20 bin] tail -1000f ~/logs/rocketmqlogs/proxy.log
The broker[broker-a,192.169.1.2:10911] boot success...
3、在987.65.43.211 启动 slave1
### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 先启动broker 如果不使用代理proxy模式,启动命令不需要带 --enable-proxy
[admin@test-webapp-svr20 bin] nohup sh mqbroker -c /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-a-s.properties --enable-proxy &
### 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a
[admin@test-webapp-svr20 bin] tail -1000f ~/logs/rocketmqlogs/proxy.log
The broker[broker-a,192.169.1.2:10911] boot success...
4、在123.45.56.789 启动 slave2
### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 先启动broker 如果不使用代理proxy模式,启动命令不需要带 --enable-proxy
[admin@test-webapp-svr20 bin] nohup sh mqbroker -c /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-b-s.properties --enable-proxy &
### 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a
[admin@test-webapp-svr20 bin] tail -1000f ~/logs/rocketmqlogs/proxy.log
The broker[broker-a,192.169.1.2:10911] boot success...
7.2.9.3.查看状态
# 分别在两个服务器执行命令
jps
启动完成,分别在2台服务器查看集群信息:
sh mqadmin clusterlist -n 123.45.56.789:6789
sh mqadmin clusterlist -n 987.65.43.211:6789
或者执行以下命令:
sh mqadmin clusterlist -n localhost:6789
7.2.9.3.开通防火墙端口(防火墙关闭除外)
端口规则说明:
namesrv默认端口:9876
假设broker配置的 ListenPort 端口:10911
则vip 通道端口为:ListenPort - 2 = 10909
则HA 通道端口为: ListenPort + 1 = 10912
例如:987.65.43.211 本次部署了master2和slave1,对应broker配置的 ListenPort 为:12921、13011
根据端口规则,987.65.43.211需开通
master2:12921、12919、12922
slave1:13011、13009、13012
# 开通端口,本次是在987.65.43.211服务器执行,所以开通12921、12919、12922、13011、13009、13012端口
# 查看防火墙是否有此端口
[root@test-webapp-svr20 ~]# firewall-cmd --zone=public --list-ports
80/tcp 81/tcp 82/tcp 83/tcp 88/tcp 443/tcp 3000/tcp 3001/tcp 3306/tcp
# 修改端口
[root@test-webapp-svr20 ~]# firewall-cmd --zone=public --add-port=12921/tcp --permanent --add-port=12919/tcp --permanent --add-port=12922/tcp --permanent --add-port=13011/tcp --permanent --add-port=13009/tcp --permanent --add-port=13012/tcp --permanent
# 重启防火墙
[root@test-webapp-svr20 ~]# firewall-cmd --reload
# 123.45.56.789 同样操作
注意:此处开通防火墙,对应服务器安全组也需要开通,生产环境使用内网地址进行交互,则不需要开通
7.2.10.RocketMQ Dashboard配置修改
1、根据上面部署的NameServer的端口,需修改Dashboard配置
# 到Dashboard源码位置
cd /data/service/rocketmq/rocketmq-dashboard-master
# 修改配置文件
vim src/main/resources/application.yml
# 修改完成 编译
mvn clean package -Dmaven.test.skip=true
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
server:
port: 8080 # 修改为你想要的配置端口
servlet:
encoding:
charset: UTF-8
enabled: true
force: true
## SSL setting
# ssl:
# key-store: classpath:rmqcngkeystore.jks
# key-store-password: rocketmq
# key-store-type: PKCS12
# key-alias: rmqcngkey
spring:
application:
name: rocketmq-dashboard
logging:
config: classpath:logback.xml
rocketmq:
config:
# if this value is empty,use env value rocketmq.config.namesrvAddr NAMESRV_ADDR | now, default localhost:9876
# configure multiple namesrv addresses to manage multiple different clusters
namesrvAddrs:
- 127.0.0.1:9876 # 根据配置的ip和端口修改 本次为 123.45.56.789:6789
- 127.0.0.2:9876 # 根据配置的ip和端口修改 本次为 987.65.43.211:6789
# if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
isVIPChannel:
# timeout for mqadminExt, default 5000ms
timeoutMillis:
# rocketmq-console's data path:dashboard/monitor
dataPath: /tmp/rocketmq-console/data
# set it false if you don't want use dashboard.default true
enableDashBoardCollect: true
# set the message track trace topic if you don't want use the default one
msgTrackTopicName:
ticketKey: ticket
# 开启控制台账户密码登录(为true表示开启,为false表示关闭)
loginRequired: true
useTLS: false
# set the accessKey and secretKey if you used acl
accessKey: # if version > 4.4.0
secretKey: # if version > 4.4.0
threadpool:
config:
coreSize: 10
maxSize: 10
keepAliveTime: 3000
queueSize: 5000
2、配置控制台用户名密码,users.properties
# This file supports hot change, any change will be auto-reloaded without Console restarting.
# Format: a user per line, username=password[,N] #N is optional, 0 (Normal User); 1 (Admin)
# Define Admin
# =============用户名和密码规则「用户名=密码,权限」,这里的权限为1表示管理员,为0表示普通用户=============
# 例如:admin=admin123,1
admin=admin123,1
rensen=rensen,1
songmingming=songmingming,1
zhaolei=zhaolei,0
yangzehao=yangzehao,0
qinchunfeng=qinchunfeng,0
liuyang=liuyang,1
zhangbaoqin=zhangbaoqin,0
luxiaomeng=
# Define Users
# =============屏蔽下边两个账户=============
#user1=user1
#user2=user2
8.rocket5.x说明
8.1.rocketmq默认端口
端口解释
Nameserver
- port: 9876(默认)
Controller
- port: 9878(默认)
Broker
- port: 10911(默认)
Brocontroller
- port: listenport - 2 = 10909(默认)
主从同步端口
- port: 30912
Proxy
- port: 8081(默认)
Dashboard
- port: 8080(默认)
8.2.rocketmq5.x架构图
RocketMQ 5.0 为了更好地拥抱云原生,引入了无状态的 Proxy 模块,新的架构图如下:
引入 Proxy 模块后,Proxy 承担了协议适配、权限管理、消息管理等计算功能,Broker 则更加专注于存储。这样存储和计算相分离,在云原生环境下可以更好地进行资源调度。
8.3.Proxy 介绍
RocketMQ 5.0 把客户端的部分功能下沉到 Proxy,Proxy 承接了之前 客户端的计算能力,客户端变得更加轻量级。
8.3.1 NameServer
从上面的架构图可以看到,Producer/Consumer 不再需要注册到 NameServer,这一部分功能下移到了 Proxy,由 Proxy 跟 NameServer 进行交互,比如查询 TopicRouteData。代码如下:
public CompletableFuture<QueryRouteResponse> queryRoute(ProxyContext ctx, QueryRouteRequest request) {CompletableFuture<QueryRouteResponse> future = new CompletableFuture<>();try {
//省略部分代码
ProxyTopicRouteData proxyTopicRouteData = this.messagingProcessor.getTopicRouteDataForProxy(ctx, addressList, topicName);
List<MessageQueue> messageQueueList = new ArrayList<>();
Map<String, Map<Long, Broker>> brokerMap = buildBrokerMap(proxyTopicRouteData.getBrokerDatas());
TopicMessageType topicMessageType = messagingProcessor.getMetadataService().getTopicMessageType(topicName);
for (QueueData queueData : proxyTopicRouteData.getQueueDatas()) {
String brokerName = queueData.getBrokerName();
Map<Long, Broker> brokerIdMap = brokerMap.get(brokerName);
if (brokerIdMap == null) {
break;
}
for (Broker broker : brokerIdMap.values()) {
messageQueueList.addAll(this.genMessageQueueFromQueueData(queueData, request.getTopic(), topicMessageType, broker));
}
}
QueryRouteResponse response = QueryRouteResponse.newBuilder().setStatus(ResponseBuilder.getInstance().buildStatus(Code.OK, Code.OK.name())).addAllMessageQueues(messageQueueList).build();
future.complete(response);
} catch (Throwable t) {
future.completeExceptionally(t);
}
return future;
}
Proxy 适配多种协议,比如 HTTP、gRPC、remoting 等,不同协议的客户端跟 Proxy 建立连接后,Proxy 统一使用 remoting 协议跟 Broker、NameServer 进行通信。
8.3.2 流量控制
客户端所有的请求都要经过 Proxy,Proxy 将流量分发到 Broker。这样在 Proxy 可以进行流量控制和流量治理。
8.3.3 POP 模式
我们知道,PUSH 消费模式下,Broker 中的每个 MessageQueue 只能被同一个 Consumer Group 中的一个消费者消费,如下图:
PUSH 模式存在下面几个问题:
- 消费者最大数量只能等于 MessageQueue 的数量,消费者数量等于 MessageQueue 的数量后,再增加消费者,也不能提高消费能力了;
- 客户端的处理逻辑比较多,比如负载均衡、offset 管理、消费失败后的处理(比如失败消息发送回 Broker);
- 如果一个消费者机器故障,比如上图中 Consumer0 这个消费者 hang 住了,Topic1 下的两个 MessageQueue 就不能被消费了,导致消息积压,最终只能是重启或下线 Consumer0,Consumer 做重平衡;
- 客户端很重,如果要用其他语言编写,工作量很大。
基于 PUSH 模式的不足,RocketMQ 5.0 引入了 POP 消费模式,如下图:
跟 PUSH 模式消费者相比,POP 模式客户端有如下优势:
- POP 模式消费者可以拉取所有的 MessageQueue,这样即使某个消费者 hang 住,也不会影响某一个 MessageQueue 的消费;
- POP 模式消费者不再会重平衡,因为每个消费者默认会去所有的 MessageQueue 拉取消息;
- 因为消费者可以拉取所有的 MessageQueue 消息,所以,增加消费者数量,是可以提高消费能力的;
- 消费者减少了很多逻辑,变得户端轻量化了,可以方便多语言实现;
- 消费者不再维护 offset(offset 由 Broker 维护),变成了无状态组件。
**注意:消费者请求 Proxy 时,POP 模式和 PUSH 模式都可以使用,而 Proxy 请求 Broker 时,使用的是 POP 模式,这样可以避免上面提到的一系列问题。**如下图:
8.3.4 gRPC
Proxy 基于 gRPC 的标准性、兼容性和多语言传输层代码生成能力,可以轻松构建多语言的轻量级客户端。
8.4 Proxy部署方式
根据不同的场景,Proxy 有两种部署方式,LOCAL 模式和 CLUSTER 模式。
8.4.1 LOCAL 模式
RocketMQ 4.x 版本 Client 和 Broker 直接通信,RocketMQ 5.0 引入 Proxy 后,Client 和 Broker 之间的通信多了一道网络,也增加了一次序列化和反序列化的过程,这势必增加了延迟,对于延迟敏感的场景可能不能接受。RocketMQ 5.0 引入了 LOCAL 模式部署 Proxy,如下图:
Proxy 仍然可以适配多种语言的客户端,而且 Proxy 和 Broker 部署在一起,通信方式使用进程内通信,这样可以减少因为多一道网络带来的延迟,提高吞吐量。同时运维也变得简单,运维成本降低。
LOCAL 模式有一个缺点,因为 Proxy 部署在 Broker 端,受网络环境的限制,对于多网络接入的情况并不友好,成本高。
8.4.2 CLUSTER 模式
CLUSTER 模式主要用于对延迟不敏感的场景,Proxy 独立部署,在 Proxy 层适配多网络的接入,同时 Proxy 和 Broker 可以独立扩容,互不影响。如下图:
8.4.3 总结
LOCAL 模式更适合对延迟敏感、期望运维成本低、网络接入类型单一的场景。
CLUSTER 模式更适合对延迟要求低、网络接入类型多样的场景。
8.5 集群部署方式
RocketMQ的部署方式有多种:
- 2m-noslave: 多Master模式,无Slave。[双主模式]
- 2m-2s-sync: 多Master多Slave模式,同步双写 [双主双从+同步模式]
- 2m-2s-async:多Master多Slave模式,异步复制 [双主双从+异步模式]
1)同步复制
同步复制方式是等Master和Slave均写 成功后才反馈给客户端写成功状态;
在同步复制方式下,如果Master出故障,Slave上有全部的备份数据,容易恢复,但是同步复制会增大数据写入延迟,降低系统吞吐量。
2)异步复制
异步复制方式是只要Master写成功 即可反馈给客户端写成功状态。
在异步复制方式下,系统拥有较低的延迟和较高的吞吐量,但是如果Master出了故障,有些数据因为没有被写 入Slave,有可能会丢失;
3)配置
同步复制和异步复制是通过Broker配置文件里的brokerRole参数进行设置的,这个参数可以被设置成ASYNC_MASTER、 SYNC_MASTER、SLAVE三个值中的一个。
4)同步刷盘
消息提交到文件内存映射后,将等待同步调用MappedByteBuffer的force()方法写入磁盘后返回给生产者;
5)异步刷盘
消息提交到文件内存映射后,立刻返回给生产者。如下图所示,两种刷盘方式对比
设置刷盘方式和主从复制方式, 尤其是SYNC_FLUSH方式,由于频繁地触发磁盘写动作,会明显降低性能。通常情况下,应该把Master和Save配置成ASYNC_FLUSH的刷盘 方式,主从之间配置成SYNC_MASTER的复制方式,这样即使有一台机器出故障,仍然能保证数不丢,是个不错的选择
/opt/rocket/conf/broker.conf 文件:Broker的配置文件
8.5.1.同步刷盘示意图
8.5.2. 异步刷盘未开启堆外缓存示意图
8.5.3.异步刷盘开启堆外缓存示意图
参考:https://blog.youkuaiyun.com/ko0491/article/details/109763880、https://blog.youkuaiyun.com/gaoliang1719/article/details/106566901