RocketMQ作为阿里系的一款开源的MQ中间件,经历了双十一的高并发场景的消息流转,能够处理万亿级别的消息。,这篇文章将作为《RocketMQ 进阶》专栏的第一篇文章,介绍一下实际生产中如何搭建一个高可用的RocketMQ集群。集群整体架构图如下:,
,消息队列是一种“先进先出”的数据结构,
,其应用场景主要包含以下3个方面,系统的耦合性越高,容错性就越低。以电商应用为例,用户创建订单后,如果耦合调用库存系统、物流系统、支付系统,任何一个子系统出了故障或者因为升级等原因暂时不可用,都会造成下单操作异常,影响用户使用体验。,
,使用消息队列解耦合,系统的耦合性就会提高了。比如物流系统发生故障,需要几分钟才能来修复,在这段时间内,物流系统要处理的数据被缓存到消息队列中,用户的下单操作正常完成。当物流系统回复后,补充处理存在消息队列中的订单消息即可,终端系统感知不到物流系统发生过几分钟故障。,
,
,应用系统如果遇到系统请求流量的瞬间猛增,有可能会将系统压垮。有了消息队列可以将大量请求缓存起来,分散到很长一段时间处理,这样可以大大提到系统的稳定性和用户体验。,
,一般情况,为了保证系统的稳定性,如果系统负载超过阈值,就会阻止用户请求,这会影响用户体验,而如果使用消息队列将请求缓存起来,等待系统处理完毕后通知用户下单完毕,这样总不能下单体验要好。,处于经济考量目的:,业务系统正常时段的QPS如果是1000,流量最高峰是10000,为了应对流量高峰配置高性能的服务器显然不划算,这时可以使用消息队列对峰值流量削峰,
,通过消息队列可以让数据在多个系统更加之间进行流通。数据的产生方不需要关心谁来使用数据,只需要将数据发送到消息队列,数据使用方直接在消息队列中直接获取数据即可,
,常见的MQ产品包括Kafka、ActiveMQ、RabbitMQ、RocketMQ。,
,关于MQ技术选型详细可以看笔者之前的文章:聊聊 MQ 技术选型,从上述的集群架构图中可以知道RocketMQ中涉及到的几个重要的角色:,以上四个是RocketMQ对外四种角色,另外内部还有一些重要角色,如下:,关于Topic和Tag的区别:比如电商中的下单、支付流程,为了提高并发量通常都会使用消息队列进行异步处理,那么可以定义消息的Topic为Topic_order,但是其中还涉及了创建订单、付款、完成订单这三类消息,如何去区分?,此时就该用到Tag去细分了,此时的对应关系如下图:,
,Topic和Message Queue的关系如下图:,
,一个Topic中包含多个Message Queue(队列),阿里将RocketMQ贡献给了Apache,所以要去Apache的官网去下载对应的版本;,地址:https://rocketmq.apache.org/dowloading/releases/,我的《RocketMQ 进阶》这个专栏选用的版本是4.9.4,下载地址:https://rocketmq.apache.org/download,针对RocketMQ对外的四种角色,集群部署有以下几点需要注意的地方:,注意这里说的集群模式是针对broker,因为涉及到broker的节点之间的数据同步问题。,NameServer各个节点间不互相通信,只需要启动多个服务便可实现一个集群,RocketMQ支持四种集群模式,如下:,不建议使用,一旦服务重启或者宕机将导致整个服务不可用,这个集群模式无slave节点,全部都是master节点,该模式如下图:,
,该模式的优缺点如下:,每个master对应一个slave节点,有多对master-slave,主从之间的数据复制采用同步双写的形式,如下图:,
,主从同步双写是什么意思?,producer发送一条消息给broker的主节点,只有主节点将数据同步到从节点才会返回结果,此时的发送消息流程如下:,
,需要经过以上4步才能实现消息发送成功,此时如果主从数据复制阻塞,那么producer必须等待直到成功。,这种模式的优缺点如下:,每个Master配置一个Slave,有多对master-slave,采用异步复制的方式,如下:,
,消息发送到的master后直接返回,不必等待主从复制,而是内部通过异步的方式进行复制。,该种模式的优缺点如下:,根据上面的介绍,主从同步集群模式使用4个节点,分别是两个主节点、两个从节点。,笔者这里是使用两台机器将节点均摊,如下图:,
,在安装之前需要做些准备工作,如下:,笔者使用的是Centos7的虚拟机进行演示,如下:,RocketMQ的启动需要依赖的一个环境变量:ROCKETMQ_HOME(RocketMQ的根目录),除了以上RocketMQ的环境变量配置,还需添加JDK的配置,省略...,配置保存之后,执行下述命令:,RocketMQ是将消息存储在磁盘,因此需要创建存储路径,如下:,总共四个节点,分别配置如下:,(1)master1,这个配置文件是broker-a.properties,如下:,(2)slave2,修改配置文件broker-b-s.properties,如下:,(3)master2,修改broker-b.properties,如下:,(4)slave1,修改broker-a-s.properties,如下:,关于上面的各个配置有什么用后面章节会详细介绍,宿主机需要远程访问虚拟机的rocketmq服务和web服务,需要开放相关的端口号,简单粗暴的方式是直接关闭防火墙,或者为了安全,只开放特定的端口号,RocketMQ默认使用3个端口:9876 、10911 、11011 。如果防火墙没有关闭的话,那么防火墙就必须开放这些端口:,执行以下命令:,需要在hosts中添加信息,这样后面的配置就不用通过ip指定了。,执行如下命令进入hosts文件:,配置信息如下:,配置完成后, 重启网卡:,内置RocketMQ启动对服务器内存要求较高,由于笔者本地测试的配置较低,因此需要修改JVM启动参数,以下两个脚本都在bin目录下。,(1)runbroker.sh脚本修改:,
,根据自己服务器的配置进行修改,(2) runserver.sh 脚本修改:,
,RocketMQ启动分为两步:,(1)启动NameServer,分别在两台服务器上启动,命令如下:,(2)启动broker集群,这里master和slave总计四个,均摊在两个服务器上,下面分别启动,master1启动,命令如下:,slave2启动,命令如下:,master1和slave2在同一台服务器上(192.168.47.146),master2启动,命令如下:,slave1启动,命令如下:,master2和slave1在同一台服务器上(192.168.47.145),第7步启动成功后,查询进程状态观察RocketMQ是否启动成功,命令如下:,
,同时也可以观察RocketMQ的日志看下是否异常,命令如下:,RocketMQ有一个对其扩展的开源项目rocketmq-dashboard,直接将该项目拉到本地,修改其中的几个参数编译打包即可,修改application.yml中的NameServer的配置,改成自己搭建的地址,如下:,
,然后打包运行,命令如下:,运行成功之后,浏览器访问:http://ip:8080,
,进入集群这一栏,看下自己搭建的集群信息,如下图:,
,本节内容主要介绍了MQ的基本知识以及RocketMQ集群搭建过程,有兴趣的可以按照笔者的整个搭建过程尝试一遍,至于其中一些配置属性以及生产、消费消息将会在后文介绍。
© 版权声明
文章版权归作者所有,未经允许请勿转载。