0. 引言

在学习完rocketmq的基础知识后,我们进入rocketmq高可用保障的章节,即从服务部署架构角度,探索其支持的多节点部署模式。

1. 前备知识

1.1 namesrv集群模式

我们知道rocketmq主要由namesrv和broker组成,其集群的部署自然就是两个服务的集群部署。而大部分我们谈到其集群模式时,其实都是指的broker, 这是因为namesrv是无状态的,什么是无状态的呢? 简单说就是namesrv之间不互相通信,其集群部署只要部署多个节点,broker中配置上多个namesrv的地址信息,只要其中一个namesrv可用,整体就依然可用。

那么这种无状态机制是怎么实现的呢?

其实要聊到namesrv与broker的通信机制,之前我们也简单说明过,具体如下:
1、nameserver 每隔 10s 会扫描一次 Broker,对于没有超过120s都没有回应的broker做剔除处理
2、broker 每隔 30 秒会向集群中所有的 NameServer 发送心跳包(这里发送的namesrv列表,就是写在broker配置文件中的所有namesrv地址),namesrv收到心跳包后会更新状态信息和路由表

所以可以看到broker会像所有的namesrv发送心跳,所以每个namesrv自然不用相互通信了。

1.2 broker集群模式

broker支持的集群模式包括三种:

  • 单主模式

包含一个主节点,一个或多个从节点,主节点负责写操作,从节点负责读操作,主从节点之间通过主从复制机制同步数据,优点是部署维护简单,缺点是当主节点宕机时整个集群将无法工作,所以也没有完整的实现高可用
在这里插入图片描述

  • 多主模式

包含多个主节点,没有从节点,单个节点宕机时对整体集群可用性无影响,但在该节点上还未消费的消息在宕机期间就无法被消费了,短期内对有限的数据消费有影响。
在这里插入图片描述

  • 多主多从模式

包含多个主节点,多个从节点,主节点负责写,每个主节点有自己的一组从节点,从节点负责读,弥补多主模式宕机期间消息无法消费的问题,无单点故障,但相对性能会有所下降
在这里插入图片描述

1.2 broker主从复制原理

主从复制可以基于以下两种机制实现:同步复制和异步复制。

  • 同步复制: 同步复制模式下,主节点会等待至少一个从节点返回确认接收的回执后,才会给生产者发送成功接收回执,该模式强调数据的强一致性,缺点是降低了性能。其执行流程如下:
  1. 生产者会先发送消息到主broker,主broker会将消息写入到commit log中
  2. 主broker写入数据时,会唤醒WriteSocketService线程,查询commit log,将数据发送到从broker
  3. 从接收到消息后,将数据写入到自身的commit log,复制完成后返回新的更新偏移量给主
  4. 主broker同步等待到偏移量返回后,更新偏移量,如果消息偏移量大于等于主从复制请求的偏移量,则说明复制完成,然后返回消息发送成功的回执给生产者
  • 异步复制:主 Broker 发送消息后,不需要等待从 Broker 的确认,即可向生产者返回成功标识。异步复制可以提高性能,但是可能会有数据丢失的风险。
  1. 主broker启动,监听指定端口
  2. 从broker启动,与主broker建立连接
  3. 从broker每5s向主broker拉取消息,从broker收到消息后将数据写入到commit log中,同时返回偏移量给主broker,且更新自身存储的当前最大偏移量

可以看到同步异步的差别,主要是同步由主节点发起复制,异步由从节点发起复制

2. 集群部署

2.1 环境准备

两台部署了rocketmq的服务器,rocketmq在linux中的安装可参考我之前的文章:
linux安装RocketMQ并配置开机自启(一)

2.2 配置讲解

我们通过broker自带的conf目录下的配置文件2m-*,实际就可以知道如何进行配置

在这里插入图片描述
其配置项主要有以下几项:

  1. brokerClusterName=DefaultCluster # 集群名称,同一集群保持一致
  2. brokerName=broker-a # broker组名称,同一主从保持一致
  3. brokerId=1 # brokerid, 每个broker节点唯一,0 表示 Master,>0 表示 Slave
  4. deleteWhen=04 # 删除策略,通常配合时间使用,如每天的“04”点
  5. fileReservedTime=48 # 文件保留时间,单位为小时
  6. brokerRole=SLAVE # 角色,SLAVE从节点,ASYNC_MASTER 异步主节点,SYNC_MASTER 同步主节点
    当为同步主节点时,生产者发送消息给主节点成功,也要发送给从节点成功之后,集群才会返回成功给生产者;当为异步主节点,生产者发送给主节点,主节点写入成功后就会返回成功回执给生产者。
  7. flushDiskType=ASYNC_FLUSH # 主从复制模式,ASYNC_FLUSH异步刷盘,SYNC_FLUSH同步刷盘

2.3 一主多从模式部署

1、提前部署3个namesrv服务节点,3个broker服务节点,其中计划1个为主节点,2个从节点

broker服务节点角色
192.168.244.27
192.168.244.28
192.168.244.29

2、修改主节点服务器的broker.conf配置

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27

3、修改两个从节点的broker.conf配置

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 1 # 注意这里三个broker节点的id都要不一致
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.28 # 节点ip
brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 2 # 注意这里三个broker节点的id都要不一致
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.29 # 节点ip

4、启动3个namesrv

5、启动3个broker

6、查询集群状态

# 进入rocektmq安装目录
cd /data/rocketmq-4.8.0 
# 执行查询
./bin/mqadmin clusterList -n "192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876"

在这里插入图片描述

7、也可以通过管理后台查看集群节点
在这里插入图片描述
8、使用之前的代码测试消息发送
在这里插入图片描述
消息消费也正常
在这里插入图片描述

2.4 多主无从模式部署

1、提前部署2个namesrv服务节点,2个broker服务节点,其中计划2个为主节点,无从节点

broker服务节点角色
192.168.244.27
192.168.244.28

2、修改其中一个节点服务器的broker.conf配置

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27

3、修改另一个节点的broker.conf配置

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-b
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27

4、启动2个namesrv

5、启动2个broker

6、查询集群状态

# 进入rocektmq安装目录
cd /data/rocketmq-4.8.0 
# 执行查询
./bin/mqadmin clusterList -n "192.168.244.27:9876;192.168.244.28:9876"

在这里插入图片描述

2.5 多主多从模式部署

1、提前部署3个namesrv服务节点,4个broker服务节点,其中计划2个为主节点,2个从节点

broker服务节点角色
192.168.244.27主1
192.168.244.28主2
192.168.244.29从1
192.168.244.30从2

2、修改主1节点服务器的broker.conf配置

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.27

3、修改主2节点的broker.conf配置

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-b
brokerId = 0 # 注意这里三个broker节点的id都要不一致
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.28 # 节点ip, 另一个是192.168.244.29

4、修改两个从节点的配置分别为

brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-a
brokerId = 1
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.29
brokerClusterName = DefaultCluster # 集群名称
brokerName = broker-b
brokerId = 1
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH
# namesrv集群直接配置多个namesrv地址即可,分号隔开
namesrvAddr=192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876
# 开启topic自动创建
autoCreateTopicEnable = true
brokerIP1 = 192.168.244.30

4、启动3个namesrv

5、启动4个broker

6、查询集群状态

# 进入rocektmq安装目录
cd /data/rocketmq-4.8.0 
# 执行查询
./bin/mqadmin clusterList -n "192.168.244.27:9876;192.168.244.28:9876;192.168.244.29:9876"

显示有2个主节点,2个从节点
在这里插入图片描述

3. 总结

综上,我们针对rocketmq的三种集群模式部署就讲解完成了,如果需要调整刷盘模式,调整flushDiskType参数即可。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐