RocketMQ发展历程RocketMQ是阿里巴巴开源的一款消息中间件。2012年开源,2017年成为Apache顶级项目,RocketMQ在阿里巴巴应用广泛。阿里巴巴数以千计的应用程序运行在RocketMQ上。双十一期间需要处理数亿条消息,TPS可达数十万。目前支持四种语言接入:Java、C/C++、Python、Go。RocketMQ现在有两个版本,一个是社区开源版,一个是商业云服务版(AliwareMQ)。最新版本:4.8.0(本文演示版)。它的核心设计借鉴了Kafka,所以我们在学习RocketMQ的时候,会发现很多和Kafka相同的特性,但是有些功能却和Kafka有很大的不同。具有以下特点:支持集群模型,负载均衡,水平扩展能力亿级消息积累能力,采用零拷贝原则,顺序写入磁盘,随机读取无单点,可扩展,任意点高可用,水平可扩展性经过多次双十一测试,高可用架构RocketMQ自然对集群的支持很好,它有以下几种模式:单Master优点:除了配置简单没有优点缺点:不可靠,机器重启或宕机会导致整个服务不可用Multi-Master优点:配置简单,性能最高缺点:可能有少量消息丢失(配置相关),单机重启或宕机时,本机下的Unconsumed消息无法订阅机器恢复,影响消息的实时性。多个主站和多个从站。每个Master配备一个Slave。有多对Master-Slave。集群采用异步复制方式,主备之间消息延迟短,毫秒级优势:性能与多主几乎相同,实时性高,主备切换对应用透明,并且不需要人工干预。缺点:主控崩溃或磁盘损坏时会丢失少量消息。多主多从。每个主人配备一个奴隶,有多对Master-Slave,集群采用同步双写模式。master和slave都写入成功,并返回成功给应用程序。切换到MasterTwoMasterTwoSlave异步集群安装本文采用的是TwoMasterTwoSlave安装方式,即第四节多Master多Slave端口规划。首先买了两台云服务器,平时用来学习和安装一些中间件,比较方便,有条件可以买。当然你也可以通过在本地安装虚拟机来操作。接下来我将使用这两台服务器来实现两主两从的安装。首先,规划他们的港口。.144.86#端口规划:9876NameServer210920BrokerB-master10911BrokerA-slave画的越看越清晰部分下载可以到官网rocketmq.apache.org/获取最新下载地址。红框内的地址可以下载。下载后cd/jackxuwgethttps://mirror.bit.edu.cn/apache/rocketmq/4.8.0/rocketmq-all-4.8.0-bin-release.zip解压并改名为unziprocketmq-all-4.8.0-bin-release.zipmvunziprocketmq-all-4.8.0-bin-release.ziprocketmq配置第一台机器在两台机器上都下载好并解压。在rocketmq/conf目录下,有3种建议的配置方式:2m-2s-async(2主2从异步)——本文用的就是这个2m-2s-sync(2主2从同步)2m-noslave(2师傅)现在需要修改两台机器上2m-2s-async目录下的文件。在42.192.77.73机器上修改broker-a.propertiescd/jackxu/rocketmq/conf/2m-2s-asyncvimbroker-a.properties修改集群名称brokerClusterName=jackxu-cluster添加内容#Broker对外服务监听端口listenPort=10910#是否允许Broker自动创建Topic,建议离线开启,在线关闭autoCreateTopicEnable=true#是否允许Broker自动创建订阅组,建议离线开启,在线关闭autoCreateSubscriptionGroup=true#nameServer地址,分号分隔的namesrvAddr=39.103。144.86:9876;42.192.77.73:9876#存储路径storePathRootDir=/jackxu/rocketmq/store/broker-a#commitLog存储路径storePathCommitLog=/jackxu/rocketmq/store/broker-a/commitlog#消费队列存储路径storePathConsumeQueue=/jackxu/rocketmq/store/broker-a/consumequeue#消息索引存储路径storePathIndex=/jackxu/rocketmq/store/broker-a/index#checkpoint文件存储路径storeCheckpoint=/jackxu/rocketmq/store/checkpoint#abort文件存储路径abortFile=/jackxu/rocketmq/store/abortmodifybroker-b-s.propertiesvimbroker-b-s.properties修改集群名称brokerClusterName=jackxu-cluster添加内容#Broker对外服务监听端口listenPort=10921#是否允许Broker自动创建Topic,建议开启offline,关闭onlineautoCreateTopicEnable=true#是否允许Broker自动创建订阅组,建议开启offline启用、关闭autoCreateSubscriptionGroup=true#nameServer地址,名称以分号分隔rvAddr=39.103.144.86:9876;42.192.77.73:9876#存储路径storePathRootDir=/jackxu/rocketmq/store/broker-b-s#commitLog存储路径storePathCommitLog=/jackxu/rocketmq/store/broker-b-s/commitlog#消费队列存储路径存储路径storePathConsumeQueue=/jackxu/rocketmq/store/broker-b-s/consumequeue#消息索引存储路径storePathIndex=/jackxu/rocketmq/store/broker-b-s/index#checkpoint文件存放路径storeCheckpoint=/jackxu/rocketmq/store/checkpoint#abort文件存放路径abortFile=/jackxu/rocketmq/store/abort配置第二台机器修改39.103.144.86机器上的broker-b.propertiescd/jackxu/rocketmq/conf/2m-2s-asyncvimbroker-b.properties修改集群名称brokerClusterName=jackxu-cluster添加内容#Broker对外服务监听端口listenPort=10920#是否允许Broker自动创建topic,建议开启离线,离线关闭autoCreateTopicEnable=true#是否允许Broker自动创建订阅组,建议离线开启,在线关闭。/jackxu/rocketmq/store/broker-b#commitLog存放路径storePathCommitLog=/jackxu/rocketmq/store/broker-b/commitlog#消费队列存储路径存储路径storePathConsumeQueue=/jackxu/rocketmq/store/broker-b/consumequeue#消息索引存储路径storePathIndex=/jackxu/rocketmq/store/broker-b/index#checkpoint文件存放路径storeCheckpoint=/jackxu/rocketmq/store/checkpoint#abort文件存放路径abortFile=/jackxu/rocketmq/store/abort修改broker-a-s.propertiesvimbroker-a-s.properties修改集群名称brokerClusterName=jackxu-cluster新增内容#Broker对外服务监听端口listenPort=10911#是否允许Broker自动创建topic,建议开启离线,关闭在线=true#nameServer地址,名称以分号分隔rvAddr=39.103.144.86:9876;42.192.77.73:9876#存储路径storePathRootDir=/jackxu/rocketmq/store/broker-a-s#commitLog存储路径storePathCommitLog=/jackxu/rocketmq/store/broker-a-s/commitlog#消费队列存储路径存储路径storePathConsumeQueue=/jackxu/rocketmq/store/broker-a-s/consumequeue#消息索引存储路径storePathIndex=/jackxu/rocketmq/store/broker-a-s/index#checkpoint文件存储路径storeCheckpoint=/jackxu/rocketmq/store/checkpoint#abort文件存放路径abortFile=/jackxu/rocketmq/store/abort创建数据目录第一台机器42.192.77.73执行,只需要执行mkdir-p/jackxu/rocketmq/store/broker-a/jackxu/rocketmq/store/broker-a/consumequeue/jackxu/rocketmq/store/broker-a/commitlog/jackxu/rocketmq/store/broker-a/index/jackxu/rocketmq/logs/jackxu/rocketmq/store/broker-b-s/jackxu/rocketmq/store/broker-b-s/consumequeue/jackxu/rocketmq/store/broker-b-s/commitlog/jackxu/rocketmq/store/broker-b-s/index第二台机器39.103.144.86执行,只需要执行mkdir-p/jackxu/rocketmqonce/store/broker-a-s/jackxu/rocketmq/store/broker-a-s/consumequeue/jackxu/rocketmq/store/broker-a-s/commitlog/jackxu/rocketmq/store/broker-a-s/index/jackxu/rocketmq/logs/jackxu/rocketmq/store/broker-b/jackxu/rocketmq/store/broker-b/consumequeue/jackxu/rocketmq/store/broker-b/commitlog/jackxu/rocketmq/store/broker-b/index一分为二启动两个NameServer每台机器单独执行,&表示后台运行。nameserver默认监听9876端口nohupsh/jackxu/rocketmq/bin/mqnamesrv>/jackxu/rocketmq/logs/mqnamesrv.log2>&1&查看日志tail-f/jackxu/rocketmq/logs/mqnamesrv.log启动Broker时,按照如下顺序,-c为指定broker1的配置文件,启动73的Amasternohupsh/jackxu/rocketmq/bin/mqbroker-c/jackxu/rocketmq/conf/2m-2s-async/broker-a.properties>/jackxu/rocketmq/logs/broker-a.log2>&1&2,从nohup开始86Ash/jackxu/rocketmq/bin/mqbroker-c/jackxu/rocketmq/conf/2m-2s-async/broker-a-s.properties>/jackxu/rocketmq/logs/broker-a-s.log2>&1&3,开始86Bmainnohupsh/jackxu/rocketmq/bin/mqbroker-c/jackxu/rocketmq/conf/2m-2s-async/broker-b.properties>/jackxu/rocketmq/logs/broker-b.log2>&1&4,启动73B来自nohupsh/jackxu/rocketmq/bin/mqbroker-c/jackxu/rocketmq/conf/2m-2s-async/broker-b-s.properties>/jackxu/rocketmq/logs/broker-b-s.log2>&1&查看日志tail-f/jackxu/rocketmq/conf/2m-2s-async/broker-a.propertiestail-f/jackxu/rocketmq/conf/2m-2s-async/broker-a-s.propertiestail-f/jackxu/rocketmq/conf/2m-2s-async/broker-b.propertiestail-f/jackxu/rocketmq/conf/2m-2s-async/broker-b-s.properties查看是否启动成功,输入jps命令,一共四个进程没问题,但大多数情况下不会那么顺利,我有一些安装中的坑:1.没有安装jdk,因为这是我的新服务器,上面没有jdk环境,大家都知道rocketmq是java写的,所以需要java环境才能运行,包括jps命令到查看java进程2,内存不足,因为默认的配置文件设置了很大的内存,但是我的机器只有1核2G,肯定不够用,所以启动的时候会报内存不足。解决办法是修改配置文件vim/jackxu/rocketmq/bin/runserver.shvim/jackxu/rocketmq/bin/runbroker.sh把NameServer和Broker的内存大小改小一点,然后重启关闭命令。停止服务时需要注意先停止broker,再停止nameservercd/jackxu/rocketmq/binshmqshutdownnamesrvshmqshutdownbrokerweb控制台安装不同于kafka,rocket官方提供了可视化控制台,可以在这里下载https://github.com/apache/rocketmq-externals这是对rocketmq的一个扩展,它不仅包括控制平台的扩展,还包括大数据flume、hbase等组件的对接和扩展。下载并下载源代码。一般下载速度会比较慢。等不及的话可以去网盘下载链接:cd/jackxuwgethttps://github.com/apache/rocketmq-externals/archive/master.zip解压unzipmaster.zip修改配置文件cd/jackxu/rocketmq-externals-master/rocketmq-console/src/main/resourcesvimapplication.properties#这是一个springboot项目,我们需要修改里面的参数#修改端口号:server.port=7298#修改name服务器地址(多个地址用英文分号隔开)rocketmq.config.namesrvAddr=39.103.144.86:9876;42.192.77.73:9876打包成jar包,这里需要先安装maven,如果编译慢,可以换成淘宝cd/jackxu/rocketmq-externals-master/rocketmq-consolemvncleanpackage-Dmaven.test.skip=true启动jar包cdtargetjava-jarrocketmq-console-ng-2.0.0.jar访问http://42.192.77.73:7298/,可以看到已经启动成功。这里有两个坑点,启动的时候会报错。(1)springboot启动时,会报无法连接39.103.144.86:9876;42.192.77.73:9876,这里我第一反应是防火墙的原因,关掉systemctldisablefirewalld.service重新启动,还是不行,那我第二反应是端口没开,telnet42.192。77.739876果然telnet不行,原因是这样的,我安装在云服务器上,默认端口没有打开,需要去控制台打开,这也是个经验。(2)我重启的时候又报错,无法连接到172.26.182.88:9876。我当时很惊讶。我写的地址没有包含这个地址。为什么我连上去,这个IP好像不一样?这就像内网地址。后来打开阿里云控制台,看到是本机的内网地址。然后又google了一下,可能是因为RocketMQ是阿里开源的,那台机器是阿里云的机器,它的源码要先连接到阿里云的内网地址。网上的方法是在配置文件中显式添加公网地址即可解决。#添加公网IPbrokerIP1=39.103.144.86控制台引入运维:主要是设置nameserver和配置vipchannel。Cockpit:控制台的dashboard,可以按broker和topic分别查看消息数量和趋势。Cluster:整个RocketMQ的集群状态,包括分片、个数、地址、版本、消息生产和消息消费的TPS等,做性能测试时可以作为数据指标。Topic:主题,可以添加/更新主题,或查看主题信息,如状态、路由、消费者管理、发送消息等。消费者:可以查看/创建当前broker中的消费者组,包括消费者信息和消费进度。生产者:可以查看当前broker中生产组下的生产者组,包括生产者信息和生产者状态。Message:可以根据topic、messageID、messageKey查询具体的消息。用户中心:切换语言与登录相关(登录需要在控制台配置中开启相应的配置,默认不需要登录)。最常用的是集群、主题、消费者和消息。配置文件说明下面介绍一下RocketMQ配置文件中的属性。首先,集群名称相同。上面四台机器的集群名称都叫brokerClusterName=jackxu-cluster,其次连接的是同一个NameServer,namesrvAddr=39.103.144.86:9876;42.192.77.73:9876。配置文件中brokerId=0代表master,brokerId=1代表slave。在配置文件中,还有这两个属性:brokerRole,在masterbroker中可以配置为SYNC_MASTER或者ASYNC_MASTER,在slavebroker中可以配置为SLAVE流程图。我们推荐的配置是异步刷机+同步复制。HA和failover在之前的版本中,RocketMQ只有master/slave的一种部署模式。一组broker中有一个master,有0个或多个slave。这种模式提供了一定的高可用性。当master宕机时,slave仍然可以提供读服务。默认情况下,读写都在master上。如果开启slaveReadEnable=true,slave也可以参与读负载,但只有当master中消息积压超过物理内存的40%时,才会默认从brokerId为1的slave服务器读取,到哪台机器上读取转向由whichBrokerWhenConsumeSlowly参数控制。org.apache.rocketmq.common.subscription.SubscriptionGroupConfigprivatelongwhichBrokerWhenConsumeSlowly=1;由于存在多个master,当一个master挂掉后,可以写给其他master。RocketMQ在2019年3月发布的4.5.0版本中,使用了Dledger技术来解决自动选主的问题。Dledger是一个基于raft协议的commitlog存储库,也是RocketMQ全新高可用多副本架构的关键。其优点是无需引入外部组件,将自动选主逻辑集成到各个节点的流程中,通过节点间通信完成选主。在这种情况下,commitlog由Dledger管理,具有选择master的功能。默认是不启用的。如果需要启用,需要在配置文件中添加如下配置:#是否启用DLedgerenableDLegerCommitLog=true#DLedgerRaftGroup的名称dLegerGroup=broker-a#DLedger中各个节点的地址和端口DLedgerGroup,至少3个节点dLegerPeers=n0-192.168.44.163:10911;n1-192.168.44.164:10911;n2-192.168.44.165:10911#这个节点iddLegerSelfId=n0首先是体验安装的氛围处理并了解一些参数配置。虽然平时我们可能接触不到它们,但是学习还是需要的。来源:jack_xu|https://juejin.cn/post/692950...
