Linux下启动RocketMQ broker报错

操作环境

先说明操作系统是CentOS 7,因为不同操作系统下,导致的原因有可能不同

[root@localhost ~]# lsb_release -a
LSB Version:	:core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarch
Distributor ID:	CentOS
Description:	CentOS Linux release 7.6.1810 (Core) 
Release:	7.6.1810
Codename:	Core

问题背景

学习rocketq时,按照官网的快速入门教程,执行 tail -f ~/logs/rocketmqlogs/broker.log后提示找不到文件

打开当前目录(apache-rocketmq)下的 nohup.out 日志文件查看,发现启动 Broker 失败:无法分配内存

OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
OpenJDK 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/server/mq/rocketmq/distribution/target/apache-rocketmq/hs_err_pid18979.log

从网上查了很长时间,大部分是说runbroker.shrunserver.sh这两个配置文件里默认分配的内存过大,但是我把它们都调小了依然提示找不到文件和无法分配内存;

还有人说安装telnet可以解决,于是我安装了Telnet并重启了虚拟机,结果却是连name server都启动不起来了。

实际原因

没配置JAVA_HOME参数

打开runbroker.sh和runserver.sh这两个配置文件,查看这两个配置文件的内容,可以看到这两个文件都是引用了JAVA_HOME这个参数的

我Linux系统的jdk是蛮久以前安装的,好像是通过命令直接安装的, java -version可以看到jdk的版本,maven也能正常使用,但是echo $JAVA_HOME却没有输出任何东西。由于看到runbroker.sh和runserver.sh这两个配置文件都使用了$JAVA_HOME,于是猜想报错是因为没配置这个参数,于是从官网下载了压缩包并配置好了参数,重启 name server,再次启动broker后提示成功

[root@localhost apache-rocketmq]# nohup sh bin/mqbroker -n localhost:9876 &
[2] 14192
[root@localhost apache-rocketmq]# nohup: 忽略输入并把输出追加到"nohup.out"
tail -f ~/logs/rocketmqlogs/broker.log
2019-10-28 00:57:31 INFO main - fastFailIfNoBufferInStorePool=false
2019-10-28 00:57:32 INFO main - Set user specified name server address: localhost:9876
2019-10-28 00:57:32 WARN main - Load default transaction message hook service: TransactionalMessageServiceImpl
2019-10-28 00:57:32 WARN main - Load default discard message hook service: DefaultTransactionalMessageCheckListener
2019-10-28 00:57:32 INFO main - The broker dose not enable acl
2019-10-28 00:57:32 INFO FileWatchService - FileWatchService service started
2019-10-28 00:57:32 INFO PullRequestHoldService - PullRequestHoldService service started
2019-10-28 00:57:32 INFO brokerOutApi_thread_1 - register broker to name server localhost:9876 OK
2019-10-28 00:57:32 INFO main - Start transaction service!
2019-10-28 00:57:32 INFO main - The broker[., 192.168.1.6:10911] boot success. serializeType=JSON and name server is localhost:9876
2019-10-28 00:57:42 INFO BrokerControllerScheduledThread1 - dispatch behind commit log 0 bytes
2019-10-28 00:57:42 INFO BrokerControllerScheduledThread1 - Slave fall behind master: 0 bytes
2019-10-28 00:57:42 INFO brokerOutApi_thread_2 - register broker to name server localhost:9876 OK
2019-10-28 00:58:12 INFO brokerOutApi_thread_3 - register broker to name server localhost:9876 OK
2019-10-28 00:58:32 INFO TransactionalMessageCheckService - create new topic TopicConfig [topicName=RMQ_SYS_TRANS_HALF_TOPIC, readQueueNums=1, writeQueueNums=1, perm=RW-, topicFilterType=SINGLE_TAG, topicSysFlag=0, order=false]
2019-10-28 00:58:32 INFO brokerOutApi_thread_4 - register broker to name server localhost:9876 OK
2019-10-28 00:58:42 INFO BrokerControllerScheduledThread1 - dispatch behind commit log 0 bytes
2019-10-28 00:58:42 INFO BrokerControllerScheduledThread1 - Slave fall behind master: 0 bytes
2019-10-28 00:58:42 INFO brokerOutApi_thread_1 - register broker to name server localhost:9876 OK
2019-10-28 00:59:12 INFO brokerOutApi_thread_2 - register broker to name server localhost:9876 OK

放上配置JAVA_HOME的教程:Linux下配置JAVA_HOME

 

其他

1.修改runbroker.shrunserver.sh,将配置的内存调小的方法

(1)runbroker.sh

vim /usr/local/server/mq/rocketmq/distribution/bin/runbroker.sh
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"

改为:

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m"

(2)runserver.sh

vim /usr/local/server/mq/rocketmq/distribution/bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

改为:

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn125m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

以上是我调整的大小,实际中可以根据服务器内存的情况,配置一个合适的值。在内存允许的情况下,最好配置1g以上。因为rocketMQ对内存的要求较高,最少1G,如果内存太少,会影响rocketMQ的运行效率和执行性能


版权声明:本文为weixin_38384296原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。