CentOS 7 安装 RocketMQ 4.9.4

367 阅读5分钟

安装环境、依赖

CentOS 7.6 64bit 安装系统
java version "1.8.0_321" RocketMQ依赖Java环境,版本最好不要低于1.8
apache-maven-3.6.3-bin.tar.gz 使用RocketMQ源码构建编译时需要使用,若使用二进制包则无需安装Maven
rocketmq-release-4.9.4.zip RocketMQ源码包,发布版本
rocketmq-externals-release-rocketmq-console-1.0.0 RocketMQ控制台源码包,同需Maven构建打包

RocketMQ官网

官方文档地址:rocketmq.apache.org/docs/quick-…
源码下载地址:github.com/apache/rock… 此版本需要使用maven编译成二进制
二进制下载地址:www.apache.org/dyn/closer.…

安装Maven

# 下载地址
https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
# 修改仓库地址
<localRepository>/opt/maven/repository</localRepository>
# 添加阿里云镜像,在 mirrors 节点下添加
<mirror>
<id>aliyun-maven</id>
<mirrorOf>*</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
# 配置环境变量,修改/etc/profile
export M2_HOME=/opt/maven/apache-maven-3.6.3
export PATH=$PATH:$M2_HOME/bin
# 使配置生效
source /etc/profile

编译RocketMQ

# 解压zip,-d 指定解压目录
unzip rocketmq-release-4.9.4.zip -d /opt/mq
# 进入主目录进行编译(主目录下有个pom文件)
## -P:指定执行环境为 release-all(pom文件的profile标签中的id标签的值),在distribution目录下的pom文件中
## -U:强制更新依赖的本地为快照版本(SNAPSHOT)的jar
mvn -Prelease-all -DskipTests clean install -U

编译成功截图 image-20220825143605811.png
编译成后的二进制包在 distribution/target 目录下;其中,bin为命令文件所在位置,conf为配置所在位置,lib为依赖包所在位置;

运行RocketMQ

配置内存

启动MQ之前需要对其内存占用进行调整,默认占用比较大,普通服务器环境下,不修改可能无法启动

进入编译后的bin目录,找到runserver.shrunbroker.sh文件,如下图进行调整: image-20220825145839504.png image-20220825151106071.png

启动MQ

# 启动名称服务器,须优先启动,默认使用9876端口
## 成功日志:The Name Server boot success. serializeType=JSON
nohup sh bin/mqnamesrv &
#nohup sh bin/mqnamesrv > ./log/namesrv-log.log  2>&1 &
## 指定配置文件“namesrv.properties”启动,文件中配置名称服务器端口:listenPort=9879
touch ./conf/namesrv.properties
nohup sh bin/mqnamesrv -c conf/namesrv.properties &

# 启动代理服务器
## -n:指定名称服务器的地址
## 成功日志:The broker[chalice, 10.0.12.10:10911] boot success. serializeType=JSON and name server is localhost:9876
nohup sh bin/mqbroker -n localhost:9876 &
#nohup sh bin/mqbroker -n localhost:9876 > ./log/broke-log.log  2>&1 &
## 指定配置文件“broker.conf”启动,该配置文件已存在,无须创建
nohup sh bin/mqbroker -n localhost:9876 -c conf/broker.conf &

测试生产、消费

# 生产消费消息之前,需要告诉客户端连接的名称服务器的地址
## 如下配置只在当前ssh客户端连接下有效,长久生效需要配置在环境变量中
export NAMESRV_ADDR=localhost:9876

# 运行生产demo
## 成功日志:SendResult [sendStatus=SEND_OK, msgId= ...
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

# 运行消费demo
## 成功日志:ConsumeMessageThread_%d Receive New Messages: [MessageExt...
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

停止MQ

# 停止代理服务器
sh bin/mqshutdown broker
## The mqbroker(32373) is running...
## Send shutdown request to mqbroker(32373) OK

# 停止名称服务器
sh bin/mqshutdown namesrv
## The mqnamesrv(31079) is running...
## Send shutdown request to mqnamesrv(31079) OK

修改配置

名称服务器配置

配置/conf/namesrv.properties文件,此文件需要自行创建

# 名称服务器的监听端口,不设置默认为 9876
listenPort=9876
……

代理服务器配置

配置/conf/broker.conf文件

# 集群名称
brokerClusterName=DefaultCluster
# broker名称
brokerName=broker-a
# 0表示master,1表示slave
brokerId=0
# 4时删除文件
deleteWhen = 04
# 文件保留48小时
fileReservedTime = 48
# ASYNC_MASTER:异步复制Master;SYNC_MASTER:同步双写Master
brokerRole=SYNC_MASTER
# 刷盘机制,一般为异步刷盘
flushDiskType=SYNC_FLUSH

# 名称服务器地址
#namesrvAddr=192.168.0.132:9876;192.168.0.131:9876
namesrvAddr=ip:port
# 代理服务器对外的IP
brokerIP1=ip
# 代理服务器对外的监听端口
listenPort=10911
# 自动创建Topic,生产环境下一般设置为 false
autoCreateTopicEnable=true
……

编译运行RocketMQ Console

# 解压、移动目录至/opt/mq
unzip rocketmq-externals-release-rocketmq-console-1.0.0.zip -d /opt/mq
cd /opt/mq
mv rocketmq-externals-release-rocketmq-console-1.0.0/rocketmq-console/ /opt/mq

# 编译打包之前,进入源码目录的/src/main/resources下,修改application.properties文件
server.port=9875
rocketmq.config.namesrvAddr=127.0.0.1:9876

# 使用maven进行编译打包,打包后的项目在target目录下,取出运行即可
cd /opt/mq/rocketmq-console
mvn clean package -Dmaven.test.skip=true

# 启动控制台服务
nohup java -jar rocketmq-console-ng-1.0.0.jar &
nohup java -Dfile.encoding=utf-8 -jar rocketmq-console-ng-1.0.0.jar > ./rocketmq-console-log.log 2>&1 &

访问控制台服务

image-20220825172531476.png

配置防火墙

# 启动防火墙
service firewalld start
systemctl start firewalld
# 停止防火墙
service firewalld stop
systemctl stop firewalld
# 查看防火墙状态
service firewalld status
systemctl status firewalld
firewall-cmd --state
# 开放9875端口
firewall-cmd --permanent --add-port=9875/tcp
# 移除9875端口
firewall-cmd --permanent --remove-port=9875/tcp
# 更新防火墙规则,每次开放或移除之后需要执行更新
firewall-cmd --reload

常见问题

启动broker失败 :Cannot allocate memory

原因:jvm启动初始化内存分配大于物理内存

[root@chalice bin]# ./mqbroker -n localhost:9876
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000005c0000000, 8589934592, 0) failed
; error='Cannot allocate memory' (errno=12)#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 8589934592 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/rocketmq/bin/hs_err_pid1997.log

解决:修改启动脚本中的jvm参数,runbroker.shrunserver.sh,默认初始化内存很大,需要改小

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=100m"

测试生产、消费报错:connect to null failed

原因:连接目标为null,找不到nameserver的地址

java.lang.IllegalStateException: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to null failed
        at org.apache.rocketmq.client.impl.factory.MQClientInstance.updateTopicRouteInfoFromNameServer(MQClientInstance.java:680)
        at org.apache.rocketmq.client.impl.factory.MQClientInstance.updateTopicRouteInfoFromNameServer(MQClientInstance.java:510)
        at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.tryToFindTopicPublishInfo(DefaultMQProducerImpl.java:675)
        at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:548)
        at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1363)
        at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1307)
        at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:333)
        at org.apache.rocketmq.example.quickstart.Producer.main(Producer.java:78)
Caused by: org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to null failed

解决:声明名称服务器地址 export NAMESRV_ADDR=localhost:9876

控制台,点击消费者,报错:CODE: 17

org.apache.rocketmq.client.exception.MQClientException: CODE: 17  DESC: No topic route info in name server for the topic: %RETRY%FILTERSRV_CONSUMER
See http://rocketmq.apache.org/docs/faq/ for further details.
        at org.apache.rocketmq.client.impl.MQClientAPIImpl.getTopicRouteInfoFromNameServer(MQClientAPIImpl.java:1212)
        at org.apache.rocketmq.tools.admin.DefaultMQAdminExtImpl.examineTopicRouteInfo(DefaultMQAdminExtImpl.java:274)
        at org.apache.rocketmq.tools.admin.DefaultMQAdminExtImpl.examineConsumerConnectionInfo(DefaultMQAdminExtImpl.java:293)
        at org.apache.rocketmq.tools.admin.DefaultMQAdminExt.examineConsumerConnectionInfo(DefaultMQAdminExt.java:223)
        at org.apache.rocketmq.console.service.client.MQAdminExtImpl.examineConsumerConnectionInfo(MQAdminExtImpl.java:188)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)

解决:暂无

参考链接