前面分享了一篇介绍消息中间件mq的文章,有些小伙伴看完向我反馈,还是很懵圈,希望我写个小demo,能手把手介绍mq的测试方法。
接下来打算用几篇文章详细介绍,日常业务测试中遇到的mq测试场景。万事开头难,想了解mq测试场景,首先得先搭建一个mq的集群,这样才能进行测试场景介绍,本篇文章主要介绍如何搭建RocketMq高可用集群,文末还会附上生产者消费者的代码。
为什么要用RocketMq?
消息队列 RocketMQ 是阿里巴巴集团自主研发的专业消息中间件。 产品基于高可用分布式集群技术,提供消息订阅和发布、消息轨迹查询、定时(延时)消息、资源统计、监控报警等一系列消息云服务,是企业级互联网架构的核心产品。
Dledger 作为一个轻量级的 Java Library,它的作用就是将 Raft 有关于算法方面的内容全部抽象掉,开发人员只需要关心业务即可。
在 RocketMQ 4.5 版本之前,RocketMQ 只有 Master/Slave 一种部署方式,一组 broker 中有一个 Master ,有零到多个Slave,Slave 通过同步复制或异步复制的方式去同步 Master 数据。
Master/Slave 部署模式,提供了一定的高可用性。
但这样的部署模式,有一定缺陷。比如故障转移方面,如果主节点挂了,还需要人为手动进行重启或者切换,无法自动将一个从节点转换为主节点。因此,我们希望能有一个新的多副本架构,去解决这个问题。
新的多副本架构首先需要解决自动故障转移的问题,本质上来说是自动选主的问题。这个问题的解决方案基本可以分为两种:
- 利用第三方协调服务集群完成选主,比如 zookeeper 或者 etcd。这种方案会引入了重量级外部组件,加重部署,运维和故障诊断成本,比如在维护 RocketMQ 集群还需要维护 zookeeper 集群,并且 zookeeper 集群故障会影响到 RocketMQ 集群。
- 利用 raft 协议来完成一个自动选主,raft 协议相比前者的优点是不需要引入外部组件,自动选主逻辑集成到各个节点的进程中,节点之间通过通信就可以完成选主。
因此最后选择用 raft 协议来解决这个问题,而 DLedger 就是一个基于 raft 协议的 commitlog 存储库,也是 RocketMQ 实现新的高可用多副本架构的关键。
因此我们打算部署一套基于Dledger 技术的RocketMQ 高可用测试集群
技术架构
RocketMQ架构上主要分为四部分:
① Producer :支持分布式集群方式部署。
② Consumer :支持分布式集群方式部署。
③ NameServer :
- 是一个非常简单的Topic路由注册中心,支持Broker的动态注册与发现。
- Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;
- 路由信息管理,每个NameServer将保存关于Broker集群的整个路由信息和用于客户端查询的队列信息。然后Producer和Conumser通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。
④ BrokerServer :
- 主要负责消息的存储、投递和查询以及服务高可用保证。
工作流程
① 启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心。
② Broker启动,跟所有的NameServer保持长连接,定时发送心跳包。心跳包中包含当前Broker信息(IP+端口等)以及存储所有Topic信息。注册成功后,NameServer集群中就有Topic跟Broker的映射关系。
③ 收发消息前,先创建Topic,创建Topic时需要指定该Topic要存储在哪些Broker上,也可以在发送消息时自动创建Topic。
④ Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取当前发送的Topic存在哪些Broker上,轮询从队列列表中选择一个队列,然后与队列所在的Broker建立长连接从而向Broker发消息。
⑤ Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取当前订阅Topic存在哪些Broker上,然后直接跟Broker建立连接通道,开始消费消息。
搭建集群前准备
我们需要三台服务器,虚拟机、云服务器、物理机都行,建议在电脑上搭建自己的虚拟机,三台就行。
服务器说明:(生产中应该将 NameServer 部署到其他服务器中,在这为了方便,与Broker部署在一起)
每台服务器都要安装jdk8环境,配置好java的环境变量。
172.30.34.10服务器,执行以下命令
wget https://archive.apache.org/dist/rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip unzip rocketmq-all-4.7.1-bin-release.zip cd rocketmq-all-4.7.1-bin-release vi bin/runserver.sh
执行最后一条命令,会出现以下情况
红圈里的配置是关于jvm的,感兴趣可以看下我之前的文章 测试工程师都能看懂的Jvm知识 下,因为考虑到服务器资源有限,所以建议调整jvm大小,避免出现内存不足导致启动失败的问题,建议采用以下配置:
-server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=32m -XX:MaxMetaspaceSize=50m
启动NameServer
nohup sh bin/mqnamesrv &
执行以下命令
tail -f ~/logs/rocketmqlogs/namesrv.log
看到红圈里的内容就说明启动成功了
其他两台服务器172.30.35.37、172.30.35.35执行以上同样的操作,另外两台服务器出现上述成功标志,说明三台nameserver启动成功!
启动broker
启动master broker
登录到172.30.34.10服务器上,执行以下命令:
cd /usr/rocketmq/rocketmq-all-4.7.1-bin-release vim conf/dledger/broker-n0.conf
会出现以下结果: