部署 Rocketmq

Posted 运维工作栈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部署 Rocketmq相关的知识,希望对你有一定的参考价值。

手动部署 Rocketmq

Install Rocketmq

本次安装的机器操作系统是 Ubuntu18.04

  • 安装 jdk 和工具软件

    # 两台机器都要操作
    apt-get install -y openjdk-8-jre-headless unzip
    
  • 下载二进制安装包并解压

    # 在 192.168.100.38 上操作
    mkdir /data
    cd /data
    wget https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip
    unzip rocketmq-all-4.9.4-bin-release.zip
    mv rocketmq-all-4.9.4-bin-release rocketmq-4.9-a
    cp -r rocketmq-4.9-a rocketmq-4.9-b-s
    
    # 在 192.168.100.39 上操作
    mkdir /data
    cd /data
    wget https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip
    unzip rocketmq-all-4.9.4-bin-release.zip
    mv rocketmq-all-4.9.4-bin-release rocketmq-4.9-b
    cp -r rocketmq-4.9-b rocketmq-4.9-a-s
    
  • 修改配置

    # 在 192.168.100.38 上操作
    # vim /data/rocketmq-4.9-a/conf/2m-2s-async/broker-a.properties
    brokerClusterName=DefaultCluster
    brokerName=broker-a
    brokerId=0
    deleteWhen=04
    fileReservedTime=48
    brokerRole=ASYNC_MASTER
    flushDiskType=ASYNC_FLUSH
    
    namesrvAddr=192.168.100.38:9876;192.168.100.39:9876
    defaultTopicQueueNums=4
    autoCreateTopicEnable=false
    autoCreateSubscriptionGroup=false
    listenPort=10911
    mapedFileSizeCommitLog=1073741824
    mapedFileSizeConsumeQueue=300000
    destroyMapedFileInterval=120000
    redeleteHangedFileInterval=120000
    diskMaxUsedSpaceRatio=88
    storePathRootDir=/data/rocketmq-4.9-a/data/store
    storePathCommitLog=/data/rocketmq-4.9-a/data/store/commitlog
    maxMessageSize=65536
    flushCommitLogLeastPages=4
    flushConsumeQueueLeastPages=2
    flushCommitLogThoroughInterval=10000
    flushConsumeQueueThoroughInterval=60000
    checkTransactionMessageEnable=false
    sendMessageThreadPoolNums=128
    pullMessageThreadPoolNums=128
    
    # vim /data/rocketmq-4.9-b-s/conf/2m-2s-async/broker-b-s.properties
    brokerClusterName=DefaultCluster
    brokerName=broker-b
    brokerId=1
    deleteWhen=04
    fileReservedTime=48
    brokerRole=SLAVE
    flushDiskType=ASYNC_FLUSH
    
    namesrvAddr=192.168.100.38:9876;192.168.100.39:9876
    defaultTopicQueueNums=4
    autoCreateTopicEnable=false
    autoCreateSubscriptionGroup=false
    listenPort=10950
    mapedFileSizeCommitLog=1073741824
    mapedFileSizeConsumeQueue=300000
    destroyMapedFileInterval=120000
    redeleteHangedFileInterval=120000
    diskMaxUsedSpaceRatio=88
    storePathRootDir=/data/rocketmq-4.9-b-s/data/store
    storePathCommitLog=/data/rocketmq-4.9-b-s/data/store/commitlog
    maxMessageSize=65536
    flushCommitLogLeastPages=4
    flushConsumeQueueLeastPages=2
    flushCommitLogThoroughInterval=10000
    flushConsumeQueueThoroughInterval=60000
    checkTransactionMessageEnable=false
    sendMessageThreadPoolNums=128
    pullMessageThreadPoolNums=128
    
    # 修改日志目录
    # vim /data/rocketmq-4.9-a/conf/logback_broker.xml
    # vim /data/rocketmq-4.9-a/conf/logback_namesrv.xml
    # vim /data/rocketmq-4.9-a/conf/logback_tools.xml
    # 打开以上文件,使用以下命令批量替换
    :%s@$user.home@/data@g
    :%s@$brokerLogDir/@@g
    :%s@rocketmqlogs@rocketmqlogs-a@g
    
    # vim /data/rocketmq-4.9-b-s/conf/logback_broker.xml
    # vim /data/rocketmq-4.9-b-s/conf/logback_namesrv.xml
    # vim /data/rocketmq-4.9-b-s/conf/logback_tools.xml
    # 打开以上文件,使用以下命令批量替换
    :%s@$user.home@/data@g
    :%s@$brokerLogDir/@@g
    :%s@rocketmqlogs@rocketmqlogs-b-s@g
    
    # 创建日志目录和数据目录
    mkdir -p /data/logs/rocketmqlogs-a/otherdays
    mkdir -p /data/logs/rocketmqlogs-b-s/otherdays
    mkdir -p /data/rocketmq-4.9-a/data/store/commitlog
    mkdir -p /data/rocketmq-4.9-b-s/data/store/commitlog
    
    # 在 192.168.100.39 上操作
    # vim /data/rocketmq-4.9-b/conf/2m-2s-async/broker-b.properties
    brokerClusterName=DefaultCluster
    brokerName=broker-b
    brokerId=0
    deleteWhen=04
    fileReservedTime=48
    brokerRole=ASYNC_MASTER
    flushDiskType=ASYNC_FLUSH
    
    namesrvAddr=192.168.100.38:9876;192.168.100.39:9876
    defaultTopicQueueNums=4
    autoCreateTopicEnable=false
    autoCreateSubscriptionGroup=false
    listenPort=10911
    mapedFileSizeCommitLog=1073741824
    mapedFileSizeConsumeQueue=300000
    destroyMapedFileInterval=120000
    redeleteHangedFileInterval=120000
    diskMaxUsedSpaceRatio=88
    storePathRootDir=/data/rocketmq-4.9-b/data/store
    storePathCommitLog=/data/rocketmq-4.9-b/data/store/commitlog
    maxMessageSize=65536
    flushCommitLogLeastPages=4
    flushConsumeQueueLeastPages=2
    flushCommitLogThoroughInterval=10000
    flushConsumeQueueThoroughInterval=60000
    checkTransactionMessageEnable=false
    sendMessageThreadPoolNums=128
    pullMessageThreadPoolNums=128
    
    # vim /data/rocketmq-4.9-a-s/conf/2m-2s-async/broker-a-s.properties
    brokerClusterName=DefaultCluster
    brokerName=broker-a
    brokerId=1
    deleteWhen=04
    fileReservedTime=48
    brokerRole=SLAVE
    flushDiskType=ASYNC_FLUSH
    
    namesrvAddr=192.168.100.38:9876;192.168.100.39:9876
    defaultTopicQueueNums=4
    autoCreateTopicEnable=false
    autoCreateSubscriptionGroup=false
    listenPort=10950
    deleteWhen=04
    fileReservedTime=120
    mapedFileSizeCommitLog=1073741824
    mapedFileSizeConsumeQueue=300000
    destroyMapedFileInterval=120000
    redeleteHangedFileInterval=120000
    diskMaxUsedSpaceRatio=88
    storePathRootDir=/data/rocketmq-4.9-b/data/store
    storePathCommitLog=/data/rocketmq-4.9-b/data/store/commitlog
    maxMessageSize=65536
    flushCommitLogLeastPages=4
    flushConsumeQueueLeastPages=2
    flushCommitLogThoroughInterval=10000
    flushConsumeQueueThoroughInterval=60000
    checkTransactionMessageEnable=false
    sendMessageThreadPoolNums=128
    pullMessageThreadPoolNums=128
    
    # 修改日志目录
    # vim /data/rocketmq-4.9-b/conf/logback_broker.xml
    # vim /data/rocketmq-4.9-b/conf/logback_namesrv.xml
    # vim /data/rocketmq-4.9-b/conf/logback_tools.xml
    # 打开以上文件,使用以下命令批量替换
    :%s@$user.home@/data@g
    :%s@$brokerLogDir/@@g
    :%s@rocketmqlogs@rocketmqlogs-b@g
    
    # vim /data/rocketmq-4.9-a-s/conf/logback_broker.xml
    # vim /data/rocketmq-4.9-a-s/conf/logback_namesrv.xml
    # vim /data/rocketmq-4.9-a-s/conf/logback_tools.xml
    # 打开以上文件,使用以下命令批量替换
    :%s@$user.home@/data@g
    :%s@$brokerLogDir/@@g
    :%s@rocketmqlogs@rocketmqlogs-a-s@g
    
    # 创建日志目录和数据目录
    mkdir -p /data/logs/rocketmqlogs-b/otherdays
    mkdir -p /data/logs/rocketmqlogs-a-s/otherdays
    mkdir -p /data/rocketmq-4.9-b/data/store/commitlog
    mkdir -p /data/rocketmq-4.9-a-s/data/store/commitlog
    
  • 启动 nameserver

    # 启动之前可以修改 jvm 参数
    # vim bin/runserver.sh
    
    # 在 192.168.100.38 上操作
    cd /data/rocketmq-4.9-a
    nohup sh bin/mqnamesrv > mqnamesrv_log.txt 2>&1 &
    
    # 在 192.168.100.39 上操作
    cd /data/rocketmq-4.9-b
    nohup sh bin/mqnamesrv > mqnamesrv_log.txt 2>&1 &
    
  • 启动 broker

    # 启动之前可以修改 jvm 参数
    # vim bin/runbroker.sh
    
    # 在 192.168.100.38 上操作
    cd /data/rocketmq-4.9-a
    nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties > mqbroker_a_log.txt 2>&1 &
    cd /data/rocketmq-4.9-b-s
    nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b-s.properties > mqbroker_b-s_log.txt 2>&1 &
    
    # 在 192.168.100.39 上操作
    cd /data/rocketmq-4.9-b
    nohup sh bin/mqbroker -c conf/2m-2s-async/broker-b.properties > mqbroker_b_log.txt 2>&1 &
    cd /data/rocketmq-4.9-a-s
    nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties > mqbroker_a-s_log.txt 2>&1 &
    
  • 常用操作

    # stop mqnamesrv / mqbroker
    sh bin/mqshutdown namesrv
    sh bin/mqshutdown broker
    
    # check broker
    sh bin/mqadmin clusterList -n localhost:9876
    
    # create topic
    sh bin/mqadmin updateTopic -n localhost:9876 -c DefaultCluster -t test-topic
    
    # delete topic
    sh bin/mqadmin deleteTopic -n localhost:9876 -c DefaultCluster -t test-topic
    
    # 测试生产者
    sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
    
    # 测试消费者
    sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
    

rocketmq总结以及自动化部署策略

参考技术A

是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点。

实例消费这个 Topic 对应的所有队列,如果做集群消费,则多个 Consumer 实例平均消费这个 topic 对应的队列集合。

RocketMQ 网络部署特点

1)高并发读写服务

Broker的高并发读写主要是依靠以下两点:

2) 负载均衡与动态伸缩

负载均衡 :Broker上存Topic信息,Topic由多个队列组成,队列会平均分散在多个Broker上,而Producer的发送机制保证消息尽量平均分布到所有队列中,最终效果就是所有消息都平均落在每个Broker上。

动态伸缩能力(非顺序消息) :Broker的伸缩性体现在两个维度:Topic, Broker。

3) 高可用&高可靠

高可用:集群部署时一般都为主备,备机实时从主机同步消息,如果其中一个主机宕机,备机提供消费服务,但不提供写服务。

高可靠:所有发往broker的消息,有同步刷盘和异步刷盘机制;同步刷盘时,消息写入物理文件才会返回成功,异步刷盘时,只有机器宕机,才会产生消息丢失,broker挂掉可能会发生,但是机器宕机崩溃是很少发生的,除非突然断电

4)Broker与Namesrv的心跳机制
单个Broker跟所有Namesrv保持心跳请求,心跳间隔为30秒,心跳请求中包括当前Broker所有的Topic信息。Namesrv会反查Broer的心跳信息,如果某个Broker在2分钟之内都没有心跳,则认为该Broker下线,调整Topic跟Broker的对应关系。但此时Namesrv不会主动通知Producer、Consumer有Broker宕机。

消费者启动时需要指定Namesrv地址,与其中一个Namesrv建立长连接。消费者每隔30秒从nameserver获取所有topic的最新队列情况,这意味着某个broker如果宕机,客户端最多要30秒才能感知。连接建立后,从namesrv中获取当前消费Topic所涉及的Broker,直连Broker。

Consumer跟Broker是长连接,会每隔30秒发心跳信息到Broker。Broker端每10秒检查一次当前存活的Consumer,若发现某个Consumer 2分钟内没有心跳,就断开与该Consumer的连接,并且向该消费组的其他实例发送通知,触发该消费者集群的负载均衡。

消费者端的负载均衡
先讨论消费者的消费模式,消费者有两种模式消费:集群消费,广播消费。

消费者端的负载均衡,就是集群消费模式下,同一个ID的所有消费者实例平均消费该Topic的所有队列。

Producer启动时,也需要指定Namesrv的地址,从Namesrv集群中选一台建立长连接。如果该Namesrv宕机,会自动连其他Namesrv。直到有可用的Namesrv为止。

生产者每30秒从Namesrv获取Topic跟Broker的映射关系,更新到本地内存中。再跟Topic涉及的所有Broker建立长连接,每隔30秒发一次心跳。在Broker端也会每10秒扫描一次当前注册的Producer,如果发现某个Producer超过2分钟都没有发心跳,则断开连接。

生产者端的负载均衡

生产者发送时,会自动轮询当前所有可发送的broker,一条消息发送成功,下次换另外一个broker发送,以达到消息平均落到所有的broker上。

这里需要注意一点:假如某个Broker宕机,意味生产者最长需要30秒才能感知到。在这期间会向宕机的Broker发送消息。当一条消息发送到某个Broker失败后,会往该broker自动再重发2次,假如还是发送失败,则抛出发送失败异常。业务捕获异常,重新发送即可。客户端里会自动轮询另外一个Broker重新发送,这个对于用户是透明的。

绑定hosts或dns:

主机命名说明:

在实际应用中都会涉及多环境的问题,比如有线下环境(dev)和生产环境(prod),不同环境的应用最好保持配置一致,减少各个每个环境的配置工作量。

Rocketmq各环境统一连接地址

NAMESRV_ADDR="nameserver1.rocketmq.test.com:9876;nameserver2.rocketmq.test.com:9876"

根据Rocketmq集群说明,其实最终只需暴露nameserver的地址给应用即可,因此,各个环境绑定各个环境对应的hosts/dns即可使用统一连接的地址。

rocketmq各个组件都支持横向扩容:

通过web可以查看集群状态,查看topic信息以及创建更改topic,管理producer和consumer等。

用户手册: https://github.com/apache/rocketmq-externals/blob/master/rocketmq-console/doc/1_0_0/UserGuide_CN.md

以上是关于部署 Rocketmq的主要内容,如果未能解决你的问题,请参考以下文章

windows下RocketMQ安装部署

RocketMQ集群部署配置

rocketmq单点部署

RocketMq: Linux环境-单机部署和主从集群部署

RocketMQ===》docker部署RocketMQ

RocketMQ===》docker部署RocketMQ