环境准备和最终目标
- 准备一:Linux 主机,笔者用的是阿里云 ECS,预装 Centos7.4 Docker18.03.1-ce
- 准备二:基础 java 8 Docker 镜像,镜像中预装 unzip 解压工具
- 目标一:在一台宿主机部署一个 Namesrv Container 和一个 Brocker Container
- 目标二:通过管理命令实现对 RocketMQ 的运维管理
- 目标三:运行官方写好的 demo 程序,实现 MQ 消息的收发
准备文件
目录
├── rocketmq
│ ├── scripts
│ │ ├── mqbroker-customize
│ │ ├── mqnamesrv-customize
│ │ ├── runbroker-customize.sh
│ │ ├── runserver-customize.sh
│ ├── Dockerfile
rocketmq/scripts/mqbroker-customize
#!/bin/bash
#
# Program:
# this program customize RocketMQ mqbroker, user can add jvm param with "--jvm"
# History:
# 2019/01/23 Zhaofeng.L<8362549@qq.com> v1.0
#
if [ -z "$ROCKETMQ_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
ROCKETMQ_HOME=`dirname "$PRG"`/..
# make it fully qualified
ROCKETMQ_HOME=`cd "$ROCKETMQ_HOME" && pwd`
cd "$saveddir"
fi
export ROCKETMQ_HOME
if [ -z "$1" ]||[ "$1" != "--jvm" ]; then
sh ${ROCKETMQ_HOME}/bin/runbroker.sh \
org.apache.rocketmq.broker.BrokerStartup \
-c /opt/rocketmq/conf/broker.conf $@
else
JVM_KEY="$1"
JVM_VALUE="$2"
shift 2
sh ${ROCKETMQ_HOME}/bin/runbroker.sh ${JVM_KEY} "${JVM_VALUE}" \
org.apache.rocketmq.broker.BrokerStartup \
-c /opt/rocketmq/conf/broker.conf $@
fi
rocketmq/scripts/mqnamesrv-customize
#!/bin/sh
#
# Program:
# this program customize RocketMQ mqnamesrv, user can add jvm param with "--jvm"
# History:
# 2019/01/23 Zhaofeng.L<8362549@qq.com> v1.0
#
if [ -z "$ROCKETMQ_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
ROCKETMQ_HOME=`dirname "$PRG"`/..
# make it fully qualified
ROCKETMQ_HOME=`cd "$ROCKETMQ_HOME" && pwd`
cd "$saveddir"
fi
export ROCKETMQ_HOME
if [ -z "$1" ]||[ "$1" != "--jvm" ]; then
sh ${ROCKETMQ_HOME}/bin/runserver.sh org.apache.rocketmq.namesrv.NamesrvStartup $@
else
JVM_KEY="$1"
JVM_VALUE="$2"
shift 2
sh ${ROCKETMQ_HOME}/bin/runserver.sh ${JVM_KEY} "${JVM_VALUE}" org.apache.rocketmq.namesrv.NamesrvStartup $@
fi
rocketmq/scripts/runbroker-customize.sh
#!/bin/bash
#
# Program:
# this program customize RocketMQ runbroker.sh, user can add jvm param with "--jvm"
# History:
# 2019/01/23 Zhaofeng.L<8362549@qq.com> v1.0
#
#===========================================================================================
# Java Environment Setting
#===========================================================================================
error_exit ()
{
echo "ERROR: $1 !!"
exit 1
}
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
#===========================================================================================
# JVM Configuration
#===========================================================================================
if [ -z "$1" ]||[ "$1" != "--jvm" ]; then
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"
else
JAVA_OPT="${JAVA_OPT} -server $2"
shift 2
fi
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8"
JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
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} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
#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}"
numactl --interleave=all pwd > /dev/null 2>&1
if [ $? -eq 0 ]
then
if [ -z "$RMQ_NUMA_NODE" ] ; then
numactl --interleave=all $JAVA ${JAVA_OPT} $@
else
numactl --cpunodebind=$RMQ_NUMA_NODE --membind=$RMQ_NUMA_NODE $JAVA ${JAVA_OPT} $@
fi
else
$JAVA ${JAVA_OPT} $@
fi
rocketmq/scripts/runserver-customize.sh
#!/bin/bash
#
# Program:
# this program customize RocketMQ runserver.sh, user can add jvm param with "--jvm"
# History:
# 2019/01/23 Zhaofeng.L<8362549@qq.com> v1.0
#
#===========================================================================================
# Java Environment Setting
#===========================================================================================
error_exit ()
{
echo "ERROR: $1 !!"
exit 1
}
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"
export JAVA_HOME
export JAVA="$JAVA_HOME/bin/java"
export BASE_DIR=$(dirname $0)/..
export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}
#===========================================================================================
# JVM Configuration
#===========================================================================================
if [ -z "$1" ]||[ "$1" != "--jvm" ]; then
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
else
JAVA_OPT="${JAVA_OPT} -server $2 -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
shift 2
fi
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:/dev/shm/rmq_srv_gc.log -XX:+PrintGCDetails"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"
# 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} $@
rocketmq/Dockerfile
#
# Program:
# Make RocketMQ docker image
#
# History:
# 2019/01/23 v1.0
#
FROM onesoso/java:8
MAINTAINER Zhaofeng.L<8362549@qq.com>
ARG version
# Rocketmq version
ENV ROCKETMQ_VERSION ${version}
# Rocketmq home
ENV ROCKETMQ_HOME /opt/rocketmq
WORKDIR ${ROCKETMQ_HOME}
# get rocketmq program
RUN curl https://dist.apache.org/repos/dist/release/rocketmq/${ROCKETMQ_VERSION}/rocketmq-all-${ROCKETMQ_VERSION}-bin-release.zip -o rocketmq.zip \
&& unzip rocketmq.zip \
&& mv rocketmq-all*/* . \
&& rmdir rocketmq-all* \
&& rm rocketmq.zip
# add scripts
COPY scripts/ ${ROCKETMQ_HOME}/bin/
VOLUME ${ROCKETMQ_HOME}/conf
# expose namesrv port
EXPOSE 9876
# add customized scripts for mqnamesrv
RUN mv ${ROCKETMQ_HOME}/bin/mqnamesrv-customize ${ROCKETMQ_HOME}/bin/mqnamesrv \
&& chmod +x ${ROCKETMQ_HOME}/bin/mqnamesrv
# add customized scripts for runserver.sh
RUN mv ${ROCKETMQ_HOME}/bin/runserver-customize.sh ${ROCKETMQ_HOME}/bin/runserver.sh \
&& chmod +x ${ROCKETMQ_HOME}/bin/runserver.sh
# expose broker ports
EXPOSE 10909 10911
# add customized scripts for mqbroker
RUN mv ${ROCKETMQ_HOME}/bin/mqbroker-customize ${ROCKETMQ_HOME}/bin/mqbroker \
&& chmod +x ${ROCKETMQ_HOME}/bin/mqbroker
# add customized scripts for runuroker.sh
RUN mv ${ROCKETMQ_HOME}/bin/runbroker-customize.sh ${ROCKETMQ_HOME}/bin/runbroker.sh \
&& chmod +x ${ROCKETMQ_HOME}/bin/runbroker.sh
# export Java options
RUN export JAVA_OPT=" -Duser.home=/opt"
WORKDIR ${ROCKETMQ_HOME}/bin
生成 Docker 镜像
docker build -t onesoso/rocketmq:4.4.0.1 --build-arg version=4.4.0 ./rocketmq
启动容器
创建 rocketmq 网络
docker network create rocket_mq
启动 namesrv
docker run \
--name namesrv \
--network rocket_mq \
-p 9876:9876 \
-v /root/namesrv/logs:/root/logs \
-v /root/namesrv/store:/root/store \
-d onesoso/rocketmq:4.4.0.1 sh mqnamesrv --jvm "-Xms512m -Xmx512m -Xmn256m"
启动 brocker
docker run \
--name broker \
--network rocket_mq \
-p 10911:10911 \
-p 10909:10909 \
-v /root/broker/logs:/root/logs \
-v /root/broker/store:/root/store \
-e "NAMESRV_ADDR=namesrv:9876" \
-d onesoso/rocketmq:4.4.0.1 sh mqbroker --jvm "-Xms512m -Xmx512m -Xmn256m"
测试运维管理
启动并进入管理容器
docker run --name admin --network rocket_mq -it onesoso/rocketmq:4.4.0.1 /bin/bash
运行<查看 namesrv 配置>管理命令
sh mqadmin getNamesrvConfig -n namesrv:9876
控制台能够输出 namesrv 的全部配置,说明管理命令运行成功
运行<查看 broker 配置>管理命令
sh mqadmin getBrokerConfig -b broker:10911 -n namesrv:9876
控制台能够输出 broker 的全部配置,说明管理命令运行成功
测试消息收发
启动并进入消息容器
docker run --name message --network rocket_mq -it onesoso/rocketmq:4.4.0.1 /bin/bash
测试发送消息
export NAMESRV_ADDR=namesrv:9876
sh tools.sh org.apache.rocketmq.example.quickstart.Producer
控制台能够输出 SendResult [sendStatus=SEND_OK ... 说明发送消息成功
测试消费消息
sh tools.sh org.apache.rocketmq.example.quickstart.Consumer
控制台能够输出 ConsumeMessageThread_XX Receive New Messages: ... 说明消费消息成功