Apache RocketMQ 5.0 版本完成基本消息收发,包括 NameServer、Broker、Proxy 组件。
- NameServer:作为名称服务器,负责管理消息队列和消费者组信息,提供服务注册与发现功能。Broker启动时会向 NameServer 注册自身信息(IP、端口、Topic路由配置等),并周期性发送心跳包维持存活状态。NameServer维护Broker的实时状态表,供客户端拉取路由信息;
- Broker:作为消息代理服务器,承担消息的接收、处理和存储任务。单个Broker支持多Topic消息的收发,支持负载均衡和容错机制;
- Proxy:负责扩展Broker的性能和容量,支持将消息路由到多个Broker实现负载均衡。同时提供队列管理、消费者管理、配置管理等接口供客户端使用。
在 5.0 版本中 Proxy 和 Broker 可以分为 Local 模式和 Cluster 模式,一般情况下如果没有特殊需求,或者遵循从早期版本平滑升级的思路,可以选用Local模式。
- 在 Local 模式下,Broker 和 Proxy 是同进程部署,只是在原有 Broker 的配置基础上新增 Proxy 的简易配置就可以运行。
- 在 Cluster 模式下,Broker 和 Proxy 分别部署,即在原有的集群基础上,额外再部署 Proxy 即可。
这里采用 Local 模式进行部署,即Broker 和 Proxy 同进程部署,过程如下:
一、安装JDK
这里使用的 jdk 版本为1.8.0_291,安装包请自行下载,也可直接安装 jdk17,方便后续 RocketMQ Dashboard 的编译安装。
#解压
tar -xf jdk-8u291-linux-x64.tar.gz -C /usr/local/
#配置环境变量
vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk1.8.0_291
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=${JAVA_HOME}/bin:$PATH
#使用环境变量生效
source /etc/profile.d/jdk.sh
#查看版本
java -version
二、下载RocketMQ安装包并解压
#下载安装包
wget https://dist.apache.org/repos/dist/release/rocketmq/5.3.3/rocketmq-all-5.3.3-bin-release.zip
#解压
unzip rocketmq-all-5.3.3-bin-release.zip -d /app/
#重命名
mv /app/rocketmq-all-5.3.3-bin-release /app/rocketmq
三、启动 NameServer
(1) 创建service启动文件
vim /etc/systemd/system/mqnamesrv.service
[Unit]
Description=RocketMQ Nameserver
After=network.target
[Service]
Type=simple
Environment=PATH=/usr/local/jdk1.8.0_291/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=JAVA_OPT_EXT=-Duser.home=/app/rocketmq
ExecStart=/app/rocketmq/bin/mqnamesrv
ExecStop=/app/rocketmq/bin/mqshutdown namesrv
Restart=on-failure
RestartSec=30s
[Install]
WantedBy=multi-user.target
说明:
- Type 一定要使用simple,使用 forking 会启动失败;
- Environment 中设置 PATH 环境变量,并加入jdk的路径,使用 JAVA_HOME 环境是没用的,因为启动脚本里是使用 which javac 获取jdk路径的;
- JAVA_OPT_EXT 是增加启动服务时额外的参数配置,
-Duser.home=/app/rocketmq是为了覆盖rocketmq的环境变量${usre.home} (当前用户的家目录),控制日志的输出路径,默认是${user.home}/logs/rocketmqlogs/ ,也可以通过修改 conf 文件夹下的 xx.logback.xml 文件来进行修改,但改的地方有点多。
(2) 启动 NameServer 服务
#加载配置文件
systemctl daemon-reload
#启动
systemctl start mqnamesrv
#设置开机自启
systemctl enable mqnamesrv
四、启动 Broker + Proxy
(1) 修改配置文件
vim /app/rocketmq/conf/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
#增加以下三行
storePathRootDir = /app/rocketmq/store
storePathCommitLog = /app/rocketmq/store/commitlog
storePathConsumerQueue = /app/rocketmq/store/consumequeue
Broker 常用配置:参考 官方文档
| 参数名 | 默认值 | 说明 |
|---|---|---|
| listenPort | 10911 | 接受客户端连接的监听端口 |
| namesrvAddr | null | nameServer 地址 |
| brokerIP1 | 网卡的 InetAddress | 当前 broker 监听的 IP |
| brokerIP2 | 跟 brokerIP1 一样 | 存在主从 broker 时,如果在 broker 主节点上配置了 brokerIP2 属性,broker 从节点会连接主节点配置的 brokerIP2 进行同步 |
| brokerName | null | broker 的名称 |
| brokerClusterName | DefaultCluster | 本 broker 所属的 Cluster 名称 |
| brokerId | 0 | broker id, 0 表示 master, 其他的正整数表示 slave |
| storePathCommitLog | $HOME/store/commitlog/ | 存储 commit log 的路径 |
| storePathConsumerQueue | $HOME/store/consumequeue/ | 存储 consume queue 的路径 |
| mappedFileSizeCommitLog | 1024 * 1024 * 1024(1G) | commit log 的映射文件大小 |
| deleteWhen | 04 | 在每天的什么时间删除已经超过文件保留时间的 commit log |
| fileReservedTime | 72 | 以小时计算的文件保留时间 |
| brokerRole | ASYNC_MASTER | SYNC_MASTER/ASYNC_MASTER/SLAVE |
| flushDiskType | ASYNC_FLUSH | SYNC_FLUSH/ASYNC_FLUSH SYNC_FLUSH 模式下的 broker 保证在收到确认生产者之前将消息刷盘。ASYNC_FLUSH 模式下的 broker 则利用刷盘一组消息的模式,可以取得更好的性能。 |
(2) 创建service启动文件
vim /etc/systemd/system/mqbroker.service
[Unit]
Description=RocketMQ Broker And Proxy
After=network.target
[Service]
Type=simple
Environment=PATH=/usr/local/jdk1.8.0_291/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=JAVA_OPT_EXT=-Duser.home=/app/rocketmq
ExecStart=/app/rocketmq/bin/mqbroker -n localhost:9876 -c /app/rocketmq/conf/broker.conf --enable-proxy
ExecStop=/app/rocketmq/bin/mqshutdown broker
Restart=on-failure
RestartSec=30s
[Install]
WantedBy=multi-user.target
说明:
Type、PATH 和 JAVA_OPT_EXT 同 nameserver 的说明;
ExecStart 中 -n 后接的是 nameserver 的连接地址,-c 指定的是 broker 的配置文件路径,–enable-proxy 是指启动proxy,即 broker 和 proxy 同进程部署;
proxy 默认读取的配置文件为 conf/rmq-proxy.json,如果 ExecStart 中不想加
-n localhost:9876,则同时需要在 broker.conf 和 rmq-proxy.json 文件中配置 nameserver 的连接地址,配置项为namesrvAddr;proxy 默认占用的端口为 8080 和 8081,对应配置为
remotingListenPort和grpcServerPort,如需要修改端口,在配置文件中增加这两下配置即可;如下所示:{
“rocketMQClusterName”: “DefaultCluster”,
“grpcServerPort”: 7081,
“remotingListenPort”: 7080
}
(3) 启动 broker + proxy 服务
#加载配置文件
systemctl daemon-reload
#启动
systemctl start mqbroker
#设置开机自启
systemctl enable mqbroker
五、RocketMQ Dashboard部署
5.1、docker方式部署
(1) 下载镜像
docker pull apacherocketmq/rocketmq-dashboard:latest
(2) 运行容器
docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=127.0.0.1:9876" -p 8082:8082 -t apacherocketmq/rocketmq-dashboard:latest
127.0.0.1:9876替换成rocketmq中配置的 nameserver 地址:端口号;镜像的端口号为 8082,官方文档里写的 8080,启动后访问不到,有点坑。
当前 docker 版本为19.03.15,执行以上命令后容器启动不了,查看日志报错:
Failed to start thread "GC Thread#0" - pthread_create failed (EPERM) for attributes: stacksize: 1024k, guardsize: 4k, detached.解决办法:
- 启动选项加上
--privileged=true后,启动正常。- 或启动选项使用
--security-opt seccomp=unconfined也可以正常启动。- 将 Docker 升级到 20.10.8 以上的版本。
(3) Dashboard 访问
使用浏览器输入 http://<服务器IP>:8082 ,即可打开页面。
5.2、源码编译部署
(1) 先决条件
- 64bit OS, Linux/Unix/Mac is recommended;
- 64bit JDK 17;
- Maven 3.2.x;
这里使用的构建环境:系统 CentOS 8.5.2111,jdk-17.0.12(jdk-17.0.12_linux-x64_bin.tar.gz), Maven 3.5.4(yum install maven安装)
(2) 安装jdk-17.0.12
#解压
tar -xf jdk-17.0.12_linux-x64_bin.tar.gz -C /usr/local/
#配置环境变量
vim /etc/profile.d/jdk.sh
export JAVA_HOME=/usr/local/jdk-17.0.12
export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
export PATH=${JAVA_HOME}/bin:$PATH
#使用环境变量生效
source /etc/profile.d/jdk.sh
#查看版本
java -version
(3) 下载源码
#项目地址
https://github.com/apache/rocketmq-dashboard
#进入项目地址后,下载zip源码压缩包
https://github.com/apache/rocketmq-dashboard/archive/refs/heads/master.zip
#解压安装包
unzip rocketmq-dashboard-master.zip
#进入源码目录
cd rocketmq-dashboard-master
(4) 修改配置(选做)
#源码目录下的src/main/resources/application.yml文件可以修改相关选项的配置
#1.修改nameserver地址,默认为127.0.0.1:9876,如只是用于本机也可以不用改
rocketmq.config.namesrvAddrs=127.0.0.1:9876
#2.修改数据保存目录,默认为/tmp/rocketmq-console/data
rocketmq.config.dataPath=${user.home}/dashboard/data
#3.开启页面登录,默认为false
rocketmq.config.loginRequired=true
1、登录校验
开启登录功能(rocketmq.config.loginRequired=true)时,确保 rocketmq.config.dataPath 定义的目录存在,并且该目录下创建登录配置文件"users.properties", 如果该目录下不存在此文件,则默认使用 resources/users.properties 文件。
users.properties文件格式为:
# 该文件支持热修改,即添加和修改用户时,不需要重新启动console # 格式, 每行定义一个用户, username=password[,N] #N是可选项,可以为0 (普通用户); 1 (管理员) #定义管理员 admin=admin,1 #定义普通用户 user1=user1 user2=user22、权限较验
如果开启了登录功能,会按照登录的角色对访问的接口进行权限控制,确保rocketmq.config.dataPath定义的目录存在,并且该目录下创建访问权限配置文件"role-permission.yml",如果该目录下不存在此文件,则默认使用 resources/role-permission.yml 文件。
role-permission.yml文件格式:
# 该文件支持热修改,即添加和修改用户时,不需要重新启动console # 格式,如果增加和删除接口权限,直接在列表中增加和删除接口地址即可。 # 接口路径配置支持通配符 # * 表示匹配0或多个不是/的字符 # ** 表示匹配0或多个任意字符 # ? 表示匹配1个任意字符 rolePerms: # 普通用户 Normal: - /rocketmq/nsaddr - /ops/* - /dashboard/** - /topic/*.query - /topic/sendTopicMessage.do - /producer/*.query - /message/* - /messageTrace/* - /monitor/* ....
(5) Maven构建
#构建
mvn clean package -Dmaven.test.skip=true
#构建完成后将 jar 包复制到 /app/rocketmq/dashboard/ 目录
mkdir /app/rocketmq/dashboard/
cp target/rocketmq-dashboard-2.1.1-SNAPSHOT.jar /app/rocketmq/dashboard/
alimaven aliyun maven http://maven.aliyun.com/nexus/content/groups/public/ central
构建生成的jar包时默认连接的 namserver 地址为:127.0.0.1:9876,在构建前可以通过修改源码目录下
src/main/resources/application.properties文件中的rocketmq.config.namesrvAddr=配置;如果构建时下载包的速度很慢,可以更改maven的镜像(maven’s settings.xml)
(6) 创建数据目录及权限相关文件(选做,结合第4步)
#创建数据目录
mkdir /app/rocketmq/dashboard/data
#创建用户文件,并添加管理员用户
vim /app/rocketmq/dashboard/data/users.properties
admin=Admin@123,1 #定义管理员账号与密码
#创建权限较验文件,该文件针对的是普通用户的,如果没创建普通用户,可不创建
#此处复制的 resources/role-permission.yml 文件的内容
vim /app/rocketmq/dashboard/data/role-permission.yml
rolePerms:
Normal:
- /rocketmq/*.query
- /ops/*.query
- /dashboard/*.query
- /topic/*.query
- /topic/sendTopicMessage.do
- /topic/list.queryTopicType
- /producer/*.query
- /message/*.query
- /messageTrace/*.query
- /monitor/*.query
- /consumer/*.query
- /cluster/*.query
- /dlqMessage/*.query
- /dlqMessage/exportDlqMessage.do
- /dlqMessage/batchResendDlqMessage.do
- /acl/*.query
注意:虽然说这两个文件支持热加载,但如果启动 dashboard 服务之前,没有提前创建好,默认还是读取 jar 包中默认的两个文件,也就是构建前 src/main/resources/ 目录下的 users.properties 和 role-permission.yml 文件,所以启动服务后再创建这两个文件是没效果的,需要再重启一下服务,建议启动前创建好。
(7) 创建service启动文件
vim /etc/systemd/system/mqdashboard.service
[Unit]
Description=RocketMQ Dashboard
After=network.target
[Service]
Type=simple
Environment="JAVA_OPT=-Duser.home=/app/rocketmq -Xms2g -Xmx2g"
ExecStart=/usr/local/jdk-17.0.12/bin/java $JAVA_OPT -jar /app/rocketmq/dashboard/rocketmq-dashboard-2.1.1-SNAPSHOT.jar
Restart=on-failure
RestartSec=30
[Install]
WantedBy=multi-user.target
user.home 参数变量用于控制日志的输出路径,默认为 ${user.home}/logs/dashboardlogs;
注意 ExecStart 中的 $JAVA_OPT 不能写成 ${JAVA_OPT},原因如下:
使用
${JAVA_OPT}时,systemd 可能会将变量值整体视为一个参数(例如-Xms2g -Xmx2g ...被当成一个完整的字符串传递给 Java),导致 JVM 无法解析多个参数而启动报错;使用
$JAVA_OPT时,变量值会被正确拆分为多个独立参数(-Xms2g、-Xmx2g、-Duser.home=...),符合 JVM 的参数解析要求。
(8) 启动 Dashboard 服务
#加载配置文件
systemctl daemon-reload
#启动
systemctl start mqdashboard
#设置开机自启
systemctl enable mqdashboard
(9) Dashboard 访问
使用浏览器输入 http://<服务器IP>:8082 ,即可打开页面。
RocketMQ5.3单机部署指南
519

被折叠的 条评论
为什么被折叠?



