基于 systemd 管理的 RocketMQ5.3 单机版部署

RocketMQ5.3单机部署指南

​ 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 常用配置:参考 官方文档

参数名默认值说明
listenPort10911接受客户端连接的监听端口
namesrvAddrnullnameServer 地址
brokerIP1网卡的 InetAddress当前 broker 监听的 IP
brokerIP2跟 brokerIP1 一样存在主从 broker 时,如果在 broker 主节点上配置了 brokerIP2 属性,broker 从节点会连接主节点配置的 brokerIP2 进行同步
brokerNamenullbroker 的名称
brokerClusterNameDefaultCluster本 broker 所属的 Cluster 名称
brokerId0broker id, 0 表示 master, 其他的正整数表示 slave
storePathCommitLog$HOME/store/commitlog/存储 commit log 的路径
storePathConsumerQueue$HOME/store/consumequeue/存储 consume queue 的路径
mappedFileSizeCommitLog1024 * 1024 * 1024(1G)commit log 的映射文件大小
deleteWhen04在每天的什么时间删除已经超过文件保留时间的 commit log
fileReservedTime72以小时计算的文件保留时间
brokerRoleASYNC_MASTERSYNC_MASTER/ASYNC_MASTER/SLAVE
flushDiskTypeASYNC_FLUSHSYNC_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.confrmq-proxy.json 文件中配置 nameserver 的连接地址,配置项为 namesrvAddr

  • proxy 默认占用的端口为 8080 和 8081,对应配置为remotingListenPortgrpcServerPort,如需要修改端口,在配置文件中增加这两下配置即可;如下所示:

    {
    “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.

    解决办法:

    1. 启动选项加上 --privileged=true 后,启动正常。
    2. 或启动选项使用 --security-opt seccomp=unconfined 也可以正常启动。
    3. 将 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=user2

2、权限较验

如果开启了登录功能,会按照登录的角色对访问的接口进行权限控制,确保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/
  • 构建生成的jar包时默认连接的 namserver 地址为:127.0.0.1:9876,在构建前可以通过修改源码目录下 src/main/resources/application.properties 文件中的 rocketmq.config.namesrvAddr= 配置;

  • 如果构建时下载包的速度很慢,可以更改maven的镜像(maven’s settings.xml)

alimaven aliyun maven http://maven.aliyun.com/nexus/content/groups/public/ central

(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 ,即可打开页面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值