rocketMQ简单部署

本文详细介绍了如何安装RocketMQ,包括源码包编译问题,启动NameServer时的内存调整,JVM配置(如垃圾回收器选择和日志设置),以及如何使用SDK进行消息收发。
摘要由CSDN通过智能技术生成

RocketMQ简单使用

1.安装

  • 官网下载RocketMQ二进制包,解压后可以直接运行。

    unzip rocketmq-all-5.2.0-bin-release.zip
    
  • 安装源码包,在编译的过程中可能出错(未解决),不推荐。

2.启动NameServer

cd rocketmq-all-5.2.0-bin-release
## 启动namesrv
nohup sh bin/mqnamesrv &
最后的&代表后台运行

按照官方教程直接启动,会出现错误

image-20240321095633654

显示忽略输入并且将输出添加到nohup.out文件中。

vim nohup.out查看该文件, :q退出

image-20240321095837044

由此可知是因为系统无法分配给JVM足够的内存空间所导致,那么我们需要修改对应配置文件中分配的内存大小。

如果不是因为这个问题,那么还有可能是因为没有配置java环境导致启动失败,需要安装java环境并且配置JAVA_HOME,由此runserver.sh才能获取到对应JAVA的目录。

runserver.sh

查看runServer.sh文件

1.JAVA环境配置

第一部分是关于java环境的设置,这一部分是通过检查环境变量JAVA_HOME是否存在

image-20240321101259984

# 定义一个错误退出函数,用于在出现错误时输出错误信息并退出程序
error_exit ()
{
    echo "ERROR: $1 !!" # 输出错误信息
    exit 1 # 退出程序
}

# 定义一个查找JAVA_HOME的函数
find_java_home()
{
    # 根据操作系统类型进行不同的处理
    case "`uname`" in
        Darwin) # 如果是Mac系统
          if [ -n "$JAVA_HOME" ]; then # 如果环境变量JAVA_HOME已经设置
              JAVA_HOME=$JAVA_HOME # 直接使用已设置的JAVA_HOME
              return # 结束函数
          fi
            JAVA_HOME=$(/usr/libexec/java_home) # 使用系统命令获取JAVA_HOME
        ;;
        *) # 其他系统
            JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac)))) # 通过查找javac命令的位置来获取JAVA_HOME
        ;;
    esac
}

# 调用find_java_home函数
find_java_home

# 检查JAVA_HOME是否设置正确
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java # 如果JAVA_HOME没有设置正确,尝试使用$HOME/jdk/java作为JAVA_HOME
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java # 如果仍然没有设置正确,尝试使用/usr/java作为JAVA_HOME
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!" # 如果仍然没有设置正确,输出错误信息并退出程序

# 导出JAVA_HOME和JAVA环境变量
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"

# 设置BASE_DIR为当前脚本所在目录的上一级目录
export BASE_DIR=$(dirname $0)/..

# 设置CLASSPATH环境变量,包括BASE_DIR下的conf目录和lib目录下的所有jar文件
export CLASSPATH=.:${BASE_DIR}/conf:${BASE_DIR}/lib/*:${CLASSPATH}
2.JVM配置

第二部分是关于JVM的配置

DIR_SIZE_IN_MB=600
#配置日志目录
choose_gc_log_directory()
{
	#根据不同系统采用不同行为
    case "`uname`" in
        Darwin) #若为mac系统
        	#检查/Volumes/RAMDisk是否存在
            if [ ! -d "/Volumes/RAMDisk" ]; then
            	#如果不存在,则利用diskutil工具创建一个2GB的RAM磁盘,并且将路径赋给变量DEV
                # create ram disk on Darwin systems as gc-log directory
                DEV=`hdiutil attach -nomount ram://$((2 * 1024 * DIR_SIZE_IN_MB))` > /dev/null
                diskutil eraseVolume HFS+ RAMDisk ${DEV} > /dev/null
                echo "Create RAMDisk /Volumes/RAMDisk for gc logging on Darwin OS."
            fi
            GC_LOG_DIR="/Volumes/RAMDisk" #将"/Volumes/RAMDisk"目录的路径赋值给GC_LOG_DIR变量
        ;;
        *)#若是其他系统
            # check if /dev/shm exists on other systems,检查该路径是否存在
            if [ -d "/dev/shm" ]; then
                GC_LOG_DIR="/dev/shm" #存在则使用该路径
            else
                GC_LOG_DIR=${BASE_DIR} #否则使用GC_LOG_DIR
            fi
        ;;
    esac
}

choose_gc_options()
{
    # Example of JAVA_MAJOR_VERSION value : '1', '9', '10', '11', ...
    # '1' means releases before Java 9
    JAVA_MAJOR_VERSION=$("$JAVA" -version 2>&1 | awk -F '"' '/version/ {print $2}' | awk -F '.' '{print $1}')
    # 如果java版本为空或者< 9,则使用CMS垃圾回收器
    if [ -z "$JAVA_MAJOR_VERSION" ] || [ "$JAVA_MAJOR_VERSION" -lt "9" ] ; then
      JAVA_OPT="${JAVA_OPT} -server -Xms128m -Xmx256mb -Xmn64m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=64m"
      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"
    # 否则使用如下配置,并且使用G1回收器
    else
      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
}

choose_gc_log_directory
choose_gc_options
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
#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.内存配置

因为我java环境是17的,所以应该修改的是else之后的JVM参数配置,降低分配的空间。

JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
    -Xms 初始堆内存
    -Xmx 最大堆内存
    -Xmn Jdk9之前的配置,JVM新生代内存大小
    -XX:MetaSpaceSize 初始元空间大小
    -XX:MaxMetaSpaceSize 最大元空间

如何选择合适的内存大小?可以通过top指令来查看当前linux服务器已经占用的内存大小。

image-20240321113842602

根据已经使用的内存大小来分配JVM内存

2.其他配置

其他一些JVM相关的启动参数,垃圾回收器、日志相关参数,按照代码每行一一对应。

  • jdk >= 9
-XX:+UseG1GC 使用G1垃圾回收器
-XX:G1HeapRegionSize=16m":设置G1垃圾回收器的堆区域大小为16MB。
-XX:G1ReservePercent=25":设置G1垃圾回收器的预留内存百分比为25%。
-XX:InitiatingHeapOccupancyPercent=30":设置触发并发周期的堆占用百分比为30%。
-XX:SoftRefLRUPolicyMSPerMB=0":设置软引用的回收策略。

-Xlog:gc*:file=${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log:time,tags:filecount=5,filesize=30M":设置日志相关参数,包括:
    -Xlog:gc*:输出详细的垃圾回收信息。
    file=${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log:将垃圾回收日志输出到指定目录,文件名包含进程ID和时间戳。
    time:在日志中添加时间戳。
    tags:在日志中添加标签。
    filecount=5:设置日志文件的最大数量为5个。
    filesize=30M:设置单个日志文件的最大大小为30MB。
  • jdk < 9
垃圾回收器相关参数
-XX:+UseConcMarkSweepGC:使用CMS垃圾回收器。
-XX:+UseCMSCompactAtFullCollection:在Full GC时进行内存整理。
-XX:CMSInitiatingOccupancyFraction=70:设置CMS触发Full GC的阈值为70%。
-XX:+CMSParallelRemarkEnabled:启用CMS并行标记。
-XX:SoftRefLRUPolicyMSPerMB=0:设置软引用的回收策略。
-XX:+CMSClassUnloadingEnabled:启用CMS类卸载功能。
-XX:SurvivorRatio=8:设置新生代中Eden区与Survivor区的比例为8。
-XX:-UseParNewGC:禁用ParNew垃圾回收器。

设置日志相关参数,包括:
-verbose:gc:输出详细的垃圾回收信息。
-Xloggc:${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log:将垃圾回收日志输出到指定目录,文件名包含进程ID和时间戳。
-XX:+PrintGCDetails:打印详细的垃圾回收细节。
-XX:+PrintGCDateStamps:在垃圾回收日志中添加时间戳。

设置日志文件轮换相关参数,包括:
-XX:+UseGCLogFileRotation:启用垃圾回收日志文件轮换功能。
-XX:NumberOfGCLogFiles=5:设置最大日志文件数量为5个。
-XX:GCLogFileSize=30m:设置单个日志文件的最大大小为30MB。

重新启动NameServer

完成上述配置后,重新启动nameServer

nohup sh bin/mqnamesrv &

在nohup.out文件可以看到如下,代表着成功启动了。

image-20240321114423527

jps

​ 也可以通过jps指令来查看nameServer是否在运行中,如下所示则代表NameSrvStartup正在运行中。

image-20240321115838128

jps是Java Virtual Machine Process Status Tool的缩写,它是JDK提供的一个命令行工具

​ jps的主要功能是列出正在运行的Java虚拟机的进程信息。它可以显示Java虚拟机进程的执行主类名称、本地虚拟机唯一ID(LVMID)等信息。这些信息有助于开发者快速定位和诊断Java应用程序的运行状态。

​ 在Linux系统中,如果想要查看Java进程的信息,通常需要使用ps -ef | grep java命令来获取进程ID。而使用jps命令可以直接列出所有Java应用程序的进程,使得操作更加简便。

​ 此外,jps还提供了一些可选参数来获取更详细的信息:

  • -q:只输出进程ID。
  • -m:输出传入main方法的参数。
  • -l:输出完全的包名、应用主类名、jar的完全路径名。
  • -v:输出jvm参数。
  • -V:输出通过flag文件传递到JVM中的参数。
  • [hostid]:远程服务器地址,jps支持远程调用。

​ 需要注意的是,jps命令只能显示它有访问权限的Java进程的信息。虽然它的功能比较单一,但由于其实用性,它在Java开发和运维中被频繁使用。

3.启动Broker+Proxy

nohup sh bin/mqbroker -n localhost:9876 --enable-proxy &

runbroker.sh文件与runserver.sh类似。

修改其中定义的堆内存,和最大堆内存即可。

image-20240321140536928

如果是jdk8以及之前的版本,则需要注意修改-Xmn,新生代内存大小。

image-20240321140723718

是否成功运行同样可以通过查看nohup.out以及jps指令进行判断,不再赘述。

4.工具测试消息收发

根据官网教程通过环境变量设计NameServer地址。

$ export NAMESRV_ADDR=localhost:9876

然后运行消息生产者示例

$ sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
 SendResult [sendStatus=SEND_OK, msgId= ...

运行消息消费者示例

$ sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
 ConsumeMessageThread_%d Receive New Messages: [MessageExt...

5.SDK测试消息收发

1.创建工程

创建一个maven工程,添加mq依赖

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.rocketmq/rocketmq-client-java -->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-client-java</artifactId>
            <version>5.0.6</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>2.0.9</version>
        </dependency>
    </dependencies>

2.重新启动broker

修改配置文件

1.修改tools.sh文件,根据服务器内存大小自行调整JVM参数

JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:PermSize=128m -XX:MaxPermSize=128m"

2.修改conf中broker.conf文件,指定numserver和Broker的IP地址

image-20240401202722018

# 所属集群名称,如果节点较多可以配置多个
brokerClusterName = DefaultCluster
#broker名称,master和slave使用相同的名称,表明他们的主从关系
brokerName = broker-a
#0表示Master,大于0表示不同的slave
brokerId = 0
#表示几点做消息删除动作,默认是凌晨4点
deleteWhen = 04
#在磁盘上保留消息的时长,单位是小时
fileReservedTime = 48
#有三个值:SYNC_MASTER,ASYNC_MASTER,SLAVE;同步和异步表示Master和Slave之间同步数据的机制;
brokerRole = ASYNC_MASTER
#刷盘策略,取值为:ASYNC_FLUSH,SYNC_FLUSH表示同步刷盘和异步刷盘;SYNC_FLUSH消息写入磁盘后才返回成功状态,ASYNC_FLUSH不需要;
flushDiskType = ASYNC_FLUSH
#设置broker节点所在服务器的ip地址(**这个非常重要,主从模式下,从节点会根据主节点的brokerIP2来同步数据,如果不配置,主从无法同步,brokerIP1设置为自己外网能访问的ip,服务器双网卡情况下必须配置,比如阿里云这种,主节点需要配置ip1和ip2,从节点只需要配置ip1即可)
brokerIP1 = XX.XX.XX.XX
#nameServer地址,分号分割
namesrvAddr=XX.XX.XX.XX:9876
#Broker 对外服务的监听端口,
#listenPort = 10911
#是否允许Broker自动创建Topic 上线为false 测试可开启
autoCreateTopicEnable = false
#是否允许 Broker 自动创建订阅组 上线为false 测试可开启
autoCreateSubscriptionGroup = false
#开启鉴权
aclEnable=true

开启acl,避免被黑客攻击

aclEnable=true

启动broker

根据MQ所在的服务器ip地址来确定启动broker

nohup sh bin/mqbroker -n 47.113.199.154:9876 autoCreateTopicEnable=true --enable-proxy -c conf/broker.conf &

官网指令

nohup sh mqbroker -c /rocketmq/conf/broker.conf &

查看broker日志

tail -f ~/logs/rocketmqlogs/broker.log

image-20240401202555029

确定成功启动后

创建Topic

使用mqadmin工具创建主题,需要注意的是,对于消息类型需要通过属性参数添加。

mqadmin也位于bin目录下,

sh mqadmin 
updatetopic
-n <nameserver_address>
-t <topic_name> 
-c <cluster_name>  集群
-a +message.type=NORMAL
$ sh bin/mqadmin updatetopic -n 47.113.199.154:9876 -t TestTopic -c DefaultCluster
不指定消息类型默认为普通消息Topic

官网指令

$ sh bin/mqadmin updatetopic -n localhost:9876 -t TestTopic -c DefaultCluster

6.关闭服务器

$ sh bin/mqshutdown broker
The mqbroker(36695) is running...
Send shutdown request to mqbroker with proxy enable OK(36695)

$ sh bin/mqshutdown namesrv
The mqnamesrv(36664) is running...
Send shutdown request to mqnamesrv(36664) OK
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值