rocketMQ 4.9 

包含两个组件 nameserver 与 broker 

采用2master 2slave async同步的方式部署


 可以看到rocketmq的conf目录包含一个 2m-2s-async的配置文件包

[root@localhost conf]# ll
总用量 36
drwxr-xr-x. 2 root root   118 3月  29 14:34 2m-2s-async
drwxr-xr-x. 2 root root   118 6月  20 2022 2m-2s-sync
drwxr-xr-x. 2 root root    91 6月  20 2022 2m-noslave
-rw-r--r--. 1 root root   949 6月  20 2022 broker.conf
drwxr-xr-x. 2 root root    72 6月  20 2022 dledger
-rw-r--r--. 1 root root 15362 6月  20 2022 logback_broker.xml
-rw-r--r--. 1 root root  3836 6月  20 2022 logback_namesrv.xml
-rw-r--r--. 1 root root  3761 6月  20 2022 logback_tools.xml
-rw-r--r--. 1 root root  1363 6月  20 2022 plain_acl.yml
-rw-r--r--. 1 root root   834 6月  20 2022 tools.yml

包内配置文件已经准备好了

[root@localhost 2m-2s-async]# ll
总用量 16
-rw-r--r--. 1 root root  929 6月  20 2022 broker-a.properties
-rw-r--r--. 1 root root 1673 3月  29 14:34 broker-a-s.properties
-rw-r--r--. 1 root root  929 6月  20 2022 broker-b.properties
-rw-r--r--. 1 root root  922 6月  20 2022 broker-b-s.properties

这里rocketMQ处理的挺好的但是这里的配置只是简单的配置项,还需要我们自己修改下

首先做下应用的配置,我们使用两台机器部署

pcnameserverbroker-masterbroker-slavedashboard
192.168.0.92nameserver-abroker-abroker-b-s
192.168.0.93nameserver-bbroker-bbroker-a-srocket-dashboard


//因为一台机器上要部署多个服务,为了同一管理,我将所有配置文件及自己写的启动脚本及日志放到了一起

[root@localhost rocketmq]# ll
总用量 64
-rw-r--r--. 1 root root   129 3月  29 18:49 broker-a.log
-rw-r--r--. 1 root root  1598 3月  29 14:36 broker-a.properties
-rwxr-xr-x. 1 root root   125 3月  29 16:24 broker-a.sh
-rw-r--r--. 1 root root   129 3月  29 18:49 broker-b-s.log
-rw-r--r--. 1 root root  1671 3月  29 18:48 broker-b-s.properties
-rwxr-xr-x. 1 root root   129 3月  29 16:25 broker-b-s.sh
drwxr-xr-x. 2 root root   250 3月  29 18:49 brokerlogs
-rw-r--r--. 1 root root 20626 3月  29 16:26 hs_err_pid85931.log
drwxr-xr-x. 2 root root    67 3月  29 16:23 logs
-rw-r--r--. 1 root root    49 3月  29 16:23 nameserver-a.log
-rwxr-xr-x. 1 root root    75 3月  29 16:23 nameserver.sh
-rwxr-xr-x. 1 root root    52 3月  29 16:44 shutdown-broker.sh
-rwxr-xr-x. 1 root root    53 3月  29 16:44 shutdown-nameserver.sh


配置文件 broker-a.properties

//这里就不贴我自己的了,因为没注释,网上copy一份还挺全的

# 所属集群名字
brokerClusterName=myRocketmqCluster
# broker名字,注意此处不同的配置文件填写的不一样(按配置文件文件名来匹配)
brokerName=broker-a
# 0 表示Master, > 0 表示slave
brokerId=0
# 注册中心,可使用集群模式
namesrvAddr=192.168.0.129:9876;192.168.0.130:9876
# 在发送消息时,自动创建服务器不存在的Topic,默认创建的队列数
defaultTopicQueueNums=4
# 是否允许Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
# 是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
# Broker 对外服务的监听端口
listenPort=10933
# 删除文件时间点,默认是凌晨4点
deleteWhen=04
# 文件保留时间,默认48小时
fileReservedTime=120
# commitLog每个文件的大小默认1G
# 附加:消息实际存储位置,和ConsumeQueue是mq的核心存储概念,之前搭建2m环境的时候创建在store下面,用于数据存储,consumequeue是一个逻辑的概念,消息过来之后,consumequeue并不是把消息所有保存起来,而是记录一个数据的位置,记录好之后再把消息存到commitlog文件里
mapedFileSizeCommitLog=1073741824
# ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
destroyMapedFileIntervalForcibly=120000
redeleteHangedFileInterval=120000
# 检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
# 存储路径
storePathRootDir=/usr/local/rocketMQ/store
# commitLog存储路径
storePathCommitLog=/usr/local/rocketMQ/commitlog
# 消费队列存储路径
storePathConsumeQueue=/usr/local/rocketMQ/consumequeue
# 消息索引存储路径
storePathIndex=/usr/local/rocketMQ/index
# checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketMQ/checkpoint
# abort 文件存储路径
abortFile=/usr/local/rocketMQ/abort
# 限制的消息大小
maxMessageSize=65536
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000
# Broker 的角色
# ASYNC_MASTER 异步复制Master
# SYNC_MASTER 同步双写Master
# SLAVE
brokerRole=SYNC_MASTER
# 刷盘方式
# ASYNC_FLUSH 异步刷盘
# SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
checkTransactionMessageEnable=false
# 发消息线程池数量
sendMessageTreadPoolNums=128
# 拉消息线程池数量
pullMessageTreadPoolNums=128


配置文件broker-a-s.properties


# 所属集群名字
brokerClusterName=myRocketmqCluster
# broker名字,注意此处不同的配置文件填写的不一样(按配置文件文件名来匹配)
brokerName=broker-a
# 0 表示Master, > 0 表示slave
brokerId=1
# 注册中心,可使用集群模式
namesrvAddr=192.168.0.129:9876;192.168.0.130:9876
# 在发送消息时,自动创建服务器不存在的Topic,默认创建的队列数
defaultTopicQueueNums=4
# 是否允许Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
# 是否允许Broker自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
# Broker 对外服务的监听端口
listenPort=10900
# 删除文件时间点,默认是凌晨4点
deleteWhen=04
# 文件保留时间,默认48小时
fileReservedTime=120
# commitLog每个文件的大小默认1G
# 附加:消息实际存储位置,和ConsumeQueue是mq的核心存储概念,之前搭建2m环境的时候创建在store下面,用于数据存储,consumequeue是一个逻辑的概念,消息过来之后,consumequeue并不是把消息所有保存起来,而是记录一个数据的位置,记录好之后再把消息存到commitlog文件里
mapedFileSizeCommitLog=1073741824
# ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
destroyMapedFileIntervalForcibly=120000
redeleteHangedFileInterval=120000
# 检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
# 存储路径
storePathRootDir=/usr/local/rocketMQ/slave/store
# commitLog存储路径
storePathCommitLog=/usr/local/rocketMQ/slave/commitlog
# 消费队列存储路径
storePathConsumeQueue=/usr/local/rocketMQ/slave/consumequeue
# 消息索引存储路径
storePathIndex=/usr/local/rocketMQ/slave/index
# checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketMQ/slave/checkpoint
# abort 文件存储路径
abortFile=/usr/local/rocketMQ/slave/abort
# 限制的消息大小
maxMessageSize=65536
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000
# Broker 的角色
# ASYNC_MASTER 异步复制Master
# SYNC_MASTER 同步双写Master
# SLAVE
brokerRole=SLAVE
# 刷盘方式
# ASYNC_FLUSH 异步刷盘
# SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
checkTransactionMessageEnable=false
# 发消息线程池数量
sendMessageTreadPoolNums=128
# 拉消息线程池数量
pullMessageTreadPoolNums=128


broker-b.properties

broker-b-s.properties

这两个copy上面对应的改下对应的参数就好了


  • 比较核心的几个配置

brokerClusterName:只要是同一个集群里面的节点,都必须是这一个名称,可以自定义

brokerName:broker的名称,同一个broker的主从节点名称保持一致。

brokerId:broker的id标识。0:主节点,大于0都是从节点

namesrvAddr:nameSrv的注册中心地址,可以是集群模式,多个ip之间使用英文的;分隔

listenPort:监听端口,同一个ip地址下,端口不能保持一致,需修改

brokerRole:broker的角色,ASYNC_MASTER 异步复制Master,SYNC_MASTER 同步双写Master,SLAVE从节点专用。

flushDiskType:数据刷盘方式。ASYNC_FLUSH 异步刷盘,SYNC_FLUSH 同步刷盘

storePathRootDir=/usr/local/rocketMQ/store 存储路径

storePathCommitLog=/usr/local/rocketMQ/commitlog commitLog存储路径

storePathConsumeQueue=/usr/local/rocketMQ/consumequeue 消费队列存储路径

storePathIndex=/usr/local/rocketMQ/index消息索引存储路径

storeCheckpoint=/usr/local/rocketMQ/checkpoint checkpoint 文件存储路径

abortFile=/usr/local/rocketMQ/abort abort 文件存储路径


  • 修改启动参数

这里因为是虚拟机,内存没有那么打,所以要修改下启动参数

runserver.sh

    # 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} -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 -Xms512m -Xmx512m -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
        //上面判断jdk版本启动不同GC的就不用了,我自己的jdk1.8 使用G1玩,但是1.8的日志配置跟1.9的不一样所以要处理下
        //gc日志存放位置也改到统一位置了
       GC_LOG_DIR="/home/soft/softshell/rocketmq/logs"
       //这里内存分配改小了
       JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -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} -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"


runbroker.sh


choose_gc_options()
{
//这里同样改了下gc日志存放位置
    GC_LOG_DIR="/home/soft/softshell/rocketmq/brokerlogs"
    JAVA_MAJOR_VERSION=$("$JAVA" -version 2>&1 | head -1 | cut -d'"' -f2 | sed 's/^1\.//' | cut -d'.' -f1)
    if [ -z "$JAVA_MAJOR_VERSION" ] || [ "$JAVA_MAJOR_VERSION" -lt "8" ] ; then
      JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"
    else
      JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0"
    fi
    //判断小于8的用cms
 ......
 
 
 choose_gc_log_directory
//这里同样改了512m 默认的是8G 伤不起
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m"
choose_gc_options
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=15g"


然后ok了,可以启动了


做了几个启动脚本 先配置了下ROCKETMQ_HOME

$ROCKETMQ_HOME
cat /etc/profile
vi /etc/profile 
最后添加 export ROCKETMQ_HOME=/home/soft/rocketmq
source /etc/profile
  • 一台服务器上放的几个脚本 方便启停

nameserver.sh  //启动nameserver

#!/bin/bash
nohup sh $ROCKETMQ_HOME/bin/mqnamesrv > nameserver-b.log 2>&1 &

broker-b.sh //b的master broker 启动脚本

#!/bin/bash
nohup sh $ROCKETMQ_HOME/bin/mqbroker -c /home/soft/softshell/rocketmq/broker-b.properties -> broker-b.log 2>&1 &

broker-a-s.sh // a的 slave broker启动脚本

#!/bin/bash
nohup sh $ROCKETMQ_HOME/bin/mqbroker -c /home/soft/softshell/rocketmq/broker-a-s.properties -> broker-a-s.log 2>&1 &

shutdown-nameserver.sh  // nameserver的停止脚本

#!/bin/bash
sh $ROCKETMQ_HOME/bin/mqshutdown namesrv

shutdown-broker.sh  //broker的停止脚本

#!/bin/bash
sh $ROCKETMQ_HOME/bin/mqshutdown broker




乐享:知识积累,快乐无限。