RocketMQ
01 下载RocketMQ
下载 RocketMQ 即可以从 Apache 官网下载,也可以从 gitHub 上进行下载,无论哪种方式,下载解压后都是一样的。
官网下载地址:https://rocketmq.apache.org/release-notes/2023/03/26/4.9.5点我直达
02 安装RocketMQ
进入官网后选择自己需要的版本进行下载,将下载完的 rocketmq-all-4.9.5-bin-release.zip
包上传至服务器或虚拟机
解压命令:
unzip rocketmq-all-4.9.5-bin-release.zip
03 启动RocketMQ
1. 内存分配
服务器上启动RocketMQ时,如果分配的内存过大,可能会导致系统资源消耗过多,从而降低服务器的性能和稳定性。因此,建议将Java虚拟机启动参数调整为适当的值,以避免消耗过多的系统资源。
修改bin目录 下的 3 个配置文件:(不然会报insufficient memory)
- runserver.sh
- runbroker.sh
- tools.sh
路径:/rocketMQ/rocketmq-all-4.9.5-bin-release/bin/
1.1 第一步
修改runserver.sh文件:
vim runserver.sh
将以下行:
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
修改为:
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx1g -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
这将把Java堆大小限制在1GB以内
1.2 第二步
修改runbroker.sh文件:
vim runbroker.sh
将以下行:
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"
修改为:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx512m -Xmn128m"
这样可以避免JVM占用过多的系统资源,从而提高服务器的稳定性和性能
1.3 第三步
修改tools.sh文件:
vim tools.sh
将以下行:
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"
修改为:
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx512m -Xmn128m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=64m"
最后开启自动动创建Topic功能
在conf/broker.conf⽂件中加⼊如下配置,开启自动动创建Topic功能。
autoCreateTopicEnable=true
这些启动脚本中的Java虚拟机启动参数是为了在不同的场景下最大化利用系统资源,并确保RocketMQ的稳定性和性能。
在runserver.sh文件中,Java堆的最小值为512MB,最大值为1GB,新生代大小为256MB,Metaspace大小为128MB,最大Metaspace大小为320MB。这个设置适用于启动RocketMQ的NameServer服务,因为NameServer服务需要处理大量的元数据,因此需要分配更多的内存空间。
在runbroker.sh文件中,Java堆的最小值为256MB,最大值为512MB,新生代大小为128MB。这个设置适用于启动RocketMQ的Broker服务,因为Broker服务需要处理大量的消息,但是元数据的处理相对较少,因此需要分配较少的内存空间。
在tools.sh文件中,Java堆的最小值为256MB,最大值为512MB,新生代大小为128MB,Metaspace大小为64MB,最大Metaspace大小为64MB。这个设置适用于启动RocketMQ的工具,例如消息生产者和消费者,因为这些工具需要处理相对较少的数据,因此需要分配较少的内存空间。
总体来说,这些Java虚拟机启动参数是为了在不同的场景下最大化利用系统资源,并确保RocketMQ的稳定性和性能。如果您在使用RocketMQ时遇到了性能或稳定性问题,可以考虑根据实际情况调整这些参数。
2. 启动RocketMQ
2.1 启动NameServer
(1)在bin目录下创建一个日志目录
mkdir logs
(2)启动NameServer
nohup ./mqnamesrv > logs/mqnamesrv.out 2>1 &
这个命令的作用是在后台运行mqnamesrv
进程,并将进程的标准输出和标准错误输出重定向到logs/mqnamesrv.out
文件中。
(3)查看日志
查看启动状态,运行以下代码等两三秒就会显示succeed
tail -f logs/mqnamesrv.out
看到The Name Server boot success. serializeType=JSON
表示启动成功。
tail -f logs/mqnamesrv.out
是一个Linux命令,用于实时监控文件内容的变化。其中 -f
参数表示实时跟踪文件中新增的内容。
可能需要等待5秒左右,是因为在 nohup ./mqnamesrv > logs/mqnamesrv.out 2>1 &
命令执行后,mqnamesrv
进程需要一些时间来启动并输出日志信息到 logs/mqnamesrv.out
文件中。如果在 logs/mqnamesrv.out
文件中没有新的内容,tail -f logs/mqnamesrv.out
命令就不会输出任何内容。
因此,等待一些时间后再执行 tail -f logs/mqnamesrv.out
命令,就可以确保 mqnamesrv
进程已经启动并开始输出日志信息,从而能够实时跟踪文件内容的变化。
2.2 启动Broker
同样进入 RocketMQ 安装目录下的 /bin目录进行操作。
(1)启动Broker
- 启动命令,注意:ip地址要配置成为服务的ip地址,保证地址以及端口能够访问
- nohup ./mqbroker -n 192.168.157.130:9876 & :属于后台以静默⽅式启动
- sh ./mqbroker -n 192.168.157.130:9876 :属于终端启动,直接输出日志信息,按 ctrl+c 可直接关闭退出
启动命令:
nohup ./mqbroker -n 192.168.157.130:9876 > logs/mqbroker.out 2>1 &
(2)查看日志
查看启动状态,启动之后同样提示将日志信息追加到了当前目录下的nohup.out文件中。
tail -f logs/mqbroker.out
看到以下表示启动成功
The broker[linux1, 192.168.109.149:10911] boot success. serializeType=JSON and name server is 192.168.109.149:9876
因为 mqbroker
进程需要一些时间来启动并输出日志信息到 logs/mqbroker.out
文件中。如果在 logs/mqbroker.out
文件中没有新的内容,tail -f logs/mqbroker.out
命令就不会输出任何内容。
可以尝试等待一段时间后再次查看日志,或者检查 mqbroker
进程是否已经成功启动。可以使用 ps -ef | grep mqbroker
命令来查看当前系统中是否有 mqbroker
进程正在运行,如果有的话,说明 mqbroker
进程已经成功启动。如果没有,则需要检查启动命令是否正确,或者检查启动过程中是否出现了错误。
(3)日志一直没反应
解决查看日志没反应:删除store里面的全部内容
#删除/root/store/*
cd /root/store
rm -rf *
# 重新启动broker
nohup ./mqbroker -n 192.168.157.130:9876 > logs/mqbroker.out 2>1 &
04 测试RocketMQ
发送/接收消息之前,需要告诉客户端(Producer、Consumer)名称服务器的位置,RocketMQ 提供了多种方法来实现这一点.
编程方式,如:producer.setNamesrvAddr(“ip:port”)
Java 选项,如:rocketmq.namesrv.addr
环境变量,如:NAMESRV_ADDR
HTTP 端点
- 测试消息发送
[root@linux1 rocketmq]# export NAMESRV_ADDR=localhost:9876
[root@linux1 rocketmq]# sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
OpenJDK 64-Bit Server VM warning: MaxNewSize (262144k) is equal to or greater than the entire heap (262144k). A new max generation size of 261632k will be used.
16:19:05.806 [main] DEBUG i.n.u.i.l.InternalLoggerFactory - Using SLF4J as the default logging framework
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
SendResult [sendStatus=SEND_OK, msgId=AC11000176396FF3C5B512F379FA0000, offsetMsgId=AC11000100002A9F0000000000000000, messageQueue=MessageQueue [topic=TopicTest, brokerName=linux1, queueId=3], queueOffset=0]
......
SendResult [sendStatus=SEND_OK, msgId=AC11000176396FF3C5B512F382B603E7, offsetMsgId=AC11000100002A9F00000000000317BF, messageQueue=MessageQueue [topic=TopicTest, brokerName=linux1, queueId=2], queueOffset=249]
16:19:08.609 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[172.17.0.1:10911] result: true
16:19:08.631 [NettyClientSelector_1] INFO RocketmqRemoting - closeChannel: close the connection to remote address[127.0.0.1:9876] result: true
- 测试消息接收
[root@linux1 rocketmq]# sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
OpenJDK 64-Bit Server VM warning: MaxNewSize (262144k) is equal to or greater than the entire heap (262144k). A new max generation size of 261632k will be used.
16:21:15.395 [main] DEBUG i.n.u.i.l.InternalLoggerFactory - Using SLF4J as the default logging framework
Consumer Started.
ConsumeMessageThread_3 Receive New Messages: [MessageExt [brokerName=linux1, queueId=2, storeSize=201, queueOffset=1, sysFlag=0, bornTimestamp=1659601146477, bornHost=/192.168.0.101:48216, storeTimestamp=1659601146478, storeHost=/172.17.0.1:10911, msgId=AC11000100002A9F000000000000057F, commitLogOffset=1407, bodyCRC=988340972, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=250, CONSUME_START_TIME=1659601275866, UNIQ_KEY=AC11000176396FF3C5B512F37A6D0007, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 55], transactionId='null'}]]
ConsumeMessageThread_4 Receive New Messages: [MessageExt [brokerName=linux1, queueId=2, storeSize=202, queueOffset=2, sysFlag=0, bornTimestamp=1659601146500, bornHost=/192.168.0.101:48216, storeTimestamp=1659601146501, storeHost=/172.17.0.1:10911, msgId=AC11000100002A9F00000000000008A4, commitLogOffset=2212, bodyCRC=2088767104, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=250, CONSUME_START_TIME=1659601275867, UNIQ_KEY=AC11000176396FF3C5B512F37A84000B, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 49, 49], transactionId='null'}]]
05 关闭RocketMQ
与启动顺序相反进行关闭,先关闭 broker、在关闭 nameserv
./mqshutdown broker
./mqshutdown namesrv