写点什么

走进 RocketMQ- 部署模式与实战

作者:白裤
  • 2023-02-26
    广东
  • 本文字数:4578 字

    阅读完需:约 15 分钟

走进RocketMQ-部署模式与实战

前言

Halo,我是白裤。


上一次我们学习了 RocketMQ 的整体架构与设计,了解了 RocketMQ 的整体架构、模型设计以及它的一个工作流程,今天我们将学习 RocketMQ 的几种部署模式,并且实际动手进行 Dledger 模式的部署,让我们开始学习吧。

部署模式

首先在部署实战前,我们先简单来看看 RocketMQ 的几种部署方式,其中包括了单点模式、多主模式、多主多从模式(异步复制)、多主多从(同步双写)、Dledger 模式,每种部署方式都有其比较明显的特点,我们要了解清楚这些部署模式的优缺点,这样我们在生产环境中就可以去选择适合自己业务需求的一个方案。

1.单点模式


单点模式就是单独部署一个节点,主要是本地测试使用,一般不会用于生产环境的部署,因为单点大家都知道风险是很大的,如果宕机,则整个服务将会处于不可用状态,大家生产环境还是建议不要使用这种模式哦,不过有勇敢的兄弟想尝试也不是不行,我只能告诉你:试试就逝世。


  • 优点

部署简单,一个节点直接启动搞定完事。

  • 缺点

单点挂掉的时候会停止提供服务,一挂你这个月的绩效可能就 GG 了。

2.多主模式


多主模式其实就是部署多个节点,每个节点都支持读写操作,也没有从节点啥的,就是各自不互相影响的多个节点。


  • 优点

部署也相对简单,单独启动多个节点即可,即使某个节点宕机了,也不会影响整个应用的运行与服务提供。

  • 缺点

某个节点宕机的话,在这个节点上的消息可能不能实时地进行消费,这点需要注意。

3.多主多从模式(异步复制)


多主多从(异步复制)就是部署的时候,每个 Master 节点配置一个 Slave 节点,有多对 Master 和 Slave,Master 消息数据会以异步的方式复制给 Slave,当 Master 宕机的时候消费者还可以从 Slave 读取消息,从而对消息的消费不会产生较大的影响,由于 Master 和 Slave 之间呢是用异步复制的方式来进行数据同步的,所以消息的实时性可能不能很好的保证,即存在延迟,同时当 Master 宕机的时候可能会丢失消息。


  • 优点

在有 Slave 的备用节点下,当 Master 宕机时,消费者仍然可以从 Slave 处消费消息,这样不会影响到消息的消费,这个过程是 RocketMQ 自己去处理的。

  • 缺点

当 Master 宕机时,磁盘如果损坏会有消息丢失的情况,虽然可以从 Slave 消费消息,但是分配在该 Master 节点上的队列接收不了消息的生产。

4.多主多从模式(同步双写)


多主多从(同步双写)模式指的是每个 Master 节点配置一个 Slave 节点,有多对 Master 和 Slave,消息在生产到 Master 的时候会以同步的方式将消息数据写到 Slave 上,当 Master 和 Slave 都写入成功后消息才真正写入成功,由于是同步的,所以 Master 和 Slave 的数据没有延迟的问题,不过正因为是同步存储,所以在性能上会有所降低。


  • 优点

同步双写可以保证数据不丢失,数据的可靠性高。

  • 缺点

首先在性能上同步双写比异步复制要低,另外,Master 宕机后,Slave 是不会自动切换为 Master 的。

5.Dledger 模式(自动主从切换)


Dledger 模式是每个 Broker 组部署奇数台节点,比如三个节点,其中包括一个 Master 和两个 Slave 节点,数据在写入 Master 节点时,会推送给其他 Slave 节点,以此来保证数据的一致性,当 Master 节点宕机时,Dledger 会通过 Raft 协议从 Slave 节点中选举出一个新的 Master 节点继续对外提供服务,从而保证 Broker 的高可用。


  • 优点

多节点数据同步保证了数据的可靠性,自动主从切换保证了服务的高可用性。

  • 缺点

这个部署方式相对来说没有啥太大的缺点问题,可能在性能上相对于主从模式有些许的降低,不过 Dledger 模式在 4.8.0 版本之后使用了 Pipeline 模式和批量复制,性能已经有了很大的提升。

部署实战

在了解了 RocketMQ 的几种部署方式之后,我们来开始动手试着自己去部署一个 RocketMQ 集群,通过上面的几种部署方式的了解,我们知道 Dledger 这种模式其实是很好的一种部署方案,我们接下来将带着大家去试着部署这样一种模式的集群。

环境准备

  • 三台服务器(131、132、133)

  • RocketMQ Binary 包

  • JDK1.8.0 环境

操作步骤

JDK 安装

分别在三台机器上面安装 JDK


1.查看安装包


yum list java*
复制代码



2.安装对应版本的包


yum install -y java-1.8.0-openjdk*
复制代码



3.检查安装结果


java -version
复制代码


RocketMQ 部署

部署准备

首先我们到官网下载 RocketMQ Binary 包,下载地址:


下载 | RocketMQ (apache.org)



然后我们选择一个版本进行下载就可以了,这里我们选择的是 4.9.2 的版本进行部署测试。


1.在三台机器上面/usr/local 目录下创建 rocketmq 文件夹:


cd /usr/localmkdir rocketmq
复制代码


2.将下载的安装包上传至/usr/local/rocketmq 目录下:



3.解压 rocketmq-all-4.9.2-bin-release.zip 包到当前目录下:


cd /usr/local/rocketmqunzip rocketmq-all-4.9.2-bin-release.zip
复制代码


NameServer 部署

之前我们讲过 NameServer 是彼此之间不通信的,所以我们需要在三台机器上都启动 NameServer 来构成 NameServer 集群。


1.进入/usr/local/rocketmq/rocketmq-4.9.2/bin 目录下:


cd /usr/local/rocketmq/rocketmq-4.9.2/bin
复制代码


2.启动 NameServer:


nohup sh mqnamesrv > ./nameserver.log 2>&1 &
复制代码


3.查看 NameServer 启动结果:


由于 NameServer 默认端口是 9876,所以我们可以通过查看端口 9876 来确定:


netstat -tunlp | grep 9876
复制代码



亦或者我们可以通过查看 Java 进程来查看:


ps -ef | grep java
复制代码



我们在启动 NameServer 时需要注意一点的是启动的 JVM 参数,需要根据机器的信息来进行调整,这里 NameServer 启动的参数我们可以在/usr/local/rocketmq/rocketmq-4.9.2/bin 目录下的 runserver.sh 文件里面自行修改即可

Broker 部署

由于我们是 Dledger 模式部署,所以一组 Dledger 组至少需要三个节点,一个 Master 节点两个 Slave 节点,所以我们分别在三台机器上部署一个节点来组成一个 Dledger 组。


首先我们来看下 Broker 的配置文件:


cd /usr/local/rocketmq/rocketmq-4.9.2/conf
复制代码



我们可以看到有上面我们介绍的几种模式,2m-2s-async 表示两主两从异步复制模式,2m-noslave 表示两主无从模式,2m-2s-sync 代表两主两从同步双写模式,而我们此次部署的 dledger 模式的配置文件则在 dledger 目录下了。


接下来,我们进入到 dledger 目录下,可以看到有三个配置文件:



我们在三台机器上面分别修改 Broker 的配置文件:


  • 131 机器上面修改 broker-n0.conf 文件:


## 集群名称brokerClusterName = RaftCluster
## broker组名,同一个RaftClusterGroup内,brokerName名要一样brokerName=RaftNode00
## 监听端口listenPort=30911
## 你的NameServer地址namesrvAddr=xxx.xxx.xxx.xxx:9876;xxx.xxx.xxx.xxx:9876;xxx.xxx.xxx.xxx:9876
## 存储位置storePathRootDir=/usr/local/rocketmq/rmqstore/node00storePathCommitLog=/usr/local/rocketmq/rmqstore/node00/commitlogenableDLegerCommitLog=true
## DLedger Raft Group的名字,建议和 brokerName 保持一致dLegerGroup=RaftNode00
## DLedger Group 内各节点的端口信息,同一个 Group 内的各个节点配置必须要保证一致dLegerPeers=n0-xxx.xxx.xxx.xxx:40911;n1-xxx.xxx.xxx.xxx:40911;n2-xxx.xxx.xxx.xxx:40911
## 节点 id, 必须属于 dLegerPeers 中的一个;同 Group 内各个节点要唯一dLegerSelfId=n0
## 发送线程个数,建议配置成 Cpu 核数sendMessageThreadPoolNums=4
复制代码


  • 132 机器上面修改 broker-n1.conf 文件:


## 集群名称brokerClusterName = RaftCluster
## broker组名,同一个RaftClusterGroup内,brokerName名要一样brokerName=RaftNode00
## 监听端口listenPort=30911
## 你的NameServer地址namesrvAddr=xxx.xxx.xxx.xxx:9876;xxx.xxx.xxx.xxx:9876;xxx.xxx.xxx.xxx:9876
## 存储位置storePathRootDir=/usr/local/rocketmq/rmqstore/node00storePathCommitLog=/usr/local/rocketmq/rmqstore/node00/commitlogenableDLegerCommitLog=true
## DLedger Raft Group的名字,建议和 brokerName 保持一致dLegerGroup=RaftNode00
## DLedger Group 内各节点的端口信息,同一个 Group 内的各个节点配置必须要保证一致dLegerPeers=n0-xxx.xxx.xxx.xxx:40911;n1-xxx.xxx.xxx.xxx:40911;n2-xxx.xxx.xxx.xxx:40911
## 节点 id, 必须属于 dLegerPeers 中的一个;同 Group 内各个节点要唯一dLegerSelfId=n1
## 发送线程个数,建议配置成 Cpu 核数sendMessageThreadPoolNums=4
复制代码


  • 133 机器上面修改 broker-n2.conf 文件:


## 集群名称brokerClusterName = RaftCluster
## broker组名,同一个RaftClusterGroup内,brokerName名要一样brokerName=RaftNode00
## 监听端口listenPort=30911
## 你的NameServer地址namesrvAddr=xxx.xxx.xxx.xxx:9876;xxx.xxx.xxx.xxx:9876;xxx.xxx.xxx.xxx:9876
## 存储位置storePathRootDir=/usr/local/rocketmq/rmqstore/node00storePathCommitLog=/usr/local/rocketmq/rmqstore/node00/commitlogenableDLegerCommitLog=true
## DLedger Raft Group的名字,建议和 brokerName 保持一致dLegerGroup=RaftNode00
## DLedger Group 内各节点的端口信息,同一个 Group 内的各个节点配置必须要保证一致dLegerPeers=n0-xxx.xxx.xxx.xxx:40911;n1-xxx.xxx.xxx.xxx:40911;n2-xxx.xxx.xxx.xxx:40911
## 节点 id, 必须属于 dLegerPeers 中的一个;同 Group 内各个节点要唯一dLegerSelfId=n2
## 发送线程个数,建议配置成 Cpu 核数sendMessageThreadPoolNums=4
复制代码


注意:上面配置文件中的 xxx.xxx.xxx.xxx 为你的服务器地址


接下来我们分别启动三台机器上的 Broker 节点:


  • 第一台机器

进入 bin 目录:


  cd /usr/local/rocketmq/rocketmq-4.9.2/bin
复制代码


启动 Broker:


  nohup ./mqbroker -c ../conf/dledger/broker-n0.conf > ./broker.log 2>&1 &
复制代码


  • 第二台机器

进入 bin 目录:


  cd /usr/local/rocketmq/rocketmq-4.9.2/bin
复制代码


启动 Broker:


  nohup ./mqbroker -c ../conf/dledger/broker-n1.conf > ./broker.log 2>&1 &
复制代码


  • 第三台机器

进入 bin 目录:


  cd /usr/local/rocketmq/rocketmq-4.9.2/bin
复制代码


启动 Broker:


  nohup ./mqbroker -c ../conf/dledger/broker-n2.conf > ./broker.log 2>&1 &
复制代码


我们在确认完三台机器的 Broker 都启动正常的情况下,我们在其中一台机器上看下整个 Dledger 集群的节点状态:


首先进入 bin 目录:


cd /usr/local/rocketmq/rocketmq-4.9.2/bin
复制代码


执行一下命令查看集群状态:


sh ./mqadmin clusterList -n 127.0.0.1:9876
复制代码


结果如下:



我们可以看到三个 Broker 节点已经组成一个 Dledger 组,其中 BID 为 0 的为 Master 节点,其余为 Slave 节点。

容灾测试

接下来我们来测试一下 Dledger 的主从自动切换容灾功能:


进入 BID=0 的节点机器,将 Broker 停掉:


cd /usr/local/rocketmq/rocketmq-4.9.2/bin
复制代码


sh ./mqshutdown broker
复制代码



然后我们再看看 Broker 集群状态:



可以看到,此时 BID=0 的节点为 133 机器节点,一开始我们的 Master 节点是 132 的机器节点,现在 132 节点被 shutdown 后,RocketMQ 自动将 133 节点切换成了 Master 节点,证明 Dledger 模式是拥有实现主从自动切换容灾的功能的。


我们再把 132 的 Broker 启动起来:


cd /usr/local/rocketmq/rocketmq-4.9.2/bin
复制代码


nohup ./mqbroker -c ../conf/dledger/broker-n1.conf > ./broker.log 2>&1 &
复制代码



可以看到,132 机器的 Broker 正常加入到了集群中,至此,我们的整个基于 Dledger 模式的部署已经完成。

小结

我们通过对 RocketMQ 几种部署模式的了解,知道了几种模式的不同特点,同时,我们自己动手部署了一套基于 Dledger 模式的 RocketMQ 集群,并验证了 Dledger 模式下的主从自动切换容灾功能,让我们对 RocketMQ 又有了进一步的了解。


好了,今天我们就学习到这里,下一次我们将学习 RocketMQ 消息的存储与消费是如何设计的。

发布于: 刚刚阅读数: 3
用户头像

白裤

关注

还未添加个人签名 2021-04-25 加入

一个很懒的人

评论

发布
暂无评论
走进RocketMQ-部署模式与实战_RocketMQ_白裤_InfoQ写作社区