图解RocketMQ之保姆级部署指南
大家好,我是苍何。
但凡是亲自部署过 RocketMQ 的小伙伴估计都跟我有一样的感受,岂是一个坑字了得。
RocketMQ 的迭代不算快,但出乎意料的是不同的版本之间部署的方式又不大一样,你去上网查吧,大部分教程也没标注使用的是哪个版本。
作为技术博主,我对教程是有着强烈洁癖的,我认为一切不标注时效的教程都不是好教程。
正如你所看到的,我正写的保姆级部署教程是基于的 5.1.0 这个版本,来自未来的读者,我希望你在实践之前能和我的版本保持一致。
当然如果你是来自未来 2 年的读者,大概率请你不要参照我的教程,但其思想是可以长存的,不会随着时间的流逝而变成没有用的屁。
因大部分时候,我们学习环境都会搭建在本地环境,所以这其实更多是一篇单机版的部署教程,至于集群版本,我会再单独写一篇,毕竟更复杂嘛。
因 RocketMQ 天生的分布式组件,苍何建议大家都用 Docker 或者 Docker-Compose 部署,出问题了重建搞个镜像还很快。
由于我的电脑是 M 1 芯片,有一些个别的命令如果是 windows 需要调整下。
Docker 方式
通过 Docker 的方式简单高效,可以快速部署一个单节点单副本的 RocketMQ 服务。
拉取 RocketMQ 镜像
我拉取的是 dockerhub 上 RocketMQ 的镜像版本 5.1.0,请尽量保持版本和我的一致,否则会有意想不到的事情发生。
docker pull apache/rocketmq:5.1.0
拉取成功后,可以看下本地镜像列表是否已有啦:
创建容器共享网络
为什么要创建 docker 共享网络?
- 容器间通信:创建一个 Docker 网络可以确保同一个网络中的容器可以通过容器名称进行通信,而不需要知道对方的 IP 地址。这对于需要相互通信的服务非常重要,比如 RocketMQ 的多个组件(如 NameServer 和 Broker)。
- 隔离性和安全性:Docker 网络提供了一个隔离的网络环境,不同网络中的容器彼此隔离。这增加了安全性,防止外部或其他不相关的容器访问敏感服务。
- 简化配置:使用 Docker 网络,配置变得更加简单。容器可以通过名称互相访问,无需担心容器重启后 IP 地址发生变化。
对于像 RocketMQ 这样的分布式系统,它包含多个服务(NameServer、Broker、Producer、Consumer 等),这些服务需要互相通信。创建一个共享网络使得这些服务可以轻松发现和通信。
创建容器共享网络命令:
docker network create rocketmq
启动 NameServer
# 启动NameServer(windows)
docker run -d --name pmnamesrv -p 9876:9876 --net rocketmq apache/rocketmq:5.1.0 sh mqnamesrv
# MAC,需要指定平台
docker run --platform linux/amd64 -d --name pmnamesrv -p 9876:9876 --net rocketmq apache/rocketmq:5.1.0 sh mqnamesrv
# 验证NameServer是否启动成功
docker logs -f pmnamesrv
我们可以看到 'The Name Server boot success..', 表示NameServer 已成功启动。
启动 Broker+proxy
NameServer成功启动后,我们启动Broker 和 proxy。5.0+版本以上需要启动代理组件。
先配置 Broker 的 IP 地址(需要自己 查 IP 地址):
# 配置 Broker 的 IP 地址
echo "brokerIP1=192.168.200.47" >broker.conf
这样会在你的终端所在目录下生成 broker.conf 配置文件,里面只有一串内网络配置的内容。(注意这里 127.0.0.1 要修改为共享网络 pmbroker )
当然了,也可以添加一些默认配置进去:
brokerClusterName = DefaultCluster
brokerName = broker
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 你的本机ip, 注意不要写localhost,127.0.0.1等,因为这是放到docker容器中的,我们需要指向mac本机
brokerIP1 = 192.168.200.47
# 禁用 tsl
tlsTestModeEnable = false
复制 broker.conf 所在路径并填入启动程序中:
启动 Broker 和 Proxy:
如果不是 MAC ,去掉--platform linux/amd64
# 启动 Broker 和 Proxy
docker run --platform linux/amd64 -d \
--name pmbroker \
--network rocketmq \
-p 10912:10912 -p 10911:10911 -p 10909:10909 \
-p 8080:8080 -p 8081:8081 \
-e "NAMESRV_ADDR=pmnamesrv:9876" \
-v /Users/canghe/tools/rocketmq/broker.conf:/home/rocketmq/rocketmq-5.1.0/conf/broker.conf \
-v /Users/canghe/tools/rocketmq/data:/home/rocketmq/store \
apache/rocketmq:5.1.0 sh mqbroker --enable-proxy \
-c /home/rocketmq/rocketmq-5.1.0/conf/broker.conf
# 验证 Broker 是否启动成功
docker exec -it pmbroker bash -c "tail -n 10 /home/rocketmq/logs/rocketmqlogs/proxy.log"
下面是启动具体的解释,需要根据自身情况做简单的修改哦:
# 启动一个 Docker 容器,并在后台运行
docker run -d \
# 容器名称为 rmqbroker
--name rmqbroker \
# 使用名为 rocketmq 的 Docker 网络
--network rocketmq \
# 映射容器的端口到主机的端口
# 10912:10912 - RocketMQ 内部通信端口
# 10911:10911 - RocketMQ 内部通信端口
# 10909:10909 - RocketMQ 内部通信端口
# 8080:8080 - RocketMQ 控制台端口
# 8081:8081 - RocketMQ 控制台端口
-p 10912:10912 -p 10911:10911 -p 10909:10909 \
-p 8080:8080 -p 8081:8081 \
# 设置环境变量 NAMESRV_ADDR,指定 NameServer 的地址
-e "NAMESRV_ADDR=rmqnamesrv:9876" \
# 将主机上的 broker.conf 文件挂载到容器内的指定路径
-v ./broker.conf:/home/rocketmq/rocketmq-5.2.0/conf/broker.conf \
# 数据持久化,防止重启容器数据丢失
-v /Users/canghe/tools/rocketmq/data:/home/rocketmq/store \
# 使用 RocketMQ 5.2.0 镜像
apache/rocketmq:5.2.0 \
# 在容器内执行 mqbroker 命令,并启用代理功能
sh mqbroker --enable-proxy \
# 指定 Broker 的配置文件路径
-c /home/rocketmq/rocketmq-5.2.0/conf/broker.conf
搭建可视化控制台
前面 NameServer 和 Broker 搭建完成之后,就可以用来收发消息了,但是为了更加直观,可以搭建对应的服务控制台。在页面上直观看数据。
这里我直接选用 docker 方式安装 dashboard 控制台。
# 拉取镜像
docker pull apacherocketmq/rocketmq-dashboard:latest
# 启动容器
docker run -d --name rocketmq-dashboard --net rocketmq -e "JAVA_OPTS=-Drocketmq.namesrv.addr=pmnamesrv:9876" -p 8081:8080 -t apacherocketmq/rocketmq-dashboard:latest
# 启动容器,mac芯片
docker run --platform linux/amd64 -d --name rocketmq-dashboard --net rocketmq -e "JAVA_OPTS=-Drocketmq.namesrv.addr=pmnamesrv:9876" -p 8082:8080 -t apacherocketmq/rocketmq-dashboard:latest
# 启动容器,mac芯片
docker run --platform linux/amd64 -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=127.0.0.1:9876" -p 8082:8080 -t apacherocketmq/rocketmq-dashboard:latest
谷歌浏览器访问控制台:http://localhost:8082/
提示:大概要等几分钟控制台才有页面出现!
至此,Rocketmq 的安装启动就完成啦,比较麻烦,很吃版本,所以咱们一定要亲自动手操作才行哦。
Docker-compose 方式
妈呀,Docker-compose 又是个啥子?别害怕,如果你有仔细看过我们的教程的话应该不会陌生,这玩意无非就是能够编排容器,也就是说像我们上一步的 docker 启动多个容器,还是有顺序的,用 Docker-compose 就再适合不过了。
来吧,教程奉上,就三步哦,贼简单:
新建响应目录
电脑找个空的地方新建个文件夹,就叫 rocketmq 吧
然后新建 broker 目录,里面建 broker.conf,用来存放 broker 挂载配置,配置如下:
brokerClusterName = DefaultCluster
brokerName = broker
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 你的本机ip, 注意不要写localhost,127.0.0.1等,因为这是放到docker容器中的,我们需要指向mac本机
brokerIP1 = 192.168.200.47
# 禁用 tsl
tlsTestModeEnable = false
之后在rocketmq 新建 data 文件夹,用来存放持久化数据,防止容器重启数据丢失。
新建 docker-compose 文件夹,里面新建文件 docker-compose.yml 文件。目录结构如下:
新建docker-compose.yml
这个就是 docker-compose 最重要的启动文件了,复制以下配置,具体目录修改为自己对应的目录即可,够简单吧,哈哈,这个地方其实苍何遇到 了不少坑,主要是 rocketmq 的官网太辣鸡了,社区也文档也不够多,需要自己琢磨的。
version: '3.8'
services:
namesrv:
image: apache/rocketmq:5.1.0
container_name: rocketmq-pmnamesrv
command: sh mqnamesrv
networks:
- rocketmq
ports:
- "9876:9876"
broker:
image: apache/rocketmq:5.1.0
container_name: rocketmq-pmbroker
command: sh mqbroker -n namesrv:9876 -c /home/rocketmq/rocketmq-5.1.0/conf/broker.conf
ports:
- "10911:10911"
- "10909:10909"
- "10912:10912"
depends_on:
- namesrv
networks:
- rocketmq
volumes:
- /Users/canghe/tools/rocketmq/broker/broker.conf:/home/rocketmq/rocketmq-5.1.0/conf/broker.conf
- /Users/canghe/tools/rocketmq/data:/home/rocketmq/store
proxy:
image: apache/rocketmq:5.1.0
container_name: rocketmq-pmproxy
networks:
- rocketmq
depends_on:
- broker
- namesrv
ports:
- 8080:8080
- 8081:8081
restart: on-failure
environment:
- NAMESRV_ADDR=rocketmq-pmnamesrv:9876
command: sh mqproxy
dashboard:
image: apacherocketmq/rocketmq-dashboard:latest
container_name: rocketmq-dashboard
environment:
- JAVA_OPTS=-Drocketmq.namesrv.addr=rocketmq-pmnamesrv:9876
ports:
- "8082:8080"
networks:
- rocketmq
depends_on:
- namesrv
- broker
- proxy
networks:
rocketmq:
driver: bridge
一键启动
以下几个命令就可以手到擒来了:
# 一键启动
docker-compose up -d
# 一键停止所有容器
docker-compose stop
# 一键删除所有容器
docker-compose rm
# 一键查看所有启动的容器
docker-compose ps
如果一切都没问题,你可以看到如下信息:
这个时候你只需要小手打开下浏览器,输入;http://localhost:8082/
就可以看到如下界面啦:
好啦,有关 RocketMQ 的本地保姆级部署教程就到这里啦,有疑惑和问题欢迎大家留言讨论。
我是苍何,这是图解 RocketMQ 教程的第 12 篇,我们下篇见~
转载自:https://juejin.cn/post/7400732103154221082