使用docker高可用部署rocketmq

3,016 阅读4分钟

1、部署架构

在微服务系统中经常会引入消息中间件用于微服务之间解耦、削峰平谷等。最近由于WebSokcet业务需要引入了rocketmq解决集群导致的部分websocket推送不可达问题。rocketmq有namesrv和broker组成,其中namesrv的功能如下:

  • 接收broker的请求注册broker路由信息(master和slave)
  • 接收client的请求根据某个topic获取所有到broker的路由信息

broker则是rocketmq真正存储消息的地方,broker消息存储主要包括3个部分,分别commitLog的存储,consumeQueue的存储,index的存储。Producer和Consumer都是通过namesrv获取broker路由信息,连接到broker生产消费消息,namesrv和broker可以分别集群部署,生产者消费者同样可以分别集群部署,物理部署架构图如下

2、容器化部署

使用docker部署可以自己制作镜像参照https://www.guonanjun.com/183.html或者https://github.com/apache/rocketmq-docker。这里采用docker hub上已经制作好的镜像https://hub.docker.com/r/rocketmqinc/rocketmq。

部署模式

rocketmq有以下几种集群部署模式:

  • 2m-noslave: 多Master模式
  • 2m-2s-sync: 多Master多Slave模式,同步双写
  • 2m-2s-async:多Master多Slave模式,异步复制

集群方式对比

  • 多 master 模式 多个 master 节点组成集群,单个 master 节点宕机或者重启对应用没有影响。

优点:性能最高

缺点:单个 master节点宕机期间,未被消费的消息在节点恢复之前不可用,消息的实时性就受到影响。

注意:使用同步刷盘可以保证消息不丢失,同时 Topic 相对应的 queue 应该分布在集群中各个节点,而不是只在某各节点上,否则,该节点宕机会对订阅该 topic 的应用造成影响。

  • 多 master 多 slave 异步复制模式 在多 master 模式的基础上,每个 master 节点都有至少一个对应的 slave,master 节点可读可写,但是 slave 只能读不能写,类似于 mysql 的主备模式。

优点: 在 master 宕机时,消费者可以从 slave 读取消息,消息的实时性不会受影响,性能几乎和多 master 一样。

缺点:使用异步复制的同步方式有可能会有消息丢失的问题。

  • 多 master 多 slave 同步双写模式 同多 master 多 slave 异步复制模式类似,区别在于 master 和 slave 之间的数据同步方式。

优点:同步双写的同步模式能保证数据不丢失。

缺点:发送单个消息 RT 会略长,性能相比异步复制低10%左右。

容器化部署配置

经过以上比较,根据系统业务场景选取了多 master 多 slave 异步复制模式。

  • master节点a配置参考
brokerClusterName=rocketmq-cluster
brokerName=broker-a
brokerIP1 = 主机ip
brokerId=0 #0表示master节点,大于0表示slave节点
deleteWhen=04
fileReservedTime=168
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
listenPort = 10911
namesrvAddr=namesrv主机ip1:port;namesrv主机ip2:port

autoCreateTopicEnable=true
# autoCreateSubscriptionGroup=false
#storePathRootDir=/rocketmq/store
#storePathCommitLog=/rocketmq/commitlog
# sendMessageThreadPoolNums=128
# pullMessageThreadPoolNums=128
# useReentrantLockWhenPutMessage=true
# diskMaxUsedSpaceRatio=90
#transaction message
# transactionCheckInterval=3000
# transactionTimeOut=2000
# transactionCheckMax=3

#rebalance
# connectTimeoutMillis=1000
# chanelNotActiveInterval=5000
# clientChannelMaxIdelTimeSeconds=10
# clientCloseSocketIfTimeout=true
# maxMessageSize=1024
  • slave节点a-s配置参考
brokerClusterName=rocketmq-cluster
brokerName=broker-a #根据这个名称查找同组broker
brokerIP1 = 主机ip
brokerId=1
deleteWhen=04
fileReservedTime=168
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
listenPort = 11011
namesrvAddr=namesrv主机ip1:port;namesrv主机ip2:port

# autoCreateTopicEnable=true
# autoCreateSubscriptionGroup=false
#storePathRootDir=/rocketmq/store
#storePathCommitLog=/rocketmq/commitlog
# sendMessageThreadPoolNums=128
# pullMessageThreadPoolNums=128
# useReentrantLockWhenPutMessage=true
# diskMaxUsedSpaceRatio=90
#transaction message
# transactionCheckInterval=3000
# transactionTimeOut=2000
# transactionCheckMax=3
  • docker-compose配置文件参考
rmqnamesrv:
    image: rocketmqinc/rocketmq:4.4.0
    container_name: rmqnamesrv
    network_mode: host
    ports:
      - 9876:9876
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /home/product/app/rocketmq/logs:/var/app/logs:rw
      - /home/product/app/rocketmq/conf/logback_namesrv.xml:/opt/rocketmq-4.4.0/conf/logback_namesrv.xml
    environment: 
      JAVA_OPT_EXT: "-server -Xms1g -Xmx1g -Xmn1g"
      JAVA_OPTS: "-Duser.home=/opt"
    command: sh mqnamesrv
  rmqbroker-a:
    image: rocketmqinc/rocketmq:4.4.0
    container_name: rmqbroker-a
    network_mode: host
    ports:
      - 10911:10911
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /home/product/app/rocketmq/logs:/var/app/logs:rw #日志映射到容器外面,方便查看,/var/app/logs 是日志配置文件中的日志home
      - /home/product/app/rocketmq/conf/logback_broker.xml:/opt/rocketmq-4.4.0/conf/logback_broker.xml
      - /home/product/app/rocketmq/conf/2m-2s-async/broker-a.properties:/usr/local/rocketmq-4.4.0/conf/broker-a.properties
    environment: 
      JAVA_OPT_EXT: "-server -Xms2g -Xmx2g -Xmn2g"
      JAVA_OPTS: "-Duser.home=/opt"
    command: sh mqbroker -c /usr/local/rocketmq-4.4.0/conf/broker-a.properties
  rmqbroker-a-s:
    image: rocketmqinc/rocketmq:4.4.0
    container_name: rmqbroker-b-s
    network_mode: host
    ports:
      - 11011:11011
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /home/product/app/rocketmq/logs:/var/app/logs:rw
      - /home/product/app/rocketmq/conf/logback_broker.xml:/opt/rocketmq-4.4.0/conf/logback_broker.xml
      - /home/product/app/rocketmq/conf/2m-2s-async/broker-b-s.properties:/usr/local/rocketmq-4.4.0/conf/broker-b-s.properties
    environment: 
      JAVA_OPT_EXT: "-server -Xms2g -Xmx2g -Xmn2g"
    command: sh mqbroker -c /usr/local/rocketmq-4.4.0/conf/broker-a-s.properties
    
# rocketmq控制台
  rmqconsole:
    image: styletang/rocketmq-console-ng
    container_name: rmqconsole
    network_mode: host
    ports:
      - 8090:8090
    environment:
      JAVA_OPTS: -Drocketmq.config.namesrvAddr=namesrv主机ip1:port;namesrv主机ip2:port -Dserver.port=8090

完成以上配置之后,执行docker-copose up 可以使用docker ps查看以上服务均已启动,也可以通过控台查看到消息中间件的集群信息。