RocketMQ4.4.0搭建过程记录

版本选型

https://zhuanlan.zhihu.com/p/573949726

官方demo

https://rocketmq.apache.org/zh/docs/quickStart/01quickstart/

官方部署方案选型

https://rocketmq.apache.org/zh/docs/deploymentOperations/01deploy

rocketmq-client官方支持

https://github.com/apache/rocketmq-clients/tree/rocketmq-client-java-5.0.0/java

官方只提供5.0以上的原生客户端支持,而且JDK需要11+,不适用公司框架

RocketMQ4.4.0搭建过程记录_第1张图片

我司采用4.4.0版本,选用rocketmq-spring-boot-starter客户端sdk包

		
        
            org.apache.rocketmq
            rocketmq-spring-boot-starter
            2.0.2
            
                
                    fastjson
                    com.alibaba
                
            
        

本地环境部署:

ip:192.168.1.214

踩坑笔记:

进入官网下载的二进制包解压目录:

cd /usr/local/ksb/rocketmq-all-4.4.0-bin-release/

  1. 启动namesrv路由服务: (类似于nacos服务发现和注册中心)

sudo nohup sh bin/mqnamesrv -n 192.168.1.214:9876 &

sudo tail -f /root/logs/rocketmqlogs/namesrv.log

查看端口是否正常开放:

netstat -ntlp | grep 9876

坑1:服务启动命令没有效果, 在当前目录nohub.out日志里,发现提示日志目录不存在

需要root权限执行, 统一加上sudo

坑2:服务启动命令依旧没有效果, 查看nohup.out日志文件, 提示JAVA_HOME没配置:

mjs@test-reguler:/usr/local/ksb/rocketmq-all-4.4.0-bin-release$ which java
/usr/lib/jvm/java-8-openjdk-amd64/bin/java

环境变量配置

sudo vi /etc/profile

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

export JRE_HOME=${JAVA_HOME}/jre

export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

export PATH=${JAVA_HOME}/bin:$PATH

export NAMESRV_ADDR=127.0.0.1:9876

source /etc/profile

echo $JAVA_HOME

echo $NAMESRV_ADDR

再次依然没有用......

官方文档并没有交代这个问题, 查看mqnamesrv启动文件源码, 发现这行[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java[疑问]

不理解官方为何又把JAVA_HOME默认配置为/usr/java路径

于是手动修改bin/目录下runserver.sh和runbroker.sh文件里的JAVA_HOME变量配置:

#[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java

[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64

修改启动配置内存

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

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

#!/bin/sh

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

#===========================================================================================
# Java Environment Setting
#===========================================================================================
error_exit ()
{
    echo "ERROR: $1 !!"
    exit 1
}

[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
# [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"

export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}

#===========================================================================================
# JVM Configuration
#===========================================================================================
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8  -XX:-UseParNewGC"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT}  -XX:-UseLargePages"
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
#JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"
JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"
JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"

$JAVA ${JAVA_OPT} $@

  1. 启动broker服务: (同时承担计算和存储的功能, 5.0之后拆分为代理proxy和broker存储组件, 更利于云原生环境下的资源解耦)

sudo nohup sh bin/mqbroker -n 192.168.1.214:9876 -c conf/broker.conf autoCreateTopicEnable=true &

sudo tail -f /root/logs/rocketmqlogs/broker.log

查看端口是否正常开放:

netstat -ntlp | grep 10909

netstat -ntlp | grep 10911

  1. 启动管理后台:

sudo docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.1.214:9876" -p 8782:8080 -t apacherocketmq/rocketmq-dashboard:latest

http://192.168.1.214:8782/#/

再次启动:

sudo docker run -d --name rocketmq-dashboard -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.1.214:9876" -p 8782:8080

  1. 查看进程:

ps -aux | grep rocket

mjs@test-reguler:~$ ps -aux | grep rocket
root       425  0.0  0.0   4636   812 ?        S    Feb17   0:00 sh /usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/runserver.sh org.apache.rocketmq.namesrv.NamesrvStartup -n 192.168.1.214:9876
root       438  0.1  0.6 3795328 211288 ?      Sl   Feb17   1:49 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC -verbose:gc -Xloggc:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails -XX:-OmitStackTraceInFastThrow -XX:-UseLargePages -Djava.ext.dirs=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext:/usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/../lib -cp .:/usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/../conf: org.apache.rocketmq.namesrv.NamesrvStartup -n 192.168.1.214:9876
root      3147  0.0  0.0   4636   824 ?        S    Feb17   0:00 sh /usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/runbroker.sh org.apache.rocketmq.broker.BrokerStartup -n 192.168.1.214:9876 -c conf/broker.conf autoCreateTopicEnable=true
root      3184  2.5  1.3 5766664 438064 ?      Sl   Feb17  35:16 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -server -Xms256m -Xmx256m -Xmn128m -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:MaxDirectMemorySize=15g -XX:-UseLargePages -XX:-UseBiasedLocking -Djava.ext.dirs=/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext:/usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/../lib -cp .:/usr/local/ksb/rocketmq-all-4.4.0-bin-release/bin/../conf: org.apache.rocketmq.broker.BrokerStartup -n 192.168.1.214:9876 -c conf/broker.conf autoCreateTopicEnable=true
root      8940  0.0  0.0   4336   736 ?        Ss+  Feb17   0:00 sh -c java $JAVA_OPTS -jar /rocketmq-dashboard.jar
root      9718  0.3  0.8 12057696 264940 ?     Sl+  Feb17   5:18 java -Drocketmq.namesrv.addr=192.168.1.214:9876 -jar /rocketmq-dashboard.jar
mjs       9802  0.0  0.0  13140  1048 pts/2    S+   16:22   0:00 grep --color=auto rocket

  1. 官方测试用例:

sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

  1. 关闭服务:

sudo sh bin/mqshutdown broker

sudo sh bin/mqshutdown namesrv

  1. 在java客户端服务上调试

坑3:在服务器上可以收发消息,但外部java客户端连接提示超时:

org.springframework.messaging.MessagingException: sendDefaultImpl call timeout;

修改超时时间配置为6s后解决,首次发送同时要创建主题较慢:

# 消息发送超时时长,默认3s
rocketmq.producer.send-message-timeout=6000

题外话: 在亲手搭建完后, 再回过头比较一下ChatGPT给出的答案是怎么样的?

第一次较模糊的提问:

RocketMQ4.4.0搭建过程记录_第2张图片

以下是ChatGPT答复内容:

1、下载和解压RocketMQ
首先,下载RocketMQ最新发布的压缩包。可以在官网查看最新发布链接:http://rocketmq.apache.org/release_notes/release-notes-4-7-1/。解压之后会得到一个名为rocketmq-all-4.7.1-bin-release.zip的文件,这里下载的是4.7.1版本。解压到你想要的文件夹中。

2、准备环境和Java
RocketMQ需要先准备环境,包括Java和Linux环境,先安装JDK 8或者更新版本的Java,建议Java 8。

3、配置环境变量
在Linux下,需要修改/etc/profile文件,将RocketMQ的安装路径,以及JAVA_HOME的路径定义到文件中:

export ROCKETMQ_HOME=/opt/rocketmq
export PATH=$ROCKETMQ_HOME/bin:$JAVA_HOME/bin:$PATH

4、启动NameServer
NameServer即服务器节点,需要修改RocketMQ源码中conf目录下的2个配置文件: broker.conf和namesrv.conf。

- 先修改broker.conf,注释掉broker启动配置部分
- 然后修改,namesrv.conf,修改NameServer启动端口,默认9876

修改完之后,在安装文件夹中运行如下命令:

sh mqnamesrv

即可启动NameServer。

5、启动broker
在RocketMQ安装目录中,修改conf/2个配置文件,broker.conf和namesrv.conf,在和上面步骤相反的顺序下进行操作,先解开broker的配置注释,注意修改几个参数:

broker.name=default_broker  // 修改broker名称
broker.id=0  // 修改broker ID

然后再配置namesrv.conf,添加NameServer端口,默认为9876:

#在这里配置NameServer地址
namesrv.addr=127.0.0.1:9876

修改完毕后,在安装路径中运行如下命令:

sh mqbroker -n 127.0.0.1:9876

即可启动broker。

6、启动监控中心
RocketMQ提供了方便的监控中心,可以用来监控broker和nameServer的状态,监控中心可在conf文件中进行配置,具体的配置可查看官方文档,通常配置如下:

# Web 监控中心配置
# web.resources 是web资源文件路径,将静态资源解压到该路径
web.resources=/opt/rocketmq/web
# web.port配置监控中心的端口号
web.port=8080
# web.context 配置web启动的根路径
web.context=/

web.resources目录中有个文件,rocketmq-plugins.tgz,解压到web.resources的目录,修改完配置后,运行如下命令:

sh mqweb

即可启动监控中心web页面,即可使用浏览器打开:http://localhost:8080 来访问监控中心,进行相关操作。

7、停止和启动
在RocketMQ安装路径下运行如下命令,进行停止或启动:

停止运行:
sh mqshutdown

开始运行:

sh mqstart

以上就是RocketMQ安装和启动的全部过程,一般来说安装和启动还是比较简单的,写文件和修改配置对环境有要求,这点需要注意一下。

第二次较精准的提问?

RocketMQ4.4.0搭建过程记录_第3张图片
1. 访问Apache RocketMQ 主页,https://rocketmq.apache.org/,选择“download”,下载 RocketMQ v4.4.0 的部署文件。

2. 将 apache-rocketmq-4.4.0-bin-release.zip 文件解压到你的机器上,假设解压目录为/opt/rocketmq。

3. 创建软件目录,在 /usr/local 下面创建一个 rocketmq 的文件夹,并将刚才解压的文件 rocketmq-4.4.0 复制到这个文件夹;

4. 导入RocketMQ环境变量,让系统能够知道RocketMQ的安装目录,编辑 profile 文件:

vi /etc/profile

增加以下语句: 
export ROCKETMQ_HOME=/usr/local/rocketmq
export PATH = $PATH:$ROCKETMQ_HOME/bin

保存profile 文件后,使配置文件生效:

source /etc/profile 

5. 修改 bin 目录下的 runbroker.sh 文件,将 JAVA_HOME 设置为 JDK的安装目录:

vi $ROCKETMQ_HOME/bin/runbroker.sh

修改其中的 JAVA_HOME 配置,例如: 
-export JAVA_HOME=/usr/local/jdk8

6. 配置 NameServer 地址,打开 conf 目录下的 2个配置文件broker.conf和namesrv.conf,分别将里面的 IP 设置为服务器的当前 IP 地址 。

7. 启动 NameServer,cd 到 RocketMQ 目录下的 bin 目录,然后运行:

sh mqnamesrv & 

8. 启动 Broker,cd 到 RocketMQ 目录下的 bin 目录,然后运行:

sh mqbroker -n localhost:9876 &

9. 查看启动结果,可以使用 jps 命令查看当前进程中有没有名为“NameServer”和“Broker”的进程,即可知道 RocketMQ 已经启动成功了


###  前台启动
1.停止RocketMQ服务,在bin目录下执行命令
```
./mqshutdown broker
```


2.启动RocketMQ服务,在bin目录下执行命令
```
./mqbroker -n localhost:9876 
```
![](img/1.jpg)


###  后台启动

1.停止RocketMQ服务,在bin目录下执行命令
```
./mqshutdown broker
```
2. 后台启动,可以使用 nohup 命令运行 Broker: 
```
nohup sh mqbroker -n localhost:9876  &
```
如果需要查看启动日志可以用 tail 命令:
```
tail -f ~/logs/rocketmqlogs/broker.log
```


## 
#### 四:常见问题


1.mqshutdown 移除broker失败,提示绑定的实例数为0
解决方案:
打开namesrv的配置文件 `$ROCKETMQ_HOME/conf/namesrv.conf`,查看日志
```
#是否开启DeleteTopic流程删除topic,建议关闭,避免误操作
enablePropertyFilter=false
```

把上面的值改为`enablePropertyFilter=true`
然后重启mqnameerver


2.停止Broker失败,报错信息`Failed to invoke the command, please check if the Native Process Plugin is enabled`
解决方案:
编辑broker的配置文件 `/conf/broker.conf`,查看日志
```
#最大允许的broker拉取的未被消费的消息的总字节数 getMaxAccumulation。当设置为-1,则不拉取
#maxAccumulationMsgByteSize=-1
```

把上面的值改为`maxAccumulationMsgByteSize=1638400`
然后重启mqbangker即可。


3. Broker 日志中报 `No route info of this topic`的错误。

解决方案:使用 DefaultMQAdmin 这个工具,设置 Topic 名字的可见性:
```
sh mqadmin updateTopic
```


4. Broker 启动失败,报错信息`Start mqbroker failed`

解决方案: 
1. 打开 `conf` 目录下的 2个配置文件broker.conf和namesrv.conf,查看`brokerIP1`和`brokerIP2`配置项是否正确。
2. 确认相应的端口号是否已经打开, 可以使用 `netstat -an` 命令查看。

可以看出确实能提升自己去网上查资料的效率,有些操作的坑也已经直接给出了答案(但没有交代为什么这么做的背景), 虽然太细节的基础问题还是得开发自己去排查.

可以提升查询文档的效率,过滤掉网上的信息噪音是值得肯定的.

你可能感兴趣的:(技术杂记,java-rocketmq,rocketmq,java)