RocketMQ部署

简介

最近在学习RocketMQ,但一直苦于没有合适的环境学习。我的电脑是Windows系统,虽然换上了专业版装上了Docker,而且也有虚拟机,平常也会通过这些环境学习,但是还是太不方便了,为了方便终于又用上了云服务器,这次是阿里的。

配置如下

CPU&内存 1核(vCPU)2 GiB

操作系统 CentOS 7.8 64位

当前使用带宽 1Mbps

这次RocketMQ的配置包括,RocketMQ(NameServer、Broker)和控制台RocketMQ-Dashboard

提要:基础的JDKMaven这里不多提了,都安装配置好了,另外后面的RocketMQ-Dashboard采用Docker部署方式,Docker安装查看官网装上就好。

RocketMQ

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

准备RocketMQ安装包

官网提供有二进制包和源码包,区别是:源码包通过编译成为二进制包才可运行

这里直接准备rocketmq-all-5.0.0-bin-release.zip二进制包

创建目录并解压

选好目录解压

如果缺少zipunzip,直接用下面命令安装

1
yum install -y unzip zip

然后解压即可

1
unzip rocketmq-all-5.0.0-bin-release.zip

解压后就有rocketmq-all-5.0.0-bin-release

修改配置

https://blog.csdn.net/qq359605040/article/details/124272238

官网启动方法在下面,建议先修改启动配置,不然很可能启动失败

先修改nameserver启动配置

1
vim bin/runserver.sh

原有配置我已经注释掉了#JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

这个配置对于机器配置很高,所以我将配置改成下面的一行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
choose_gc_options()
{
# Example of JAVA_MAJOR_VERSION value : '1', '9', '10', '11', ...
# '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
#JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
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:${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
#JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -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
}

接下来是broker启动配置

1
vim bin/runbroker.sh

同样被注释的是#JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"把参数改小了一些

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

#JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m"
choose_gc_options
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=15g"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"
JAVA_OPT="${JAVA_OPT} -Drocketmq.client.logUseSlf4j=true"
#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}"

最后修改broker配置

https://blog.csdn.net/zhwyj1019/article/details/81082254

修改此配置主要原因是可能出现上面链接的情况

1
vim conf/broker.conf

添加后面的两行配置,我这里用的是阿里云服务器IP

1
2
3
4
5
6
7
8
9
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
namesrvAddr=IP:9876
brokerIP1=IP

启动NameServer

1
2
3
4
5
6
## 启动namesrv
$ nohup sh bin/mqnamesrv &

## 验证namesrv是否启动成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...

启动Broker+Proxy

NameServer成功启动后,我们启动Broker和Proxy,5.x 版本下我们建议使用 Local 模式部署,即 BrokerProxy 同进程部署。5.x 版本也支持 BrokerProxy 分离部署以实现更灵活的集群能力。详情参考部署教程

1
2
3
4
5
6
## 先启动broker
$ nohup sh bin/mqbroker -n localhost:9876 --enable-proxy &

## 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a
$ tail -f ~/logs/rocketmqlogs/broker_default.log
The broker[broker-a,192.169.1.2:10911] boot success...

RocketMQ-Dashboard

https://github.com/apache/rocketmq-dashboard

官网有docker和源码两种部署方式,这里使用docker部署,而且我也非常推荐这种方式,方便简单

拉取镜像

1
docker pull apacherocketmq/rocketmq-dashboard:latest

启动

这里把ip修改为阿里云服务器的ip,因为我试了好多次总是存在RemotingConnectException异常,目前这样做是没问题的,而且要注意这里的docker内部端口不要改,因为这个镜像就是运行在8080端口的,外部无所谓

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

防火墙与安全组

对于我们本地搭建的服务进程,本地访问是都是无感的,但是一旦用到了云服务器或是其他虚拟机不同ip服务进程,就要注意防火墙和安全组了。

防火墙常用操作

1
2
3
4
5
6
7
firewall-cmd --zone=public --add-port=8080/tcp --permanent  (--permanent永久生效,没有此参数重启后失效)

firewall-cmd --zone=public --list-ports (查看所有开启的端口)

firewall-cmd --zone=public --remove-port=8080/tcp --permanent (删除端口)

firewall-cmd --reload (重启生效配置)

查看端口

1
netstat -ntulp |grep 80

安全组

安全组的话针对云服务器,我们开放了防火墙后还需要到对应的云服务管理台开放对应端口,我们才可以正常访问。