RocketMQ集群高可用

DLedger 模式

broker 一主两从(自动切换)

namesrv 三个节点(程序连接)

rocketmq-console 图形化

 

1.RocketMQ的整体架构与运行流程

 

2.基于NameServer管理Broker集群的架构

 

3.Broker集群的主从复制架构

 

4.基于TopicQueue实现的数据分片架构

 

架构图原理参考:https://zhuanlan.zhihu.com/p/1908105027337298877

RocketMQ集群分类

单 Master 模式

这是最简单的部署方式,仅包含一个 Master Broker 和一个 NameServer 优点: 配置简单:非常适合在本地开发环境进行学习和测试 缺点: 存在单点故障:一旦这个唯一的 Master Broker 宕机或重启,整个消息服务将完全中断,不适合线上环境

 

多 Master 模式

集群由多个 Master Broker 节点组成,没有 Slave 节点

优点: 配置相对简单:相比于引入 Slave 的模式,配置更直接 性能最高:因为所有节点都是 Master,可以直接处理写请求,没有主从复制的开销 单个节点故障影响有限:比如你有三个 Master,其中一个宕机,另外两个仍能正常提供服务

缺点: 单台机器宕机期间,该机器上尚未被消费的消息在恢复前不可用,会影响消息消费的实时性

 

多 Master 多 Slave 模式

这是生产环境更常用的高可用架构。它又根据主从间数据同步方式的不同,分为两种:

异步复制模式

Master 接收到消息后,会异步地将消息复制到其对应的 Slave

优点: 高可用:Master 宕机后,消费者仍然可以从 Slave 读取消息,保证了服务的持续可用性 消息实时性不受影响:消费者可以无缝切换 性能接近多 Master 模式:由于复制是异步的,对主节点的写入性能影响很小

缺点: 可能丢失少量消息:如果 Master 在尚未将消息同步给 Slave 时就发生宕机且磁盘损坏,这部分消息就会永久丢失

同步双写模式

Master 接收到消息后,必须等待 Slave 也写入成功,才会向生产者返回成功应答

 

Dledger 模式

这是一种更为先进和自动化的高可用方案,基于 Raft 共识算法实现,已成为当前生产环境的主流推荐

优点: 高可用且数据可靠:集成了自动的 Leader 选举,Master 故障时能自动切换,无需人工干预,避免了手动运维期间的服務中断

缺点: 性能相对较低:每次写入都需要集群多数节点确认,因此在性能上通常会低于异步复制模式

 

 

部署

一、准备数据目录 此测试为一台机器部署,多台机器 注意数据分开

mkdir data{1..3}     #多台机器 只创建一个
chmod 777 data*

 

创建overlay网络

A节点
docker swarm init --advertise-addr <主机A_IP>
B节点
docker swarm join --token <TOKEN> <主机A_IP>:2377
A节点创建

docker network create -d overlay \
--subnet=10.200.100.0/24 \
--gateway=10.200.100.1 \
--attachable \
my-net

 

测试
# 在主机 A 运行容器并指定 IP
docker run -d --network=my-paasmes --ip=10.200.100.10 nginx:1.24

# 在主机 B 测试跨主机通信 #新加入的节点,有容器使用该网络情况下。 才会显示my-paasmes网络。启动yml没网络时,先启动以下容器
docker run -it --rm --network=my-paasmes alpine ping 10.200.100.10

 

 

二、准备 三个 broker 配置文件 跨主机创建 Overlay 网络 或用ip指定

vim  n0.conf

brokerClusterName = RaftCluster
brokerName=RaftNode00
namesrvAddr=namesrv:9876;namesrv2:9876;namesrv3:9876   #指定三个namesrv
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-broker1:20911;n1-broker2:20911;n2-broker3:20911 #指定三个broker
dLegerSelfId=n0    #节点不同,配置不同
sendMessageThreadPoolNums=2
storePathRootDir=/home/rocketmq/store    #指定数据目录
storePathCommitLog=/home/rocketmq/store/commitlog
diskMaxUsedSpaceRatio=99   #剩余磁盘比例
cleanFileForDisk = true    #开启自动清理磁盘

 

 vim  n1.conf

brokerClusterName = RaftCluster
brokerName=RaftNode00
namesrvAddr=namesrv:9876;namesrv2:9876;namesrv3:9876
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-broker1:20911;n1-broker2:20911;n2-broker3:20911
dLegerSelfId=n1
sendMessageThreadPoolNums=2
storePathRootDir=/home/rocketmq/store
storePathCommitLog=/home/rocketmq/store/commitlog
diskMaxUsedSpaceRatio=99
cleanFileForDisk = true

 

  vim  n2.conf

brokerClusterName = RaftCluster
brokerName=RaftNode00
namesrvAddr=namesrv:9876;namesrv2:9876;namesrv3:9876
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
dLegerPeers=n0-broker1:20911;n1-broker2:20911;n2-broker3:20911
dLegerSelfId=n2
sendMessageThreadPoolNums=2
storePathRootDir=/home/rocketmq/store
storePathCommitLog=/home/rocketmq/store/commitlog
diskMaxUsedSpaceRatio=99
cleanFileForDisk = true

 

 

三、准备yml文件 单机部署创建的网络,多机部署指定 Overlay 网络

[jack@hpf-mes02 mq-test]# cat  mq.yml
version: '3.8'
services:
  rocketmq-console:
    image: styletang/rocketmq-console-ng
    container_name: rocketmq-console
    restart: unless-stopped
    ports:
      - "8008:8080"
    environment:
      - JAVA_OPTS=-Drocketmq.namesrv.addr=namesrv:9876;namesrv2:9876;namesrv3:9876;  #指定三个namesrv
      - com.rocketmq.sendMessageWithVIPChannel=false
    networks:
      - linshi





  namesrv:
    image: apache/rocketmq:5.3.2
    container_name: namesrv
    environment:
      - JAVA_OPT=-server -Xms256m -Xmx256m -Xmn128m
    networks:
      - linshi
    ports:
      - "9876:9876"
    restart: unless-stopped
    command: sh mqnamesrv

  namesrv2:
    image: apache/rocketmq:5.3.2
    container_name: namesrv2
    environment:
      - JAVA_OPT=-server -Xms256m -Xmx256m -Xmn128m
    networks:
      - linshi
    ports:
      - "9877:9876"
    restart: unless-stopped
    command: sh mqnamesrv

  namesrv3:
    image: apache/rocketmq:5.3.2
    container_name: namesrv3
    environment:
      - JAVA_OPT=-server -Xms256m -Xmx256m -Xmn128m
    networks:
      - linshi
    ports:
      - "9878:9876"
    restart: unless-stopped
    command: sh mqnamesrv




  broker:
    image: apache/rocketmq:5.3.2
    container_name: broker
    environment:
      - JAVA_OPT=-server -Xms256m -Xmx256m -Xmn128m
      - NAMESRV_ADDR=namesrv:9876;namesrv2:9876;namesrv3:9876;  #指定三个namesrv
    volumes:
      - ./n0.conf:/home/rocketmq/rocketmq-5.3.2/conf/broker.conf
      - ./data1:/home/rocketmq/store
    networks:
      - linshi
    restart: unless-stopped
    command: sh mqbroker autoCreateTopicEnable=true --enable-proxy -c /home/rocketmq/rocketmq-5.3.2/conf/broker.conf
    depends_on:
      - namesrv

  broker2:
    image: apache/rocketmq:5.3.2
    container_name: broker2
    environment:
      - JAVA_OPT=-server -Xms256m -Xmx256m -Xmn128m
      - NAMESRV_ADDR=namesrv:9876;namesrv2:9876;namesrv3:9876;
    volumes:
      - ./n1.conf:/home/rocketmq/rocketmq-5.3.2/conf/broker.conf
      - ./data2:/home/rocketmq/store
    networks:
      - linshi
    restart: unless-stopped
    command: sh mqbroker autoCreateTopicEnable=true --enable-proxy -c /home/rocketmq/rocketmq-5.3.2/conf/broker.conf
    depends_on:
      - namesrv

  broker3:
    image: apache/rocketmq:5.3.2
    container_name: broker3
    environment:
      - JAVA_OPT=-server -Xms256m -Xmx256m -Xmn128m
      - NAMESRV_ADDR=namesrv:9876;namesrv2:9876;namesrv3:9876;
    volumes:
      - ./n2.conf:/home/rocketmq/rocketmq-5.3.2/conf/broker.conf
      - ./data3:/home/rocketmq/store
    networks:
      - linshi
    restart: unless-stopped
    command: sh mqbroker autoCreateTopicEnable=true --enable-proxy -c /home/rocketmq/rocketmq-5.3.2/conf/broker.conf
    depends_on:
      - namesrv

networks:
  linshi:
    name: linshi
    external: true

 

 

四、验证

浏览器打开 ip:8008 mq管理页面 可以看到一主两从

 

不管停哪个节点, 业务都能正常显示。

注意 停namesrv 服务时,可能短暂几秒无法显示,过几秒恢复

posted @ 2025-10-16 17:27  mrdongdong  阅读(5)  评论(0)    收藏  举报