暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于Docker快速部署RocketMQ双主双从异步集群

鲸鱼手记 2021-09-03
1363

点击上方蓝色“鲸鱼手记”,关注并选择“设为星标”

作为码农中的一员,需要不断的学习,我工作之余将一些分析总结和学习笔记写出来与大家一起交流,也希望采用这种方式记录自己的学习之旅。


目录

1、创建Dockerfile-centos文件自定义RocketMQ启动脚本构建镜像 指定ROCKETMQ_VERSION2、两主两从异步清除刷盘,broker配置broker-a.confbroker-a-s.confbroker-b.confbroker-b-s.conf3、创建docker-Compose.yml4、运行nameServer、broker和rocketmq-console-ng5、源码下载

1、创建Dockerfile-centos文件

  1. #

  2. # Licensed to the Apache Software Foundation (ASF) under one or more

  3. # contributor license agreements. See the NOTICE file distributed with

  4. # this work for additional information regarding copyright ownership.

  5. # The ASF licenses this file to You under the Apache License, Version 2.0

  6. # (the "License"); you may not use this file except in compliance with

  7. # the License. You may obtain a copy of the License at

  8. #

  9. # http://www.apache.org/licenses/LICENSE-2.0

  10. #

  11. # Unless required by applicable law or agreed to in writing, software

  12. # distributed under the License is distributed on an "AS IS" BASIS,

  13. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  14. # See the License for the specific language governing permissions and

  15. # limitations under the License.

  16. #


  17. FROM centos:7


  18. RUN yum install -y java-1.8.0-openjdk-devel.x86_64 unzip gettext nmap-ncat openssl, which gnupg, telnet \

  19. && yum clean all -y


  20. # FROM openjdk:8-jdk

  21. # RUN apt-get update && apt-get install -y --no-install-recommends \

  22. # bash libapr1 unzip telnet wget gnupg ca-certificates \

  23. # && rm -rf var/lib/apt/lists/*


  24. ARG user=rocketmq

  25. ARG group=rocketmq

  26. ARG uid=3000

  27. ARG gid=3000


  28. # RocketMQ is run with user `rocketmq`, uid = 3000

  29. # If you bind mount a volume from the host or a data container,

  30. # ensure you use the same uid

  31. RUN groupadd -g ${gid} ${group} \

  32. && useradd -u ${uid} -g ${gid} -m -s /bin/bash ${user}


  33. ARG version


  34. # Rocketmq version

  35. ENV ROCKETMQ_VERSION ${version}


  36. # Rocketmq home

  37. ENV ROCKETMQ_HOME /home/rocketmq/rocketmq-${ROCKETMQ_VERSION}


  38. WORKDIR ${ROCKETMQ_HOME}


  39. RUN set -eux; \

  40. curl https://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/${ROCKETMQ_VERSION}/rocketmq-all-${ROCKETMQ_VERSION}-bin-release.zip -o rocketmq.zip; \

  41. curl https://dist.apache.org/repos/dist/release/rocketmq/${ROCKETMQ_VERSION}/rocketmq-all-${ROCKETMQ_VERSION}-bin-release.zip.asc -o rocketmq.zip.asc; \

  42. #https://www.apache.org/dist/rocketmq/KEYS

  43. curl https://www.apache.org/dist/rocketmq/KEYS -o KEYS; \

  44. \

  45. gpg --import KEYS; \

  46. gpg --batch --verify rocketmq.zip.asc rocketmq.zip ; \

  47. unzip rocketmq.zip ; \

  48. mv rocketmq-all*/* . ; \

  49. rmdir rocketmq-all* ; \

  50. rm rocketmq.zip rocketmq.zip.asc KEYS


  51. # add scripts

  52. COPY scripts/ ${ROCKETMQ_HOME}/bin/


  53. RUN chown -R ${uid}:${gid} ${ROCKETMQ_HOME}


  54. # expose namesrv port

  55. EXPOSE 9876


  56. # add customized scripts for namesrv

  57. RUN mv ${ROCKETMQ_HOME}/bin/runserver-customize.sh ${ROCKETMQ_HOME}/bin/runserver.sh \

  58. && chmod a+x ${ROCKETMQ_HOME}/bin/runserver.sh \

  59. && chmod a+x ${ROCKETMQ_HOME}/bin/mqnamesrv


  60. # expose broker ports

  61. EXPOSE 10909 10911 10912


  62. # add customized scripts for broker

  63. RUN mv ${ROCKETMQ_HOME}/bin/runbroker-customize.sh ${ROCKETMQ_HOME}/bin/runbroker.sh \

  64. && chmod a+x ${ROCKETMQ_HOME}/bin/runbroker.sh \

  65. && chmod a+x ${ROCKETMQ_HOME}/bin/mqbroker


  66. # export Java options

  67. RUN export JAVA_OPT=" -Duser.home=/opt"


  68. # Add ${JAVA_HOME}/lib/ext as java.ext.dirs

  69. RUN sed -i 's/${JAVA_HOME}\/jre\/lib\/ext/${JAVA_HOME}\/jre\/lib\/ext:${JAVA_HOME}\/lib\/ext/' ${ROCKETMQ_HOME}/bin/tools.sh


  70. USER ${user}


  71. WORKDIR ${ROCKETMQ_HOME}/bin

自定义RocketMQ启动脚本

runserver-customize.shrunbroker-customize.sh** 防止踩坑,避免启动时报内存不足

  1. #!/bin/bash


  2. # Licensed to the Apache Software Foundation (ASF) under one or more

  3. # contributor license agreements. See the NOTICE file distributed with

  4. # this work for additional information regarding copyright ownership.

  5. # The ASF licenses this file to You under the Apache License, Version 2.0

  6. # (the "License"); you may not use this file except in compliance with

  7. # the License. You may obtain a copy of the License at

  8. #

  9. # http://www.apache.org/licenses/LICENSE-2.0

  10. #

  11. # Unless required by applicable law or agreed to in writing, software

  12. # distributed under the License is distributed on an "AS IS" BASIS,

  13. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  14. # See the License for the specific language governing permissions and

  15. # limitations under the License.


  16. #===========================================================================================

  17. # Java Environment Setting

  18. #===========================================================================================

  19. error_exit ()

  20. {

  21. echo "ERROR: $1 !!"

  22. exit 1

  23. }


  24. find_java_home()

  25. {

  26. case "`uname`" in

  27. Darwin)

  28. JAVA_HOME=$(/usr/libexec/java_home)

  29. ;;

  30. *)

  31. JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac))))

  32. ;;

  33. esac

  34. }


  35. find_java_home


  36. [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=$HOME/jdk/java

  37. [ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java

  38. [ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!"


  39. export JAVA_HOME

  40. export JAVA="$JAVA_HOME/bin/java"

  41. export BASE_DIR=$(dirname $0)/..

  42. export CLASSPATH=.:${BASE_DIR}/conf:${CLASSPATH}


  43. #===========================================================================================

  44. # JVM Configuration

  45. #===========================================================================================

  46. calculate_heap_sizes()

  47. {

  48. case "`uname`" in

  49. Linux)

  50. system_memory_in_mb=`free -m| sed -n '2p' | awk '{print $2}'`

  51. system_cpu_cores=`egrep -c 'processor([[:space:]]+):.*' proc/cpuinfo`

  52. ;;

  53. FreeBSD)

  54. system_memory_in_bytes=`sysctl hw.physmem | awk '{print $2}'`

  55. system_memory_in_mb=`expr $system_memory_in_bytes 1024 1024`

  56. system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`

  57. ;;

  58. SunOS)

  59. system_memory_in_mb=`prtconf | awk '/Memory size:/ {print $3}'`

  60. system_cpu_cores=`psrinfo | wc -l`

  61. ;;

  62. Darwin)

  63. system_memory_in_bytes=`sysctl hw.memsize | awk '{print $2}'`

  64. system_memory_in_mb=`expr $system_memory_in_bytes 1024 1024`

  65. system_cpu_cores=`sysctl hw.ncpu | awk '{print $2}'`

  66. ;;

  67. *)

  68. # assume reasonable defaults for e.g. a modern desktop or

  69. # cheap server

  70. system_memory_in_mb="2048"

  71. system_cpu_cores="2"

  72. ;;

  73. esac


  74. # some systems like the raspberry pi don't report cores, use at least 1

  75. if [ "$system_cpu_cores" -lt "1" ]

  76. then

  77. system_cpu_cores="1"

  78. fi


  79. # set max heap size based on the following

  80. # max(min(1/2 ram, 1024MB), min(1/4 ram, 8GB))

  81. # calculate 1/2 ram and cap to 1024MB

  82. # calculate 1/4 ram and cap to 8192MB

  83. # pick the max

  84. half_system_memory_in_mb=`expr $system_memory_in_mb 2`

  85. quarter_system_memory_in_mb=`expr $half_system_memory_in_mb 2`

  86. if [ "$half_system_memory_in_mb" -gt "1024" ]

  87. then

  88. half_system_memory_in_mb="1024"

  89. fi

  90. if [ "$quarter_system_memory_in_mb" -gt "8192" ]

  91. then

  92. quarter_system_memory_in_mb="8192"

  93. fi

  94. if [ "$half_system_memory_in_mb" -gt "$quarter_system_memory_in_mb" ]

  95. then

  96. max_heap_size_in_mb="$half_system_memory_in_mb"

  97. else

  98. max_heap_size_in_mb="$quarter_system_memory_in_mb"

  99. fi

  100. MAX_HEAP_SIZE="${max_heap_size_in_mb}M"


  101. # Young gen: min(max_sensible_per_modern_cpu_core * num_cores, 1/4 * heap size)

  102. max_sensible_yg_per_core_in_mb="100"

  103. max_sensible_yg_in_mb=`expr $max_sensible_yg_per_core_in_mb "*" $system_cpu_cores`


  104. desired_yg_in_mb=`expr $max_heap_size_in_mb 4`


  105. if [ "$desired_yg_in_mb" -gt "$max_sensible_yg_in_mb" ]

  106. then

  107. HEAP_NEWSIZE="${max_sensible_yg_in_mb}M"

  108. else

  109. HEAP_NEWSIZE="${desired_yg_in_mb}M"

  110. fi

  111. }


  112. calculate_heap_sizes


  113. # Dynamically calculate parameters, for reference.

  114. #Xms=$MAX_HEAP_SIZE

  115. #Xmx=$MAX_HEAP_SIZE

  116. #Xmn=$HEAP_NEWSIZE

  117. #MaxDirectMemorySize=$MAX_HEAP_SIZE

  118. Xms=128m

  119. Xmx=128m

  120. Xmn=128m

  121. MaxDirectMemorySize=128m

  122. # Set for `JAVA_OPT`.

  123. JAVA_OPT="${JAVA_OPT} -server -Xms${Xms} -Xmx${Xmx} -Xmn${Xmn}"

  124. JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8"

  125. JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"

  126. JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"

  127. JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"

  128. JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"

  129. JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=${MaxDirectMemorySize}"

  130. JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"

  131. JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${JAVA_HOME}/jre/lib/ext:${BASE_DIR}/lib"

  132. #JAVA_OPT="${JAVA_OPT} -Xdebug -Xrunjdwp:transport=dt_socket,address=9555,server=y,suspend=n"

  133. JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"

  134. JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"


  135. numactl --interleave=all pwd > /dev/null 2>&1

  136. if [ $? -eq 0 ]

  137. then

  138. if [ -z "$RMQ_NUMA_NODE" ] ; then

  139. numactl --interleave=all $JAVA ${JAVA_OPT} $@

  140. else

  141. numactl --cpunodebind=$RMQ_NUMA_NODE --membind=$RMQ_NUMA_NODE $JAVA ${JAVA_OPT} $@

  142. fi

  143. else

  144. $JAVA ${JAVA_OPT} $@

  145. fi

构建镜像 指定ROCKETMQ_VERSION

  1. docker build --no-cache -f Dockerfile-centos -t rocketmqinc/rocketmq:${ROCKETMQ_VERSION} --build-arg version=${ROCKETMQ_VERSION} .

2、两主两从异步清除刷盘,broker配置

broker-a.conf

  1. brokerClusterName=DefaultCluster

  2. brokerName=broker-a

  3. brokerId=0

  4. deleteWhen=04

  5. fileReservedTime=48

  6. brokerRole=ASYNC_MASTER

  7. flushDiskType=ASYNC_FLUSH


  8. # Host node's dns-name or ip

  9. brokerIP1=172.16.218.144


  10. # Optional config different value rather than default ports.

  11. # Caution: changing default ports need to update port mapping setting (-p) in start-broker.sh

  12. listenPort=10911

  13. #haListenPort=10912

broker-a-s.conf

  1. brokerClusterName=DefaultCluster

  2. brokerName=broker-a

  3. brokerId=1

  4. deleteWhen=04

  5. fileReservedTime=48

  6. brokerRole=SLAVE

  7. flushDiskType=ASYNC_FLUSH



  8. #Slave host dns-name/ip

  9. brokerIP1=172.16.218.144

  10. #with Master's BroperIP1

  11. brokerIP2=172.16.218.144

  12. #同一台机器部署多个broker,端口号要不同,且端口号之间要相距大些

  13. listenPort=12911

broker-b.conf

  1. brokerClusterName=DefaultCluster

  2. brokerName=broker-b

  3. brokerId=0

  4. deleteWhen=04

  5. fileReservedTime=48

  6. brokerRole=ASYNC_MASTER

  7. flushDiskType=ASYNC_FLUSH


  8. # Host node's dns-name or ip

  9. brokerIP1=172.16.218.144


  10. # Optional config different value rather than default ports.

  11. # Caution: changing default ports need to update port mapping setting (-p) in start-broker.sh

  12. #同一台机器部署多个broker,端口号要不同,且端口号之间要相距大些

  13. listenPort=11911

  14. #haListenPort=10912

broker-b-s.conf

  1. brokerClusterName=DefaultCluster

  2. brokerName=broker-b

  3. brokerId=1

  4. deleteWhen=04

  5. fileReservedTime=48

  6. brokerRole=SLAVE

  7. flushDiskType=ASYNC_FLUSH



  8. #Slave host dns-name/ip

  9. brokerIP1=172.16.218.144

  10. #with Master's BroperIP1

  11. brokerIP2=172.16.218.144

  12. #同一台机器部署多个broker,端口号要不同,且端口号之间要相距大些

  13. listenPort=13911

3、创建docker-Compose.yml

  1. version: '3'

  2. services:

  3. namesrv:

  4. image: rocketmqinc/rocketmq:4.6.0

  5. container_name: rmqnamesrv

  6. ports:

  7. - 9876:9876

  8. volumes:

  9. - ./data/namesrv/logs:/home/rocketmq/logs

  10. command: sh mqnamesrv

  11. networks:

  12. rocketmq:

  13. ipv4_address: 172.23.0.2

  14. aliases:

  15. - namesrv


  16. broker-a:

  17. image: rocketmqinc/rocketmq:4.6.0

  18. container_name: rmqbroker-a

  19. links:

  20. - namesrv

  21. ports:

  22. - 10909:10909

  23. - 10911:10911

  24. - 10912:10912

  25. environment:

  26. - NAMESRV_ADDR=namesrv:9876

  27. volumes:

  28. - ./data1/broker/logs:/home/rocketmq/logs

  29. - ./data1/broker/store:/home/rocketmq/store

  30. - ./data1/broker/conf/broker-a.conf:/home/rocketmq/rocketmq-4.6.0/conf/broker-a.conf

  31. command: sh mqbroker -c ../conf/broker-a.conf

  32. networks:

  33. rocketmq:

  34. ipv4_address: 172.23.0.3

  35. aliases:

  36. - broker-a


  37. broker-b:

  38. image: rocketmqinc/rocketmq:4.6.0

  39. container_name: rmqbroker-b

  40. links:

  41. - namesrv

  42. ports:

  43. - 11909:10909

  44. - 11911:11911

  45. - 11912:10912

  46. environment:

  47. - NAMESRV_ADDR=namesrv:9876

  48. volumes:

  49. - ./data2/broker/logs:/home/rocketmq/logs

  50. - ./data2/broker/store:/home/rocketmq/store

  51. - ./data2/broker/conf/broker-b.conf:/home/rocketmq/rocketmq-4.6.0/conf/broker-b.conf

  52. command: sh mqbroker -c ../conf/broker-b.conf

  53. networks:

  54. rocketmq:

  55. ipv4_address: 172.23.0.4

  56. aliases:

  57. - broker-b


  58. broker-a-s:

  59. image: rocketmqinc/rocketmq:4.6.0

  60. container_name: rmqbroker-a-s

  61. links:

  62. - namesrv

  63. ports:

  64. - 12909:10909

  65. - 12911:12911

  66. - 12912:10912

  67. environment:

  68. - NAMESRV_ADDR=namesrv:9876

  69. volumes:

  70. - ./data3/broker/logs:/home/rocketmq/logs

  71. - ./data3/broker/store:/home/rocketmq/store

  72. - ./data3/broker/conf/broker-a-s.conf:/home/rocketmq/rocketmq-4.6.0/conf/broker-a-s.conf

  73. command: sh mqbroker -c ../conf/broker-a-s.conf

  74. networks:

  75. rocketmq:

  76. ipv4_address: 172.23.0.5

  77. aliases:

  78. - broker-a-s


  79. broker-b-s:

  80. image: rocketmqinc/rocketmq:4.6.0

  81. container_name: rmqbroker-b-s

  82. links:

  83. - namesrv

  84. ports:

  85. - 13909:10909

  86. - 13911:13911

  87. - 13912:10912

  88. environment:

  89. - NAMESRV_ADDR=namesrv:9876

  90. volumes:

  91. - ./data4/broker/logs:/home/rocketmq/logs

  92. - ./data4/broker/store:/home/rocketmq/store

  93. - ./data4/broker/conf/broker-b-s.conf:/home/rocketmq/rocketmq-4.6.0/conf/broker-b-s.conf

  94. command: sh mqbroker -c ../conf/broker-b-s.conf

  95. networks:

  96. rocketmq:

  97. ipv4_address: 172.23.0.6

  98. aliases:

  99. - broker-b-s


  100. rocketmq-console:

  101. image: styletang/rocketmq-console-ng

  102. container_name: rocketmq-console-ng

  103. links:

  104. - namesrv

  105. ports:

  106. - 8090:8080

  107. environment:

  108. - JAVA_OPTS=-Drocketmq.namesrv.addr=172.16.218.144:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false

  109. command: sh -c java JAVA_OPTS -jar /app.jar

  110. networks:

  111. rocketmq:

  112. ipv4_address: 172.23.0.7

  113. aliases:

  114. - rocketmq-console


  115. networks:

  116. rocketmq:

  117. driver: bridge

  118. ipam:

  119. driver: default

  120. config:

  121. - subnet: 172.23.0.0/16

4、运行nameServer、broker和rocketmq-console-ng

  1. docker-compose -f ./docker-compose/docker-compose.yml up -d

5、源码下载

这是源码地址,大家可以参照着实践一下。

https://github.com/baojingyu/docker-rocketmq/ 


欢迎分享转发,有帮助的话点个“在看”






文章转载自鲸鱼手记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论