Docker搭建RocketMQ
Docker搭建RocketMQ
操作系统:
CentOS 7 x64
版本号:
CentOS Linux release 7.9.2009 (Core)
IP地址:
192.168.157.130
Docker 信息:
Client: Docker Engine - Community Version: 24.0.7 API version: 1.43 Go version: go1.20.10 Git commit: afdd53b Built: Thu Oct 26 09:11:35 2023 OS/Arch: linux/amd64 Context: default Server: Docker Engine - Community Engine: Version: 24.0.7 API version: 1.43 (minimum version 1.12) Go version: go1.20.10 Git commit: 311b9ff Built: Thu Oct 26 09:10:36 2023 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.6.24 GitCommit: 61f9fd88f79f081d64d6fa3bb1a0dc71ec870523 runc: Version: 1.1.9 GitCommit: v1.1.9-0-gccaecfc docker-init: Version: 0.19.0 GitCommit: de40ad0
1.准备工作
-
先准备配置目录和持久化目录,举个栗子:
# 创建 RocketMQ 的 NameServer 和 Broker 配置及持久化目录 mkdir -p /opt/module/rocketmq/namesrv/logs mkdir -p /opt/module/rocketmq/broker-master/{conf,logs,store}
-
设置目录权限,避免容器内无法写入日志文件:
# 777 文件所属者、文件所属组和其他人有读取 & 写入 & 执行全部权限。rwxrwxrwx chmod 777 -R /opt/module/rocketmq
2.创建容器共享网络
RocketMQ 中有多个服务,需要创建多个容器,创建 docker 网络便于容器间相互通信。
#Docker创建网络
#docker network create <network_name>
docker network create rocketmq-network
3.拉取官方RocketMQ镜像
# 拉取指定版本的 RocketMQ 镜像
docker pull apache/rocketmq:4.9.6
docker pull apache/rocketmq:5.3.1
# 拉取 RocketMQ Dashboard 镜像
docker pull apacherocketmq/rocketmq-dashboard:latest
# 拉取最新版 RocketMQ 镜像
docker pull apache/rocketmq
4.创建配置文件
这个是生产环境配置文件
进入 /opt/module/rocketmq/broker-master/conf
目录,创建并编辑 broker.conf
配置文件:
cd /opt/module/rocketmq/broker-master/conf
touch broker.conf
vim broker.conf
broker.conf
配置内容:
# 所属集群名称,如果节点较多可以配置多个
brokerClusterName = DefaultCluster
# broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-master
# 0表示Master,大于0表示不同的slave
brokerId = 0
# 表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
# 在磁盘上保留消息的时长,单位是小时
fileReservedTime = 72
# 有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
# 刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH
# 设置broker节点所在服务器的ip地址(这个非常重要,主从模式下,从节点会根据主节点的brokerIP2来同步数据,如果不配置,主从无法同步,brokerIP1设置为自己外网能访问的ip,服务器双网卡情况下必须配置,比如阿里云这种,主节点需要配置ip1和ip2,从节点只需要配置ip1即可)
# 此ip由使用环境决定 本机使用 127 局域网使用 192 外网使用 外网ip
# 设置broker节点所在服务器的ip地址(公网IP),linux系统下,使用ifconfig 查一下你的主机ip,win系统下,用ipconfig查一下你的主机ip
brokerIP1 = 192.168.157.130
# nameServer地址,分号分割
#namesrvAddr = 127.0.0.1:9876
# Broker 对外服务的监听端口,
listenPort = 10911
# 是否允许Broker自动创建Topic ( 建议线下开启,线上关闭 !!! )
autoCreateTopicEnable = true
# 是否允许 Broker 自动创建订阅组 ( 建议线下开启,线上关闭 !!! )
autoCreateSubscriptionGroup = true
# linux开启epoll
useEpollNativeSelector = true
# 补充
# 磁盘使用达到95%之后,生产者再写入消息会报错 CODE: 14 DESC: service not available now, maybe disk full diskMaxUsedSpaceRatio=95
#diskMaxUsedSpaceRatio = 95
设置文件权限,确保 RocketMQ 容器可以访问配置和存储目录:
# 设置目录权限 chmod -R 777 /opt/module/rocketmq
5.启动NameServer
启动 NameServer 容器:
docker run -d \
-p 9876:9876 \
-v /opt/module/rocketmq/namesrv/logs:/home/rocketmq/logs \
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn256M" \
-e "MAX_POSSIBLE_HEAP=100000000" \
--name rmqnamesrv \
--net rocketmq-network \
--restart=always \
apache/rocketmq:4.9.6 sh mqnamesrv
# 验证NameServer是否启动成功
docker logs -f rmqnamesrv
验证:
如果启动成功,你会看到日志中出现The Name Server boot success..
。
6.启动 Broker
NameServer 启动成功后,再启动 Broker 容器,使用 broker.conf
配置文件。
# 配置 Broker 的 IP 地址【测试环境中使用】
cd /opt/module/rocketmq/broker-master/conf
echo "brokerIP1=192.168.157.130" > broker.conf
# 启动 Broker
docker run -d \
-p 10912:10912 -p 10911:10911 -p 10909:10909 \
-e "JAVA_OPT_EXT=-Xms512M -Xmx512M -Xmn256M" \
-e "NAMESRV_ADDR=rmqnamesrv:9876" \
-v /opt/module/rocketmq/broker-master/conf/broker.conf:/home/rocketmq/rocketmq-4.9.6/conf/broker.conf \
-v /opt/module/rocketmq/broker-master/store:/home/rocketmq/store \
-v /opt/module/rocketmq/broker-master/logs:/home/rocketmq/logs \
--net rocketmq-network \
--name rmqbroker \
--restart=always \
apache/rocketmq:4.9.6 sh mqbroker \
-c /home/rocketmq/rocketmq-4.9.6/conf/broker.conf
# 验证 Broker 是否启动成功
docker logs rmqbroker
验证:
启动成功后,你会看到日志中显示The broker boot success..
。✨备注
至此,一个单节点副本的 RocketMQ 集群已经部署起来了,我们可以利用脚本进行简单的消息收发。
7.启动 RocketMQ Dashboard
RocketMQ Dashboard 用于监控和管理 RocketMQ 集群。
# 拉取 Dashboard 镜像
docker pull apacherocketmq/rocketmq-dashboard:latest
# 启动 Dashboard
docker run -d \
-p 8080:8080 \
-e "JAVA_OPTS=-Drocketmq.namesrv.addr=rmqnamesrv:9876" \
--net rocketmq-network \
--name rocketmq-dashboard \
--restart=always \
-t apacherocketmq/rocketmq-dashboard:latest
8.查看启动日志
查看 NameServer 和 Broker 的日志:
#docker logs [服务id/服务名]
docker logs rmqnamesrv
docker logs rmqbroker
docker logs -f -t --tail 20 rmqnamesrv
docker logs -f -t --tail 20 rmqbroker
9.查看防火墙【开放端口】
# 查询端口是否开放
firewall-cmd --query-port=9876/tcp
firewall-cmd --query-port=10911/tcp
firewall-cmd --permanent --remove-port=19876/tcp
# 开通 9876 (NameServer), 10911 (Broker监听端口), 19876 (备用端口)
firewall-cmd --zone=public --add-port=9876/tcp --permanent
firewall-cmd --zone=public --add-port=10911/tcp --permanent
firewall-cmd --zone=public --add-port=19876/tcp --permanent
# 移除端口
firewall-cmd --permanent --remove-port=9876/tcp
firewall-cmd --permanent --remove-port=10911/tcp
firewall-cmd --permanent --remove-port=19876/tcp
# 重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
# 查看已经开发那些端口
firewall-cmd --list-ports
firewall-cmd --zone=public --list-ports
10.进入RocketMQ容器内部
docker ps # 查看正在运行的容器,并得到 容器id
# 进入容器内部
docker exec -it [容器id] /bin/bash # 中间那个是容器id 就是 CONTAINER_ID
# -it 表示进入
docker exec -it rmqnamesrv bash
docker exec -it rmqnamesrv /bin/bash
docker exec -it rmqbroker bash
docker exec -it rmqbroker /bin/bash
# 使用 命令别名 开启 ll命令
cat <<EOF >> /etc/profile
alias ll='ls -l --color=tty'
alias grep='grep --color=auto'
EOF
source /etc/profile
11.测试生产与消费
进入 Broker 容器并使用 tools.sh
测试消息的生产和消费。
# 进入 Broker 容器
docker exec -it rmqbroker bash
# 测试生产者
sh tools.sh org.apache.rocketmq.example.quickstart.Producer
# 测试消费者
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
12.卸载 RocketMQ
#停止RocketMQ服务(也可以停止其他)
#docker stop [容器id/容器名]
docker stop rmqnamesrv
docker stop rmqbroker
docker stop rocketmq-dashboard
#删除RocketMQ服务(也可以删除其他)
#docker rm [服务id/服务名]
docker rm rmqnamesrv
docker rm rmqbroker
docker rm rocketmq-dashboard
#删除RocketMQ镜像
#docker rmi [镜像id/镜像名]
docker rmi rmqnamesrv
docker rmi rmqbroker
docker rmi rocketmq-dashboard
#删除rocketmq-net网络
docker network rm rocketmq-net