整理一下RocketMQ在Linux上的安装

前言:

最近在学习消息中间件相关的知识,然后看见了一款叫RocketMq 的中间件用的比较多,就学习了解了下。在学习的过程中,感觉RocketMq 老是需要自己手动去启动,想想自己有台快到期的服务器(Linux服务器)可以废物利用一下,以下是RocketMq 在Linux服务(CentOS)上的部署安装过程

准备工作:

  • 64位的操作系统[64bit OS, Linux/Unix/Mac is recommended;(Windows user see guide below)](必须)
  • 64位的Java环境[64bit JDK 1.8+;](必须)
  • Maven环境[Maven 3.2.x;](可选,如果使用的是源码编译,必须要)
  • 足够的内存空间[4g+ free disk for Broker server](可选,生产环境最好在4G以上)

Java环境的准备

可参考该文章上的配置即可:https://www.jnssd.com/2021/04/01/编程整理/#Java-相关环境配置项

Maven环境的准备

在Linux环境中安装

  • 下载

    下载地址:http://maven.apache.org/download.cgi

    1
    2
    # 这里的下载带了参数 --no-check-certificate,如果下载的时候报错可带上
    $ wget --no-check-certificate https://dlcdn.apache.org/maven/maven-3/3.8.4/binaries/apache-maven-3.8.4-bin.tar.gz
  • 解压并配置环境

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 解压
    $ tar -zxvf apache-maven-3.8.4-bin.tar.gz

    # 配置环境变量
    ## 编辑/etc下的profile文件
    $ sudo nano /etc/profile 或者 vim nano /etc/profile

    ## 在profile文件追加如下信息(/opt/software/apache-maven-3.8.4是你服务器上面的maven解压地址)
    export MAVEN_HOME=/opt/software/apache-maven-3.8.4
    export PATH=$PATH:$MAVEN_HOME/bin

    # 使环境变量生效
    $ sudo source /etc/profile
  • 配置maven中央仓库和本地仓库地址

    在maven的解压目录下settings.xml文件中找到如下信息并修改

    1
    [jiang@jnssd apache-maven-3.8.4]$ nano conf/settings.xml

    配置本地仓库地址

    在settings.xml文件中找到 localRepository关键字,添加如下信息:

    1
    <localRepository>/opt/software/apache-maven-3.8.4/repo</localRepository>

    备注:/opt/software/apache-maven-3.8.4/repo即maven仓库在系统中的本地地址

    配置maven仓库的中心地址,即maven从哪里拉包,这里使用阿里云镜像(国内使用比较快)

    在settings.xml文件中找到 mirrors关键字,在该标签内追加如下信息:

    1
    2
    3
    4
    5
    6
    <mirror>
    <id>alimaven</id>
    <mirrorOf>central</mirrorOf>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </mirror>
  • 校验maven环境

    1
    2
    3
    4
    5
    6
    7
    8
    [jiang@jnssd ~]$ clear
    [jiang@jnssd ~]$ mvn -v
    Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537)
    Maven home: /opt/software/apache-maven-3.8.4
    Java version: 1.8.0_211, vendor: Oracle Corporation, runtime: /opt/software/jdk1.8.0_211/jre
    Default locale: en_US, platform encoding: UTF-8
    OS name: "linux", version: "3.10.0-1127.19.1.el7.x86_64", arch: "amd64", family: "unix"

RocketMQ的安装

下载:下载页面:https://rocketmq.apache.org/docs/quick-start/

下载解压并编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 下载
$ wget https://downloads.apache.org/rocketmq/4.9.2/rocketmq-all-4.9.2-source-release.zip

# 解压
$ unzip rocketmq-all-4.9.2-source-release.zip

## 如果没有unzip命令,使用 yum install -y unzip 安装

# 进入目录编译项目
$ cd rocketmq-all-4.9.2/
$ mvn -Prelease-all -DskipTests clean install -U

# 进到编译后的文件目录
$ cd distribution/target/rocketmq-4.9.2/rocketmq-4.9.2

# 该目录下的就是编译后的相关文件
[jiang@jnssd rocketmq-4.9.2]$ ll
total 52
drwxrwxr-x 2 jiang jiang 4096 Dec 31 11:47 benchmark
drwxr-xr-x 3 jiang jiang 4096 Dec 31 14:23 bin
drwxr-xr-x 6 jiang jiang 4096 Oct 22 13:41 conf
drwxrwxr-x 2 jiang jiang 4096 Dec 31 11:47 lib
-rw-r--r-- 1 jiang jiang 17327 Oct 22 13:41 LICENSE
-rw-r--r-- 1 jiang jiang 1338 Oct 22 13:41 NOTICE
-rw-r--r-- 1 jiang jiang 5342 Oct 22 13:41 README.md

注:如果是测试环境,最好修改下RocketMQJava虚拟机的内存大小,RocketMQ默认的是4g,进入bin目录分别修改以下几个文件的内存值:

1
2
3
4
5
6
7
8
9
10
11
12
# 查找sh脚本中的JVM参数设置:
$ find . -name '*.sh' | xargs egrep 'Xms'

## 输入命令得到如下信息
[jiang@jnssd bin]$ find . -name '*.sh' | xargs egrep 'Xms'
./runserver.sh: JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
./runserver.sh: JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
./runbroker.sh:JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"
./dledger/fast-try.sh: export JAVA_OPT_EXT=" -Xms512m -Xmx512m "
./dledger/fast-try.sh: export JAVA_OPT_EXT=" -Xms1g -Xmx1g "
./tools.sh:JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"

需要修改的文件有:runserver.shrunbroker.shtools.sh,修改值如下(修改前记得先备份相应脚本,具体JVM大小根据实际情况设定):

  • runserver.sh文件(该文件需根据jdk版本修改)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # '1' means releases befor Java 9
    JAVA_MAJOR_VERSION=$("$JAVA" -version 2>&1 | sed -r -n 's/.* version "([0-9]*).*$/\1/p')
    if [ -z "$JAVA_MAJOR_VERSION" ] || [ "$JAVA_MAJOR_VERSION" -lt "9" ] ; then
    # 这里是jdk9版本以前的修改值
    JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -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:${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
    JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
    else
    # 这里是jdk9版本以后的修改值
    JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
    JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0"
    JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log:time,tags:filecount=5,filesize=30M"
    fi

    # jdk9版本以前修改后为
    JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

    # jdk9版本以后修改后为
    JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
  • runbroker.sh文件

    1
    2
    3
    4
    5
    # 修改前
    JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"

    # 修改后
    JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m"
  • tools.sh文件

    1
    2
    3
    4
    5
    # 修改前
    JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"

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

启动和关闭Name Server

1
2
3
4
5
6
7
8
9
10
11
12
13
# 后台启动
$ nohup sh bin/mqnamesrv >/dev/null 2>&1 &

# 关闭Name Server
$ sh bin/mqshutdown namesrv

# 查看进程 NamesrvStartup 就是刚刚启动的服务
[jiang@jnssd bin]$ jps
2763 NamesrvStartup
2782 Jps

# 查看name Server的日志
$ tail -f ~/logs/rocketmqlogs/namesrv.log

Name Server的默认端口为9876,运行sh bin/mqnamesrv -p可查看Name Server的配置项,并可通过-c namesrv.conf方式指定配置文件启动;

RocketMQ的默认日志路径为~/logs/rocketmqlogs/

可以将启动Name Server命令保存为脚本,以方便下次启动。

启动和关闭Broker

启动Broker时需要指定要连接的Name Server:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 后台启动
$ nohup sh bin/mqbroker -n localhost:9876 >/dev/null 2>&1 &

# 关闭Broker
$ sh bin/mqshutdown broker

# 查看进程 BrokerStartup 就是刚刚启动的服务
[jiang@jnssd bin]$ jps
2802 BrokerStartup
2874 Jps
2763 NamesrvStartup


# 查看Broker的日志
$ tail -f ~/logs/rocketmqlogs/broker.log

连接时报No route info of this topic: XXpic错误

注:如果在代码中连接MQ报如下错误(No route info of this topic: pc):

1
2
3
4
5
6
Caused by: org.apache.rocketmq.client.exception.MQClientException: No route info of this topic: pc
See http://rocketmq.apache.org/docs/faq/ for further details.
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:685)
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1343)
at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:344)
at org.apache.rocketmq.spring.core.RocketMQTemplate.syncSend(RocketMQTemplate.java:555)

请以以下命令的形式启动Broker

1
$ nohup sh bin/mqbroker -n localhost:9876 autoCreateTopicEnable=true >/dev/null 2>&1 &

RocketMQ配置远程连接访问

  • 修改RocketMQ目录下conf文件夹中的broker.conf配置文件

    1
    [jiang@jnssd rocketmq-4.9.2]$ nano conf/broker.conf
  • 添加如下信息

    1
    2
    3
    4
    5
    6
    namesrvAddr = 需要连接的RocketMQ服务器IP地址:9876
    brokerIP1 = 需要连接的RocketMQ服务器IP地址

    # 如果,当前RocketMQ服务器IP地址是:220.181.38.148,配置如下
    namesrvAddr = 220.181.38.148:9876
    brokerIP1 = 220.181.38.148
  • 以配置文件形式启动Broker

    1
    $ nohup sh bin/mqbroker -n 220.181.38.148:9876 autoCreateTopicEnable=true -c conf/broker.conf >/dev/null 2>&1 &

    注:启动命令中的-c必须包含,不然照着某篇博客中的无法启动(踩坑经历,无语)

配置RocketMQ监控页面

下载RocketMQ DashBoard看板

1
$ git clone https://github.com/apache/rocketmq-dashboard.git

修改nameserver地址

进入rocketmq-dashboard目录下的src/main/resources下,修改application.properties中的namesrvAddrs地址为RocketMQ服务地址

1
2
3
4
5
$ nano src/main/resources/application.properties

# 修改namesrvAddrs属性值如下

rocketmq.config.namesrvAddrs=127.0.0.1:9876

maven编译并启动spring boot

1
$ mvn spring-boot:run

如果需要maven编译打包运行

1
2
$ mvn clean package -Dmaven.test.skip=true
$ java -jar target/rocketmq-dashboard-1.0.1-SNAPSHOT.jar

如果编译到yarn时报错,需要安装Node环境和Yarn环境,

  • 下载nodejs

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12

    #V8.x:
    $ curl --silent --location https://rpm.nodesource.com/setup_8.x | bash -

    #V7.x:
    $ curl --silent --location https://rpm.nodesource.com/setup_7.x | bash -

    #V6.x:
    $ curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -

    #V5.x:
    $ curl --silent --location https://rpm.nodesource.com/setup_5.x | bash -
  • yum安装nodejs

    1
    $ yum install -y nodejs
  • 下载

    1
    $ curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
  • 安装

    1
    $ sudo yum install yarn