Centos7.9安装RocketMQ4.7.1并配置开机自启
一、前言
系统环境:CentOS Linux release 7.9.2009 (Core)
RocketMQ版本:4.7.1
我们会部署一套 RocketMQ 最小化的单机环境,包括一个 RocketMQ Namesrv 和 Broker 服务。部署完成之后,我们会测试消息的发送与消费。下面,让我们逐步开始。
二、前置条件
需要安装如下软件:
JDK 8+
Maven 3.2.X+(也可以在window环境下编译好)
64位操作系统,建议使用 Linux / Unix / Mac
因为我们准备直接编译 RocketMQ 源码,构建出 RocketMQ 软件包。
三、下载源码
打开 RocketMQ release_notes 页面,我们可以看到 RocketMQ 所有的发布版本。这里,我们选择最新的 RocketMQ 4.7.1 版本。点击进入该版本的发布页面后,我们可以看到两种发布版本:
一般情况下,我们可以直接使用 Binary 版本,它是 RocketMQ 已经编译好,可以直接使用的 RocketMQ 软件包。
这里,我们想编译一次 RocketMQ 源码,所以使用 Source 版本。下面,我们开始下载 RocketMQ 4.7.1 Source 源码。命令行操作如下:
# 下载 $ wget http://mirror.bit.edu.cn/apache/rocketmq/4.7.1/rocketmq-all-4.7.1-source-release.zip # 解压 $ unzip rocketmq-all-4.7.1-source-release.zip
四、编译源码
使用 Maven 编译 RocketMQ 源码。命令行操作如下:
# 进入 RocketMQ 源码目录 $ cd rocketmq-all-4.7.1-source-release # Maven 编译 RocketMQ ,并跳过测试。耐心等待... $ mvn -Prelease-all -DskipTests clean install -U
编译完成,会看到成功提示:
[INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] Apache RocketMQ 4.7.1 4.7.1 ........................ SUCCESS [ 9.105 s] [INFO] rocketmq-logging 4.7.1 ............................. SUCCESS [ 4.194 s] [INFO] rocketmq-remoting 4.7.1 ............................ SUCCESS [ 4.715 s] [INFO] rocketmq-common 4.7.1 .............................. SUCCESS [ 9.007 s] [INFO] rocketmq-client 4.7.1 .............................. SUCCESS [ 12.394 s] [INFO] rocketmq-store 4.7.1 ............................... SUCCESS [ 6.038 s] [INFO] rocketmq-srvutil 4.7.1 ............................. SUCCESS [ 1.107 s] [INFO] rocketmq-filter 4.7.1 .............................. SUCCESS [ 2.718 s] [INFO] rocketmq-acl 4.7.1 ................................. SUCCESS [ 2.494 s] [INFO] rocketmq-broker 4.7.1 .............................. SUCCESS [ 7.686 s] [INFO] rocketmq-tools 4.7.1 ............................... SUCCESS [ 4.845 s] [INFO] rocketmq-namesrv 4.7.1 ............................. SUCCESS [ 2.617 s] [INFO] rocketmq-logappender 4.7.1 ......................... SUCCESS [ 2.709 s] [INFO] rocketmq-openmessaging 4.7.1 ....................... SUCCESS [ 2.572 s] [INFO] rocketmq-example 4.7.1 ............................. SUCCESS [ 2.967 s] [INFO] rocketmq-test 4.7.1 ................................ SUCCESS [ 4.893 s] [INFO] rocketmq-distribution 4.7.1 4.7.1 .................. SUCCESS [ 25.021 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 01:45 min [INFO] Finished at: 2022-08-23T11:48:52+08:00 [INFO] ------------------------------------------------------------------------
在我们进入 distribution 目录下,就可以看到 RocketMQ 的发布包了。命令行操作如下:
# 进入 distribution 目录下 $ cd distribution/target/rocketmq-4.7.1/rocketmq-4.7.1 # 当前目录为:/usr/local/src/rocketmq-all-4.7.1-source-release/distribution/target/rocketmq-4.7.1/rocketmq-4.7.1 # 打印目录 [root@localhost rocketmq-4.7.1]# ll 总用量 40 drwxr-xr-x 2 root root 83 8月 23 13:14 benchmark # 性能基准测试 drwxr-xr-x 3 root root 4096 8月 23 13:14 bin # 执行脚本 drwxr-xr-x 6 root root 211 8月 23 13:14 conf # 配置文件 drwxr-xr-x 2 root root 4096 8月 23 13:14 lib # RocketMQ jar 包 -rw-r--r-- 1 root root 17336 8月 23 13:14 LICENSE -rw-r--r-- 1 root root 1338 8月 23 13:14 NOTICE -rw-r--r-- 1 root root 5069 8月 23 13:14 README.md [root@localhost rocketmq-4.7.1]#
五、启动 Namesrv
启动一个 RocketMQ Namesrv 服务。命令行操作如下:
$ nohup sh bin/mqnamesrv &
启动完成后,查看日志。
# 查看 Namesrv 日志。 $ tail -f ~/logs/rocketmqlogs/namesrv.log 2022-08-23 13:21:52 INFO main - The Name Server boot success. serializeType=JSON
默认情况下,Namesrv 日志文件所在地址为
~/logs/rocketmqlogs/namesrv.log
。如果想要自定义,可以通过conf/logback_namesrv.xml
配置文件来进行修改。
六、启动 Broker
在 conf 目录下,RocketMQ 提供了多种 Broker 的配置文件:
- broker.conf :单主,异步刷盘。
- 2m/ :双主,异步刷盘。
- 2m-2s-async/ :两主两从,异步复制,异步刷盘。
- 2m-2s-sync/ :两主两从,同步复制,异步刷盘。
- dledger/ :Dledger 集群,至少三节点。
这里,我们只启动一个 RocketMQ Broker 服务,所以使用 broker.conf 配置文件。命令行操作如下:
$ nohup sh bin/mqbroker -c conf/broker.conf -n 127.0.0.1:9876 &
- 通过 -c 参数,配置读取的主 Broker 配置。
- 通过 -n 参数,设置 RocketMQ Namesrv 地址。
启动完成后,查看日志:
$ tail -f ~/logs/rocketmqlogs/broker.log 2022-08-23 14:53:53 INFO main - The broker[broker-a, 192.168.1.87:10911] boot success. serializeType=JSON and name server is 127.0.0.1:9876
注意记下 192.168.1.87:10911 后面会使用这个broker地址。
如果提示找不到上面的日志文件,应该是没启动成功。
先看这个日志:
$ tail -f nohup.out Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000003c0000000, 17179869184, 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 17179869184 bytes for committing reserved memory. # An error report file with more information is saved as: # /usr/local/src/rocketmq-all-4.7.1-source-release/distribution/target/rocketmq-4.7.1/rocketmq-4.7.1/hs_err_pid22092.log
应该是内存不够,RocketMQ默认用8g内存,如果你服务器的内存比较小,可以修改下bin/runbroker.sh
脚本,将 Broker JVM 内存调小。如:JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g"
。
再次启动broker,可以正常启动。
默认情况下,Broker 日志文件所在地址为
~/logs/rocketmqlogs/broker.log
。如果想要自定义,可以通过conf/logback_broker.xml
配置文件来进行修改。
至此,我们已经完成了 RocketMQ 单机部署。下面,我们开始进行下消息的发送和消费的测试。
七、测试发送消息
在发送/接收消息之前,我们需要告诉客户名称服务器的位置。RocketMQ 提供了多种方法来实现这一点。为了简单起见,我们使用环境变量NAMESRV_ADDR
。通过使用 bin/tools.sh
工具类,实现测试发送消息。命令行操作如下:
# 设置 Namesrv 服务器的地址 export NAMESRV_ADDR=127.0.0.1:9876 # 执行生产者 Producer 发送测试消息 sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
如果发送成功,我们会看到大量成功的发送日志。
...... SendResult [sendStatus=SEND_OK, msgId=C0A808BC59F54DC639967497BA3403E6, offsetMsgId=C0A8015700002A9F00000000000316F4, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=2], queueOffset=249] SendResult [sendStatus=SEND_OK, msgId=C0A808BC59F54DC639967497BA3503E7, offsetMsgId=C0A8015700002A9F00000000000317BF, messageQueue=MessageQueue [topic=TopicTest, brokerName=broker-a, queueId=3], queueOffset=249]
发送结果为 sendStatus=SEND_OK
状态,说明消息都发送成功了。
八、测试消费消息
通过使用bin/tools.sh
工具类,实现测试消费消息。命令行操作如下:
# 设置 Namesrv 服务器的地址 export NAMESRV_ADDR=127.0.0.1:9876 # 执行消费者 Consumer 消费测试消息 sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
如果消费成功,我们会看到大量成功的消费日志。
ConsumeMessageThread_3 Receive New Messages: [MessageExt [brokerName=broker-a, queueId=3, storeSize=203, queueOffset=749, sysFlag=0, bornTimestamp=1661239759930, bornHost=/192.168.1.87:46058, storeTimestamp=1661239759930, storeHost=/192.168.1.87:10911, msgId=C0A8015700002A9F0000000000094808, commitLogOffset=608264, bodyCRC=1359908749, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=750, CONSUME_START_TIME=1661239759931, UNIQ_KEY=C0A808BC5CC04DC63996749EBC3A03E6, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 57, 57, 56], transactionId='null'}]] ConsumeMessageThread_19 Receive New Messages: [MessageExt [brokerName=broker-a, queueId=0, storeSize=203, queueOffset=749, sysFlag=0, bornTimestamp=1661239759931, bornHost=/192.168.1.87:46058, storeTimestamp=1661239759931, storeHost=/192.168.1.87:10911, msgId=C0A8015700002A9F00000000000948D3, commitLogOffset=608467, bodyCRC=638172955, reconsumeTimes=0, preparedTransactionOffset=0, toString()=Message{topic='TopicTest', flag=0, properties={MIN_OFFSET=0, MAX_OFFSET=750, CONSUME_START_TIME=1661239759932, UNIQ_KEY=C0A808BC5CC04DC63996749EBC3B03E7, CLUSTER=DefaultCluster, WAIT=true, TAGS=TagA}, body=[72, 101, 108, 108, 111, 32, 82, 111, 99, 107, 101, 116, 77, 81, 32, 57, 57, 57], transactionId='null'}]]
通过ConsumeMessageThread_3
和ConsumeMessageThread_19
线程名,我们可以看出,目前是进行并发消费消息。
九、关闭服务器
# sh bin/mqshutdown broker //停止 broker # sh bin/mqshutdown namesrv //停止 nameserver
关闭成功后如下:
[root@localhost rocketmq-4.7.1]# sh bin/mqshutdown broker The mqbroker(22848) is running... Send shutdown request to mqbroker(22848) OK [root@localhost rocketmq-4.7.1]# sh bin/mqshutdown namesrv The mqnamesrv(20705) is running... Send shutdown request to mqnamesrv(20705) OK
十、常命令
上面几个启动和关闭 name server 和 broker 的就不再说了,先进入bin目录:# cd bin
。
- 查看集群情况
./mqadmin clusterList -n 127.0.0.1:9876
- 查看 broker 状态
./mqadmin brokerStatus -n 127.0.0.1:9876 -b 192.168.1.87:10911
(注意换成你的 broker 地址) - 查看 topic 列表
./mqadmin topicList -n 127.0.0.1:9876
- 查看 topic 状态
./mqadmin topicStatus -n 127.0.0.1:9876 -t MyTopic
(换成你想查询的 topic) - 查看 topic 路由
./mqadmin topicRoute -n 127.0.0.1:9876 -t MyTopic
十一、rocketmq-dashboard 控制台
在 RocketMQ 拓展项目(rocketmq-externals) 中,早期包含了 RocketMQ Console 项目,现在改名为 (rocketmq-dashboard), 是 RocketMQ 的图形化管理控制台,提供 Broker 集群信息查看,Topic 管理,Producer、Consumer 信息展示,消息查询等等常用功能。
虽然说,我们也可以使用 RocketMQ 提供的 CLI Admin Tool 工具,实现上述的查询与管理的功能,但是命令行的方式对操作人员的要求稍高一些。当然,在 RocketMQ Console 无法满足我们更精细化的管理的需求的时候,我们还是会使用 CLI Admin Tool 工具。
下面,让我们来搭建一个 Rocketmq-dashboard 控制台。
克隆代码
将 rocketmq-dashboard 仓库的代码,克隆到本地。操作流程如下:
# 克隆代码 $ git clone https://github.com/apache/rocketmq-dashboard.git # 进入 Console 目录 $ cd rocketmq-dashboard-master
配置文件
如果胖友需要自定义 Rocketmq-Dashboard 的配置,可以进入该项目下的 src/main/resources/ 目录下,进行相应的配置文件修改。例如说,设置 RocketMQ Namesrv 地址,开启 Rocketmq-Dashboard 的登录访问。
这里,我们修改 src/main/resources/application.properties 配置文件,通过设置 rocketmq.config.namesrvAddr=127.0.0.1:9876 配置项,设置 RocketMQ Namesrv 的访问端口:server.port=9877。
编译源码
使用 Maven 编译 Rocketmq-Dashboard 源码。命令行操作如下:
# 编译 mvn clean package -Dmaven.test.skip=true
看到如下信息代表编译成功:
[INFO] --- spring-boot-maven-plugin:2.6.0:repackage (default) @ rocketmq-dashboard --- [INFO] Replacing main artifact with repackaged archive [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 47.516 s [INFO] Finished at: 2022-08-26T09:22:01+08:00 [INFO] ------------------------------------------------------------------------
启动控制台
由于是springboot2.6.0项目,直接以 jar 的方式,启动控制台。注意,控制台使用 9877 端口。命令行操作如下:
nohup java -jar rocketmq-dashboard-1.0.1-SNAPSHOT.jar &
启动完成后,查看日志。
[2022-08-26 09:53:55.036] INFO main - No active profile set, falling back to default profiles: default [2022-08-26 09:53:58.034] INFO main - setNameSrvAddrByProperty nameSrvAddr=127.0.0.1:9876 [2022-08-26 09:53:58.483] INFO main - Tomcat initialized with port(s): 9877 (http) [2022-08-26 09:53:58.508] INFO main - Initializing ProtocolHandler ["http-nio-9877"] [2022-08-26 09:53:58.509] INFO main - Starting service [Tomcat] [2022-08-26 09:53:58.510] INFO main - Starting Servlet engine: [Apache Tomcat/9.0.55] [2022-08-26 09:53:58.648] INFO main - Initializing Spring embedded WebApplicationContext [2022-08-26 09:53:58.648] INFO main - Root WebApplicationContext: initialization completed in 3490 ms [2022-08-26 09:54:00.195] INFO main - Adding welcome page: class path resource [static/index.html] [2022-08-26 09:54:00.661] INFO main - Exposing 1 endpoint(s) beneath base path '/actuator' [2022-08-26 09:54:00.718] INFO main - Starting ProtocolHandler ["http-nio-9877"] [2022-08-26 09:54:00.743] INFO main - Tomcat started on port(s): 9877 (http) with context path '' [2022-08-26 09:54:00.771] INFO main - Started App in 6.597 seconds (JVM running for 8.127)
当看到如上日志,说明 Console 控制台启动完成。
简单使用
使用浏览器,访问 http://127.0.0.1:9877/ 地址,我们就可以看到 Rocketmq-Dashboard 的界面。
十二、开机自启动
权限设置:
chmod a+x /usr/local/rocketmq/bin/mqnamesrv chmod a+x /usr/local/rocketmq/bin/mqbroker
1、namesrv 设置
在/lib/systemd/system/目录下新建 rocketmq-namesrv.service 文件,内容如下:
[Unit] Description=RocketMQ Namesrv After=network.target remote-fs.target nss-lookup.target [Service] Type=sample User=root ExecStart=/usr/local/rocketmq/bin/mqnamesrv ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID Restart=0 LimitNOFILE=65536 [Install] WantedBy=multi-user.target
2、broker 设置
在/lib/systemd/system/目录下新建 rocketmq-broker.service 文件,内容如下:
[Unit] Description=rocketmq-broker After=network.target [Service] Type=sample User=root ExecStart=/usr/local/rocketmq/bin/mqbroker -c /usr/local/rocketmq/conf/broker.conf -n 127.0.0.1:9876 ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID Restart=0 LimitNOFILE=65536 [Install] WantedBy=multi-user.target
3、rocketmq-dashboard 设置
在/lib/systemd/system/目录下新建 rocketmq-dashboard.service 文件,内容如下:
[Unit] Description=rocketmq-broker After=network.target [Service] Type=sample User=root ExecStart=/usr/bin/java -jar /usr/local/rocketmqDashboard/rocketmq-dashboard-1.0.1-SNAPSHOT.jar ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID Restart=0 LimitNOFILE=65536 [Install] WantedBy=multi-user.target
4、开启开机自启
#重新加载服务的配置文件
systemctl daemon-reload
#开启
systemctl start rocketmq-broker.service
systemctl start rocketmq-namesrv.service
systemctl start rocketmq-dashboard.service
#停止
systemctl stop rocketmq-broker.service
systemctl stop rocketmq-namesrv.service
systemctl stop rocketmq-dashboard.service
#启用开机启动
systemctl enable rocketmq-broker.service
systemctl enable rocketmq-namesrv.service
systemctl enable rocketmq-dashboard.service
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析