部署 Rocketmq
Posted 运维工作栈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了部署 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的主要内容,如果未能解决你的问题,请参考以下文章