安装环境
- 64位JDK 1.8+
- 建议使用64位操作系统,Linux / Unix / Mac;
- 源码编译安装需要maven 3.2.x
二进制安装
下载RocketMq
官网下载最新版本地址:点这里 将下载好的rocketmq-all-4.8.0-bin-release.zip进行解压重命名下就可以了:
> unzip rocketmq-all-4.8.0-bin-release.zip
> mv rocketmq-all-4.8.0-bin-release rocketmq
启动nameserver
> nohup bin/mqnamesrv &
启动broker
> nohup sh bin/mqbroker -n localhost:9876 &
停止broker
> bin/mqshutdown broker
停止nameserver
> bin/mqshutdown namesrv
常见错误
1. JAVA_HOME设置问题
如果没有正确设置jdk环境,可能会报这个错,可以在配置文件/etc/profile配置JAVA_HOME,例如:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home
export M2_HOME=~/apache-maven-3.6.3
export ROCKETMQ_HOME=~/rocketmq/mq/rocketmq-all-4.8.0-bin-release
export PATH=$PATH:$JAVA_HOME:$M2_HOME/bin:$ROCKETMQ_HOME
保存后source /etc/profile下就可以了,注意这里是要在/etc/profile文件,有的是在家目录下的~/.bash_profile配置环境变量,这样也是不行的
2. 启动时内存溢出报错
这种情况往往是内存不足引起的,修改nameserver和broker的内存配置即可。在rocketmq/bin下找到runserver.sh和runbroker.sh,将启动时内存占用修改小一点:
#nameserver
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx2g -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
#broker
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx2g -Xmn1g"
rocketmq-console安装
RocketMQ-Console是RocketMQ项目的扩展插件,是一个图形化管理控制台,提供Broker集群状态查看,Topic管理,Producer、Consumer状态展示,消息查询等常用功能,这个功能在安装好RocketMQ后需要额外单独安装、运行。
下载rocketmq-console
- 该项目位于rocketmq-externals项目下,
该项目是基于springboot开发的,运行前需要修改src/main/resources/application.properties里的namesrvAddr的配置
> git clone https://github.com/apache/rocketmq-externals.git
> cd rocketmq-externals-rocketmq-console-1.0.0/rocketmq-console/src/main/resources/
> vim application.properties
能修改的是圈住的这两项就可以了
然后运行项目,两种方式:
- 直接运行
mvn spring-boot:run
- 打包运行
mvn clean package -Dmaven.test.skip=true
java -jar target/rocketmq-console-ng-2.0.0.jar
然后打开浏览器输入http://localhost:8080就可以访问了
docker安装
docker-compose.yml
我这里通过docker-compose.yml配置来安装的,配置如下:
version: '3'
services:
rmqnamesrv:
image: foxiswho/rocketmq:server
container_name: rmqnamesrv
ports:
- 9876:9876
volumes:
- ./data/namesrv/logs:/home/rocketmq/logs
- ./data/namesrv/store:/home/rocketmq/store
networks:
rmq:
aliases:
- rmqnamesrv
rmqbroker:
image: foxiswho/rocketmq:broker
container_name: rmqbroker
ports:
- 10911:10911
- 10909:10909
volumes:
- ./data/broker/logs:/home/rocketmq/logs
- ./data/broker/store:/home/rocketmq/store
- ./conf/broker.conf:/etc/rocketmq/broker.conf
environment:
NAMESRV_ADDR: "rmqnamesrv:9876"
JAVA_OPTS: " -Duser.home=/opt"
JAVA_OPT_EXT: "-server -Xms128m -Xmx128m -Xmn128m"
command: mqbroker -c /etc/rocketmq/broker.conf
depends_on:
- rmqnamesrv
networks:
rmq:
aliases:
- rmqbroker
rmqconsole:
image: styletang/rocketmq-console-ng
container_name: rmqconsole
ports:
- 8080:8080
environment:
JAVA_OPTS: "-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
depends_on:
- rmqnamesrv
networks:
rmq:
aliases:
- rmqconsole
networks:
rmq:
name: rmq
driver: bridge
这里配置了nameserver、broker、console三个服务容器,rmqconsole是rocketmq的图形化管理界面。我本地是建了一个rocketmq目录如下:
- docker-compose.yml 服务编排配置
- conf/broker.conf broker代理服务器配置文件
- data/broker/logs broker代理服务器日志路径
- data/broker/store broker代理服务器消息存储路径
broker.conf
其中broker.conf内容如下:
# 所属集群名字
brokerClusterName=DefaultCluster
# broker 名字,注意此处不同的配置文件填写的不一样,如果在 broker-a.properties 使用: broker-a,
# 在 broker-b.properties 使用: broker-b
brokerName=broker-a
# 0 表示 Master,> 0 表示 Slave
brokerId=0
# nameServer地址,分号分割
# namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
# 启动IP,如果 docker 报 com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to <192.168.0.120:10909> failed
# 解决方式1 加上一句 producer.setVipChannelEnabled(false);,解决方式2 brokerIP1 设置宿主机IP,不要使用docker 内部IP
brokerIP1=rmqbroker
namesrvAddr = rmqnamesrv:9876
# 在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
# 是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭 !!!这里仔细看是 false,false,false
autoCreateTopicEnable=true
# 是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
# Broker 对外服务的监听端口
listenPort=10911
# 删除文件时间点,默认凌晨4点
deleteWhen=04
# 文件保留时间,默认48小时
fileReservedTime=120
# commitLog 每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
# ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
# destroyMapedFileIntervalForcibly=120000
# redeleteHangedFileInterval=120000
# 检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
# 存储路径
# storePathRootDir=/home/ztztdata/rocketmq-all-4.1.0-incubating/store
# commitLog 存储路径
# storePathCommitLog=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/commitlog
# 消费队列存储
# storePathConsumeQueue=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/consumequeue
# 消息索引存储路径
# storePathIndex=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/index
# checkpoint 文件存储路径
# storeCheckpoint=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/checkpoint
# abort 文件存储路径
# abortFile=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/abort
# 限制的消息大小
maxMessageSize=65536
# flushCommitLogLeastPages=4
# flushConsumeQueueLeastPages=2
# flushCommitLogThoroughInterval=10000
# flushConsumeQueueThoroughInterval=60000
# Broker 的角色
# - ASYNC_MASTER 异步复制Master
# - SYNC_MASTER 同步双写Master
# - SLAVE
brokerRole=ASYNC_MASTER
# 刷盘方式
# - ASYNC_FLUSH 异步刷盘
# - SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
# 发消息线程池数量
# sendMessageThreadPoolNums=128
# 拉消息线程池数量
# pullMessageThreadPoolNums=128
然后执行docker-compose up -d就开始安装了,安装后会自动启动。
docker安装启动后常见的问题
1. 端口开放问题
- nameserver默认端口:9876
- broker默认对外服务监听端口:10911,如果开启了VIP通道默认是10909端口
- console默认端口:8080 在maven里引入rocketmq-client包后,运行官网给的demo有时候会报错连接错误,这个时候可以注意两点:
- 看下是否是有些端口没有开放出来,在配置里开放出来,然后重新启动就好了
- 端口如果也开放了,看下是否开启了防火墙,关闭防火墙或者设置防火墙允许端口可访问即可
2. 连接超时问题
broker.conf里配置namesrvAddr和brokerIP1时,如果不配置,默认会用容器的内网IP,这样容器之间相互是不通的,会报连接超时问题sendDefaultImpl call timeout,这个时候解决办法:
- 配置成主机IP
- 配置成容器名称,例如: brokerIP1 = rmqbroker
namesrvAddr = rmqnamesrv:9876 因为docker-compose.yml里每个service配置了depends_on,保证了容器间的互相通信
3. 主机IP变动问题
我用的mac电脑,一开始broker.conf里上面两个配置的主机IP,连的wifi,运行一段时间重启电脑,然后报错了,后来发现是主机IP变了,这个时候解决办法:
- 上面两个选项配置成容器名称
- 本地hosts文件配置ip映射 127.0.0.1 rmqnamesrv 这样客户端连接namesrv时配置成rmqnamesrv:9876就可以了