中文文档 : https://github.com/apache/rocketmq/tree/master/docs/cn
具体broker 配置属性说明 : http://rocketmq.apache.org/docs/rmq-deployment/
本文使用镜像地址 :https://hub.docker.com/r/rocketmqinc/rocketmq
单节点快速体验
vim docker-compose.yml
version: '2'
services:
namesrv:
image: rocketmqinc/rocketmq
container_name: rmqnamesrv
restart: always
ports:
- 9876:9876
volumes:
- ./logs:/home/rocketmq/logs
- ./store:/home/rocketmq/store
command: sh mqnamesrv
broker:
image: rocketmqinc/rocketmq
container_name: rmqbroker
restart: always
ports:
- 10909:10909
- 10911:10911
- 10912:10912
volumes:
- ./logs:/home/rocketmq/logs
- ./store:/home/rocketmq/store
- ./conf/broker.conf:/opt/rocketmq-4.4.0/conf/broker.conf
command: sh mqbroker -n namesrv:9876 -c ../conf/broker.conf
depends_on:
- namesrv
environment:
- JAVA_HOME=/usr/lib/jvm/jre
console:
image: styletang/rocketmq-console-ng
container_name: rocketmq-console-ng
restart: always
ports:
- 80:8080
depends_on:
- namesrv
environment:
- JAVA_OPTS= -Dlogging.level.root=info -Drocketmq.namesrv.addr=rmqnamesrv:9876
- Dcom.rocketmq.sendMessageWithVIPChannel=false
vim conf/broker-a.conf
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 如果是本地程序调用云主机 mq,这个需要设置成 云主机 IP
brokerIP1=192.168.2.225
namesrvAddr=namesrv-1:9876
docker-compose up 启动
成功之后IP:80访问控制台,可以看到集群以及broker成功
多主多从 - 同步双写
一样的操作
vim docker-compose.yml
version: '2.3'
services:
namesrv-1:
image: rocketmqinc/rocketmq:4.4.0
restart: always
ports:
- 9876:9876
volumes:
- "./namesrv-1/logs:/opt/logs"
- "./namesrv-1/store:/opt/store"
- /etc/localtime:/etc/localtime:ro
command: sh mqnamesrv
environment:
JAVA_OPT_EXT: "-server -Xms300m -Xmx300m -Xmn150m"
namesrv-2:
image: rocketmqinc/rocketmq:4.4.0
restart: always
ports:
- 9877:9876
volumes:
- "./namesrv-2/logs:/opt/logs"
- "./namesrv-2/store:/opt/store"
- /etc/localtime:/etc/localtime:ro
command: sh mqnamesrv
environment:
JAVA_OPT_EXT: "-server -Xms300m -Xmx300m -Xmn150m"
namesrv-3:
image: rocketmqinc/rocketmq:4.4.0
restart: always
ports:
- 9878:9876
volumes:
- "./namesrv-3/logs:/opt/logs"
- "./namesrv-3/store:/opt/store"
- /etc/localtime:/etc/localtime:ro
command: sh mqnamesrv
environment:
JAVA_OPT_EXT: "-server -Xms300m -Xmx300m -Xmn150m"
broker-a-m:
image: rocketmqinc/rocketmq:4.4.0
restart: always
ports:
- 10909:10909
- 10911:10911
- 10912:10912
volumes:
- "./broker-a-m/logs:/opt/logs"
- "./broker-a-m/store:/opt/store"
- "./conf/broker-a-m.conf:/etc/rocketmq/broker.conf"
- /etc/localtime:/etc/localtime:ro
command: sh mqbroker -c /etc/rocketmq/broker.conf
links:
- namesrv-1:namesrv-1
- namesrv-2:namesrv-2
- namesrv-3:namesrv-3
depends_on:
- namesrv-1
- namesrv-2
- namesrv-3
environment:
JAVA_OPTS: " -Duser.home=/opt"
JAVA_HOME: "/usr/lib/jvm/jre"
JAVA_OPT_EXT: "-server -Xms300m -Xmx300m -Xmn150m"
broker-a-s:
image: rocketmqinc/rocketmq:4.4.0
restart: always
ports:
- 10919:10909
- 10921:10911
- 10922:10912
volumes:
- "./broker-a-s/logs:/opt/logs"
- "./broker-a-s/store:/opt/store"
- "./conf/broker-a-s.conf:/etc/rocketmq/broker.conf"
- /etc/localtime:/etc/localtime:ro
command: sh mqbroker -c /etc/rocketmq/broker.conf
links:
- namesrv-1:namesrv-1
- namesrv-2:namesrv-2
- namesrv-3:namesrv-3
depends_on:
- namesrv-1
- namesrv-2
- namesrv-3
environment:
JAVA_OPTS: " -Duser.home=/opt"
JAVA_HOME: "/usr/lib/jvm/jre"
JAVA_OPT_EXT: "-server -Xms300m -Xmx300m -Xmn150m"
broker-b-m:
image: rocketmqinc/rocketmq:4.4.0
restart: always
ports:
- 10929:10909
- 10931:10911
- 10932:10912
volumes:
- "./broker-b-m/logs:/opt/logs"
- "./broker-b-m/store:/opt/store"
- "./conf/broker-b-m.conf:/etc/rocketmq/broker.conf"
- /etc/localtime:/etc/localtime:ro
command: sh mqbroker -c /etc/rocketmq/broker.conf
links:
- namesrv-1:namesrv-1
- namesrv-2:namesrv-2
- namesrv-3:namesrv-3
depends_on:
- namesrv-1
- namesrv-2
- namesrv-3
environment:
JAVA_OPTS: " -Duser.home=/opt"
JAVA_HOME: "/usr/lib/jvm/jre"
JAVA_OPT_EXT: "-server -Xms300m -Xmx300m -Xmn150m"
broker-b-s:
image: rocketmqinc/rocketmq:4.4.0
restart: always
ports:
- 10939:10909
- 10941:10911
- 10942:10912
volumes:
- "./broker-b-s/logs:/opt/logs"
- "./broker-b-s/store:/opt/store"
- "./conf/broker-b-s.conf:/etc/rocketmq/broker.conf"
- /etc/localtime:/etc/localtime:ro
command: sh mqbroker -c /etc/rocketmq/broker.conf
links:
- namesrv-1:namesrv-1
- namesrv-2:namesrv-2
- namesrv-3:namesrv-3
depends_on:
- namesrv-1
- namesrv-2
- namesrv-3
environment:
JAVA_OPTS: " -Duser.home=/opt"
JAVA_HOME: "/usr/lib/jvm/jre"
JAVA_OPT_EXT: "-server -Xms300m -Xmx300m -Xmn150m"
console:
image: styletang/rocketmq-console-ng
restart: always
ports:
- 80:8080
volumes:
- /etc/localtime:/etc/localtime:ro
links:
- namesrv-1:namesrv-1
- namesrv-2:namesrv-2
- namesrv-3:namesrv-3
depends_on:
- namesrv-1
- namesrv-2
- namesrv-3
environment:
JAVA_OPTS: -Drocketmq.config.namesrvAddr=namesrv-1:9876;namesrv-2:9877;namesrv-3:9878 -Dcom.rocketmq.sendMessageWithVIPChannel=false
复制配置文件
vim conf/broker-a-m.conf
#0 表示 Master,>0 表示 Slave
brokerId = 0
#这个很有讲究 如果是正式环境 这里一定要填写内网地址(安全)
#如果是用于测试或者本地这里建议要填外网地址,因为你的本地代码是无法连接到阿里云内网,只能连接外网
brokerIP1 = 192.168.203.102
# 因为我们使用了links docker会自动映射
namesrvAddr=namesrv-1:9876;namesrv-2:9877;namesrv-3:9878
#Broker 对外服务的监听端口
listenPort = 10911
#删除文件时间点,默认凌晨 4点
deleteWhen = 04
# 映射文件提交大小
mapedFileSizeCommitLog = 1024 * 1024 * 1024
#文件保留时间,默认 72 小时
fileReservedTime = 120
#Broker角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH
相同的操作,复制三份
cp conf/broker-a-m.conf conf/broker-a-s.conf
cp conf/broker-a-m.conf conf/broker-b-m.conf
cp conf/broker-a-m.conf conf/broker-b-s.conf
稍微修改下 , 改成 slave
vim conf/broker-a-s.conf
#0 表示 Master,>0 表示 Slave
brokerId = 1
#Broker角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
稍微修改下 , 改成 broker-b
vim conf/broker-b-m.conf
#当前broker名
brokerName = broker-name-b
稍微修改下 , 改成 broker-b
vim conf/broker-b-s.conf
#当前broker名
brokerName = broker-name-b
#0 表示 Master,>0 表示 Slave
brokerId = 1
#Broker角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
这样配置文件也准备好了,直接启动
docker-compose up
同样可以在控制台看到集群和broker
客户端连接问题:
MQClientException: No route info of this topic, springboot-mq
因为各自环境不一样所以只能挨个排除
- 可能是 autoCreateTopicEnable 没有设置成true
- 可能是配置文件中broker连接nameserver地址,外网无法访问,比如,我配置的是docker中的host映射,没有配置外网IP
- 可能是磁盘或者内存空间不够,磁盘不够那自然无法持久化,在同步双写的时候也就无法写入,自然就失败了
MQBrokerException: CODE: 14 DESC: service not available now, maybe disk full, CL: 0.96 CQ: 0.96 INDEX: 0.96, maybe your broker machine memory too small.
这个就是典型的磁盘空间不足,我只给了20g磁盘
df -lh 分析哪些地方占了位置,删掉或者扩容
RemotingConnectException: connect to <192.168.203.102:10929> failed
默认的非vip通道端口:10911
vip通道端口:10909
需要注意 我们单机部署 默认如果走内网通道可能会有问题 ,客户端(console 和 我们的生产者 消费者)需要关闭内网通道,
代码中
setVipChannelEnabled(false);
或者环境变量/jvm参数
com.rocketmq.sendMessageWithVIPChannel = false