运行环境

ip role
192.168.0.8 nameservice、broker、console
192.168.0.9 nameservice、broker
192.168.0.10 nameservice、broker

1)安装java

yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel
cat >> /etc/profile << EOF
export JAVA_HOME=/usr/lib/jvm/java
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 
EOF
source /etc/profile

2)基础配置

所有rocketmq节点执行,修改MQ_ROOT_PATH、MQ_PATH、MQ_LOG_PATH环境变量

# 下载rocketmq-all-4.7.1-bin-release.zip

MQ_ROOT_PATH=/data
MQ_PATH=$MQ_ROOT_PATH/rocketmq-4.7.1
MQ_LOG_PATH=/var/log/rocketmqlogs

unzip rocketmq-all-4.7.1-bin-release.zip && mv rocketmq-all-4.7.1-bin-release $MQ_PATH
sed -i '67 c JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn2g"' $MQ_PATH/bin/runbroker.sh
ls $MQ_PATH/conf/logback*.xml | xargs sed -i 's#${user.home}/logs#/var/log#g'
chmod +x ${MQ_PATH}/bin/*
mkdir -p $MQ_PATH/store/commitlog

id rockmq || useradd rockmq -s /sbin/nologin && chown rockmq:rockmq -R ${MQ_PATH}
mkdir -p $MQ_LOG_PATH && chown rockmq:rockmq -R $MQ_LOG_PATH

cat > /usr/lib/systemd/system/rmq_namesrv.service  << EOF
[Unit]
Description=rocketmq-nameserver
After=network.target

[Service]
User=rockmq
Type=simple
ExecStart=${MQ_PATH}/bin/mqnamesrv
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

cat > /usr/lib/systemd/system/rmq_broker.service  << EOF
[Unit]
Description=rocketmq-broker
After=network.target

[Service]
User=rockmq
Type=simple
ExecStart=${MQ_PATH}/bin/mqbroker -c ${MQ_PATH}/conf/dledger/broker.conf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s QUIT \$MAINPID
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

3)高可用配置

规划好三个broker名称

NAMESRV_LIST='192.168.0.8:9876;192.168.0.9:9876;192.168.0.10:9876'
DLEGERPEERS_LIST='n0-192.168.0.8:40911;n1-192.168.0.9:40911;n2-192.168.0.10:40911'

192.168.0.8执行

sed -i -e "/^namesrvAddr/ c namesrvAddr=$NAMESRV_LIST" \
-e "/^listenPort/ c listenPort=30911" \
-e "/^dLegerPeers/ c dLegerPeers=$DLEGERPEERS_LIST" \
-e "/^storePathRootDir/ c storePathRootDir=$MQ_PATH/store" \
-e "/^storePathCommitLog/ c storePathCommitLog=$MQ_PATH/store/commitlog" \
$MQ_PATH/conf/dledger/broker-n0.conf
ln -s $MQ_PATH/conf/dledger/broker-n0.conf $MQ_PATH/conf/dledger/broker.conf

192.168.0.9执行

sed -i -e "/^namesrvAddr/ c namesrvAddr=$NAMESRV_LIST" \
-e "/^listenPort/ c listenPort=30911" \
-e "/^dLegerPeers/ c dLegerPeers=$DLEGERPEERS_LIST" \
-e "/^storePathRootDir/ c storePathRootDir=$MQ_PATH/store" \
-e "/^storePathCommitLog/ c storePathCommitLog=$MQ_PATH/store/commitlog" \
$MQ_PATH/conf/dledger/broker-n1.conf
ln -s $MQ_PATH/conf/dledger/broker-n1.conf $MQ_PATH/conf/dledger/broker.conf

192.168.0.10执行

sed -i -e "/^namesrvAddr/ c namesrvAddr=$NAMESRV_LIST" \
-e "/^listenPort/ c listenPort=30911" \
-e "/^dLegerPeers/ c dLegerPeers=$DLEGERPEERS_LIST" \
-e "/^storePathRootDir/ c storePathRootDir=$MQ_PATH/store" \
-e "/^storePathCommitLog/ c storePathCommitLog=$MQ_PATH/store/commitlog" \
$MQ_PATH/conf/dledger/broker-n2.conf
ln -s $MQ_PATH/conf/dledger/broker-n2.conf $MQ_PATH/conf/dledger/broker.conf

启动服务,所有节点执行

systemctl daemon-reload
systemctl start rmq_namesrv.service && systemctl enable rmq_namesrv.service
systemctl start rmq_broker.service && systemctl enable rmq_broker.service
systemctl status rmq_broker rmq_namesrv

4)安装rocketmq-console

在其中一台节点上进行

# 下载rocketmq-console-auth.jar

mkdir -p $MQ_PATH/console/data
mv rocketmq-console-auth.jar $MQ_PATH/console

cat > $MQ_PATH/console/console.sh << EOF
#!/bin/bash

export JAVA_HOME=/usr/lib/jvm/java
export PATH=\$PATH:\$JAVA_HOME/bin

APP_NAME="rocketmq-console-auth.jar"
MQ_CONSOLE_PATH=$MQ_PATH/console
MQ_LOG_PATH=$MQ_LOG_PATH
NAMESRV_LIST="$NAMESRV_LIST"

usage() {
    echo "case: sh run.sh [start|stop|restart|status]"
    exit 1
}

isExist(){
  pid=\$(ps -ef | grep \${APP_NAME} | grep -v grep | awk '{print \$2}')
  if [ -z "\${pid}" ]; then
    return 1
  else
    return 0
  fi    
}

start(){
  isExist
  if [ \$? -eq "0" ]; then
    echo "\${APP_NAME} is already running,pid = \${pid}."
  else
    nohup java -jar \$MQ_CONSOLE_PATH/\${APP_NAME} --server.port="8876" --rocketmq.config.dataPath=\$MQ_CONSOLE_PATH/data --rocketmq.config.namesrvAddr="\${NAMESRV_LIST}" > \$MQ_LOG_PATH/mqconsole.log 2>&1 &
    echo "\${APP_NAME} start success"
  fi    
}

stop(){
   isExist
   if [ \$? -eq "0" ]; then
     kill -9 \${pid}
   else
     echo "stop, \${APP_NAME} is not running"
   fi    
}

status(){
  isExist
   if [ \$? -eq "0" ]; then
     echo "\${APP_NAME} is running. Pid is \${pid}"
   else
     echo "status, \${APP_NAME} is not running"
   fi  
}

restart(){
  stop
  start
}

case "\$1" in
"start")
  start
  ;;
"stop")
  stop
  ;;
"status")
  status
  ;;
"restart")
  restart
  ;;
*)
usage
;;
esac
EOF

cat > $MQ_PATH/console/data/users.properties << EOF
admin=deepexi@2022,1
EOF

chown rockmq:rockmq -R ${MQ_PATH}/console 
chmod +x $MQ_PATH/console/console.sh

cat > /usr/lib/systemd/system/rmq_console.service  << EOF
[Unit]
Description=rocketmq-console
After=network.target

[Service]
User=rockmq
Type=forking
ExecStart=/bin/sh $MQ_PATH/console/console.sh start
ExecReload=/bin/sh $MQ_PATH/console/console.sh restart
ExecStop=/bin/sh $MQ_PATH/console/console.sh stop

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl start rmq_console.service && systemctl enable rmq_console.service
systemctl status rmq_console