1. 镜像制作
1.1 克隆 rocketmq-docker 代码
git clone https://github.com/apache/rocketmq-docker.git
2. 构建镜像
2.2 rocketmq 镜像构建
cd image-build
sh build-image.sh 4.5.2 centos
# sh build-image.sh RMQ-VERSION BASE-IMAGE
2.3 rocketmq-dashboard 镜像构建
cd imgae-build
sh build-image-dashboared.sh 1.0.0 centos
sh build-image-dashboard.sh dashboard-VERSION BASE-IMAGE
# 因官方的dashboard-docker镜像没有配置用户登录,故建议使用dockerhub镜像 apacherocketmq/rocketmq-dashboard:1.0.0
3. docker-compose 单机部署 rocketmq
3.1 配置docker挂载路径
mkdir -p ./data/namesrv/logs
mkdir -p ./data/broker/logs
mkdir -p ./data/broker/store
mkdir -p ./etc/broker
mkdir -p ./data/console/data
chmod -R 777 ./data
chmod -R 777 ./etc
3.2 broker 配置文件
vim ./etc/broker/broker.conf
#所属集群名字
brokerClusterName = DefaultCluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName = broker-a
#0 表示 Master,>0 表示 Slave
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
#Broker 的角色,ASYNC_MASTER=异步复制Master,SYNC_MASTER=同步双写Master,SLAVE=slave节点
brokerRole = ASYNC_MASTER
#刷盘方式,ASYNC_FLUSH=异步刷盘,SYNC_FLUSH=同步刷盘
flushDiskType = ASYNC_FLUSH
# Docker环境需要设置成宿主机IP
#brokerIP1 = {docker宿主机IP}
brokerIP1 = 172.16.28.97
3.3 rocketmq-dashboard 开启用户登录功能
挂载的 data 目录下,创建 users.properties 文件
# =============用户名和密码规则「用户名=密码,权限」,这里的权限为1表示管理员,为0表示普通用户=============
# 例如:admin=admin123,1
admin=admin,1
user=user,0
3.4 编写 docker-compose
version: '3'
services:
namesrv:
image: apacherocketmq/rocketmq:4.5.2
container_name: rocketmq-namesrv
ports:
- 9876:9876
environment:
- JAVA_OPT_EXT=-server -Xms256m -Xmx256m -Xmn256m
volumes:
- ./data/namesrv/logs:/root/logs
command: sh mqnamesrv
broker:
image: apacherocketmq/rocketmq:4.5.2
container_name: rocketmq-broker
links:
- namesrv
depends_on:
- namesrv
ports:
- 10909:10909
- 10911:10911
- 10912:10912
environment:
- NAMESRV_ADDR=namesrv:9876
- JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m
volumes:
- ./data/broker/logs:/home/rocketmq/logs
- ./data/broker/store:/home/rocketmq/store
- ./etc/broker/broker.conf:/home/rocketmq/conf/broker.conf
command: sh mqbroker -c /home/rocketmq/conf/broker.conf
dashboard:
image: apacherocketmq/rocketmq-dashboard:1.0.0
container_name: rocketmq-dashboard
ports:
- 18090:8080
links:
- namesrv
depends_on:
- namesrv
environment:
- JAVA_OPTS=-Drocketmq.namesrv.addr=namesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false -Drocketmq.config.loginRequired=true
volumes:
- ./data/console/data:/tmp/rocketmq-console/data
运行命令:
docker-compose -f ./docker-compose.yml up -d
4. docker-compose 部署 rocketmq 集群(双主双从)
4.1 配置文件
4.1.1 创建配置文件目录
mkdir -p ./data/namesrv/{logs-m,logs-s}
mkdir -p ./data/broker/{logs-a,logs-a-s,logs-b,logs-b-s,store-a,store-a-s,store-b,store-b-s}
mkdir -p ./conf/broker
touch ./data/broker/conf/{broker-a.conf, broker-b.conf, broker-a-s.conf, broker-b-s.conf}
touch ./docker-compose.yml
4.1.2 broker-a.conf
#所属集群名字,同一个集群名字相同
brokerClusterName=rocketmq-cluster
#broker名字
brokerName=broker-a
#0表示master >0 表示slave
brokerId=0
#删除文件的时间点,凌晨4点
deleteWhen=04
#文件保留时间 默认是48小时
fileReservedTime=168
#异步复制Master
brokerRole=ASYNC_MASTER
#刷盘方式,ASYNC_FLUSH=异步刷盘,SYNC_FLUSH=同步刷盘
flushDiskType=ASYNC_FLUSH
#Broker 对外服务的监听端口
listenPort=10911
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.2.35:9876;192.168.2.35:9877
#每个topic对应队列的数量,默认为4,实际应参考consumer实例的数量,值过小不利于consumer负载均衡
defaultTopicQueueNums=8
#是否允许 Broker 自动创建Topic,生产建议关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,生产建议关闭
autoCreateSubscriptionGroup=true
#设置BrokerIP
brokerIP1=192.168.2.35
4.1.3 broker-b.conf
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样 例如:在a.properties 文件中写 broker-a 在b.properties 文件中写 broker-b
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=168
#Broker 的角色,ASYNC_MASTER=异步复制Master,SYNC_MASTER=同步双写Master,SLAVE=slave节点
brokerRole=ASYNC_MASTER
#刷盘方式,ASYNC_FLUSH=异步刷盘,SYNC_FLUSH=同步刷盘
flushDiskType=SYNC_FLUSH
#Broker 对外服务的监听端口
listenPort=11911
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.2.35:9876;192.168.2.35:9877
#每个topic对应队列的数量,默认为4,实际应参考consumer实例的数量,值过小不利于consumer负载均衡
defaultTopicQueueNums=8
#是否允许 Broker 自动创建Topic,生产建议关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,生产建议关闭
autoCreateSubscriptionGroup=true
#设置BrokerIP
brokerIP1=192.168.2.35
4.1.4 broker-a-s.conf
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样 例如:在a.properties 文件中写 broker-a 在b.properties 文件中写 broker-b
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=168
#Broker 的角色,ASYNC_MASTER=异步复制Master,SYNC_MASTER=同步双写Master,SLAVE=slave节点
brokerRole=SLAVE
#刷盘方式,ASYNC_FLUSH=异步刷盘,SYNC_FLUSH=同步刷盘
flushDiskType=SYNC_FLUSH
#Broker 对外服务的监听端口
listenPort=12911
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.2.35:9876;192.168.2.35:9877
#每个topic对应队列的数量,默认为4,实际应参考consumer实例的数量,值过小不利于consumer负载均衡
defaultTopicQueueNums=8
#是否允许 Broker 自动创建Topic,生产建议关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,生产建议关闭
autoCreateSubscriptionGroup=true
#设置BrokerIP
brokerIP1=192.168.2.35
4.1.5 broker-b-s.conf
brokerClusterName=rocketmq-cluster
brokerName=broker-b
#slave
brokerId=1
deleteWhen=04
fileReservedTime=168
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
#Broker 对外服务的监听端口
listenPort=13911
#nameServer地址,这里nameserver是单台,如果nameserver是多台集群的话,就用分号分割(即namesrvAddr=ip1:port1;ip2:port2;ip3:port3)
namesrvAddr=192.168.2.35:9876;192.168.2.35:9877
#每个topic对应队列的数量,默认为4,实际应参考consumer实例的数量,值过小不利于consumer负载均衡
defaultTopicQueueNums=8
#是否允许 Broker 自动创建Topic,生产建议关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,生产建议关闭
autoCreateSubscriptionGroup=true
#设置BrokerIP
brokerIP1=192.168.2.35
4.2 编写 docker-compose.yml
version: '3'
services:
namesrv1:
image: apacherocketmq/rocketmq:4.5.2
container_name: rmq-namesrv1
ports:
- 9876:9876
environment:
- JAVA_OPT_EXT=-server -Xms256m -Xmx256m -Xmn256m
volumes:
- ./data/namesrv/logs-m:/root/logs
command: sh mqnamesrv
namesrv2:
image: apacherocketmq/rocketmq:4.5.2
container_name: rmq-namesrv2
ports:
- 9877:9876
environment:
- JAVA_OPT_EXT=-server -Xms256m -Xmx256m -Xmn256m
volumes:
- ./data/namesrv/logs-s:/root/logs
command: sh mqnamesrv
broker-a-m:
image: apacherocketmq/rocketmq:4.5.2
container_name: rmqbroker-a-m
ports:
- 10909:10909
- 10911:10911
- 10912:10912
environment:
- NAMESRV_ADDR=192.168.2.35:9876;192.168.2.35:9877
- JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m
volumes:
- ./data/broker/logs-a:/home/rocketmq/logs
- ./data/broker/store-a:/home/rocketmq/store
- ./conf/broker/broker-a.conf:/home/rocketmq/conf/broker.conf
command: sh mqbroker -c /home/rocketmq/conf/broker.conf
depends_on:
- namesrv1
- namesrv2
broker-b-m:
image: apacherocketmq/rocketmq:4.5.2
container_name: rmqbroker-b-m
ports:
- 11909:10909
- 11911:10911
- 11912:10912
environment:
- NAMESRV_ADDR=192.168.2.35:9876;192.168.2.35:9877
- JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m
volumes:
- ./data/broker/logs-b:/home/rocketmq/logs
- ./data/broker/store-b:/home/rocketmq/store
- ./conf/broker/broker-b.conf:/home/rocketmq/conf/broker.conf
command: sh mqbroker -c /home/rocketmq/conf/broker.conf
depends_on:
- namesrv1
- namesrv2
broker-a-s:
image: apacherocketmq/rocketmq:4.5.2
container_name: rmqbroker-a-s
ports:
- 12909:10909
- 12911:10911
- 12912:10912
environment:
- NAMESRV_ADDR=192.168.2.35:9876;192.168.2.35:9877
- JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m
volumes:
- ./data/broker/logs-a-s:/home/rocketmq/logs
- ./data/broker/store-a-s:/home/rocketmq/store
- ./conf/broker/broker-a-s.conf:/home/rocketmq/conf/broker.conf
command: sh mqbroker -c /home/rocketmq/conf/broker.conf
depends_on:
- namesrv1
- namesrv2
broker-b-s:
image: apacherocketmq/rocketmq:4.5.2
container_name: rmqbroker-b-s
ports:
- 13909:10909
- 13911:10911
- 13912:10912
environment:
- NAMESRV_ADDR=192.168.2.35:9876;192.168.2.35:9877
- JAVA_OPT_EXT=-server -Xms512m -Xmx512m -Xmn256m
volumes:
- ./data/broker/logs-b-s:/home/rocketmq/logs
- ./data/broker/store-b-s:/home/rocketmq/store
- ./conf/broker/broker-b-s.conf:/home/rocketmq/conf/broker.conf
command: sh mqbroker -c /home/rocketmq/conf/broker.conf
depends_on:
- namesrv1
- namesrv2
dashboard:
#image: apache/rocketmq-dashboard:1.0.0-centos
image: apacherocketmq/rocketmq-dashboard:1.0.0
container_name: rocketmq-dashboard
ports:
- 18090:8080
environment:
#- NAMESRV_ADDR=namesrv:9876
- JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.2.35:9876;192.168.2.35:9877 -Dcom.rocketmq.sendMessageWithVIPChannel=false -Drocketmq.config.loginRequired=true
volumes:
- ./data/console/data:/tmp/rocketmq-console/data
运行命令:
docker-compose up -d
浏览器访问:http://192.168.2.35:18090
5. FAQ
部署双主双从集群时,broker配置宿主机IP和端口时,只有10911端口的broker能启动,其它的连接失败,注释掉以下两行则集群正常启动
#Broker 对外服务的监听端口
listenPort=13911
#设置BrokerIP
brokerIP1=192.168.2.35
\