前言

上一篇文章我们一起聊了聊RocketMQ的NameServer的一些内部工作流程,了解了NameServer的部署和与Broker之间的联系,那么今天我们就来一起聊聊Broker的一些内部原理。

Master Broker与Slave Broker之间的消息同步

看过之前文章的小伙伴们都清楚,Broker是RocketMQ的核心模块,负责接收并存储消息,为了保证整个MQ的高可用,一般情况都会将Broker部署成集群,集群中的每一部分都由Master和Slave组成,那么Master与Slave之间的数据是如何保证同步一致的呢?

是Master主动把数据推送给Slave?还是Slave主动发送请求去Master拉取最新数据?

答案是第二种,RocketMQ的内部原理就是Slave不停的向Master发送请求拉取数据,也就是说这是一种Pull模式拉取消息,而不是Push模式推送消息。

Master Broker与Slave Broker实现读写分离了吗

上边我们了解到,Master Broker主要接收来自系统的请求,之后Slave Broker会向Master Broker发出拉取请求,同步数据。那么,当系统访问Broker获取数据的时候是什么样的过程呢?如果实现了读写分离,是不是Master Broker只负责消息的写入操作,Slave Broker只负责消息的读取呢?

其实不是这样的,当读取数据的时候,是既可能在Master Broker读取数据,也可能在Slave Broker读取数据的。

作为消费者,向MQ获取数据的时候,首先与Master Broker建立连接,并发送请求获取一批消息。

而此时,Master Broker不是直接返回消息给消费者的,而是会根据Master Broker的负载情况以及Slave Broker的同步情况,向消费者建议下次应该从Master Broker获取消息还是应该从Slave Broker获取消息。

具体什么时候会建议去Master Broker获取消息呢?

举个例子,如果在一段时间内Master Broker突然新增了大量的消息,而这时Slave Broker同步这些消息也是需要一定的时间的,所以主从的数据是不一致的,为了保证读取消息的可靠性,就只能从Master Broker获取消息。

那么什么时候会建议去Slave Broker获取消息呢?

再看个例子,如果一段时间内,Master Broker由于业务原因接收了海量的并发请求,导致本身负载很重,这时对于消费者新发来的请求,如果继续从Master Broker获取消息,就会导致性能很慢,而且增加Master Broker服务器的压力,所以这个时候就会建议从Slave Broker获取消息了。

所以我们总结出来,当写入消息的时候,一般是选择Master Broker来写入的,而对于读取消息,从哪里获取数据,要视当时情况而定。所以不能说是完全的读写分离。

如果Slave Broker宕机怎么办

现在我们想想,如果Slave Broker宕机了,对于整体MQ系统来讲,会有多大的影响?

实际上,这种情况是没有太大的影响的,因为我们刚刚已经知道,所有的写请求都会发送给Master Broker,而所有的读请求通过Master Broker也可以进行下去。

所以Slave Broker宕机了,其实不影响整个MQ的运行过程,如果非要说出个影响了,那就是可供读取消息的机器少了一台而已,如果这时候出现海量并发读取消息的情况,性能会变差。

所以,Slave Broker宕机,一般会有监控系统监控的到,维护人员及时手动处理重新启动就可以了。

如果Master Broker宕机怎么办

现在我们假设,Master Broker突然宕机了,对于MQ整体上有什么影响呢.

这种情况对于消息的写入和读取就会产生影响了。但是我们知道,在Slave Broker上是有一份与Master Broker相同的备份数据的,只不过可能存在消息同步的过程中宕机的情况,导致部分数据丢失。

那么RocketMQ可以自动将Slave切换为Master吗?答案是否定的。

在RocketMQ4.5之前,一旦Master发生故障,Slave是没法自动切换成Master提供服务的。

在这种情况下,就需要运维人员手动修改Slave Broker的配置,重启服务将其切换为Master,这样不仅过程麻烦,而且中途还会发生服务不可用的状况,没有真正的实现高可用

Dledger实现RocketMQ的高可用

在RocketMQ4.5后,针对于上边说到的情况有了新的解决方案,就是Dledger。

小伙伴们一定会问,Dledger是什么呢?

Dledger是一个基于Raft协议实现的机制,暂时知道这里就可以了,至于什么是Raft,Dledger原理这里就先不聊了,那又是一个大的话题,感兴趣的小伙伴可以自行百度了解。

我们主要要聊的是基于Dledger可以实现RocketMQ的高可用主从自动切换效果。

简单的解释一下,就是当Master Broker宕机的时候,就可以在多个Slave Broker中根据Dledger机制进行leader选举,选出一个新的Master对外继续提供服务。整个过程可能在10秒或几十秒的时间,这样的话就实现了主从切换的自动化了。

总结

今天我们主要聊了聊Broker的主从架构,下边的文章我们将继续探索RocketMQ的生产部署架构,欢迎小伙伴们持续关注。

往期文章推荐:

中间件专辑:

什么是消息中间件?主要作用是什么?

常见的消息中间件有哪些?你们是怎么进行技术选型的?

你懂RocketMQ 的架构原理吗?

聊一聊RocketMQ的注册中心NameServer

算法专辑:

和同事谈谈Flood Fill 算法

Broker的主从架构是怎么实现的?的更多相关文章

  1. RocketMQ源码详解 | Broker篇 · 其五:高可用之主从架构

    概述 对于一个消息中间件来讲,高可用功能是极其重要的,RocketMQ 当然也具有其对应的高可用方案. 在 RocketMQ 中,有主从架构和 Dledger 两种高可用方案: 第一种通过主 Brok ...

  2. MySQL 主从架构配置详解

    无论是哪一种数据库,数据的安全都是至关重要的,因此熟练掌握数据库的安全备份功能,是作为开发人员,特别是后端开发人员的一项必备技能.MySQL 数据库内建的复制功能,可以帮助我们对数据进行异地备份,读写 ...

  3. 【高并发架构】Redis缓存高并发之-主从架构

    Redis主从架构 到目前为止,Redis Cluster 能实现很好的性能,但如果只是缓存几个G的数据,那么单机Redis就足够了,但缓存主要用来读的,单机的QPS有一定的极限,一两万QPS一台应该 ...

  4. 关于mysql主从架构master宕机后,请求转移问题解决办法

    mysql架构:一主一从 问题一:有两台mysql数据库,已做好主从.如果运行某一天master服务器mysql故障导致前端请求无法处理怎么办? 答:将前端需要数据库处理的请求转移到slave机上. ...

  5. redis主从架构,分片集群详解

    写在前面:这篇笔记有点长,如果你认真看完,收获会不少,如果你只是忘记了相关命令,请翻到末尾. redis的简单介绍: 一个提供多种数据类类型储存,整个系统都在内存中运行的, 定期通过异步的方式把数据刷 ...

  6. redis集群之主从架构

    https://redis.io/topics/replication1. redis主从架构概述(1)一个master可以配置多个slave(2)slave与master之间使用异步复制进行数据同步 ...

  7. 采用redis 主从架构的原因

    如果系统的QPS超过10W+,甚至是百万以上的访问,则光是Redis是不够的,但是Redis是整个大型缓存架构中,支撑高并发的架构非常重要的环节. 首先,你的缓存中间件.缓存系统,必须能够支撑起10w ...

  8. MySQL主从架构之Master-Slave主从同步

    MySQL复制 MySQL复制是指将主库上的DDL和DML操作通过二进制日志传到从库上,使主库和从库上的数据保持同步 复制原理: 主服务器将更新写入二进制日志文件,并维护文件的一个索引来跟踪日志循环. ...

  9. Mysql主从架构报错-Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work...

    在搭建Mysql主从架构过程中,由于从服务器是克隆的主服务器系统,导致主从mysql uuid相同, Slave_IO无法启动,报错如下: The slave I/O thread stops bec ...

随机推荐

  1. (转)Qt添加windows开机自启动

    原博文地址为:https://blog.csdn.net/x356982611/article/details/53183144 简介 window下开机启动最简单的实现方式就是在注册表中添加启动项目 ...

  2. 家庭记账本APP开发准备(一)

    1.登录界面 通过学习比较 登录界面采用线性布局(LinearLayout) 下面是相关源码 activity_main.xml ?xml version="1.0" encodi ...

  3. JS pc端网页特效

    offset     offset翻译就是偏移量,可以使用他相关的属性可以动态的得到该元素的位置.大小等等     获得元素距离带有定位父元素的位置     获得元素自己的大小(宽度高度)     注 ...

  4. C++ 对象的初始化

    目录 默认初始化 默认构造函数(default constructor) 构造函数初始值列表(cosntructor initializer list) 直接初始化和拷贝初始化 拷贝构造函数(copy ...

  5. C#LeetCode刷题之#225-用队列实现栈(Implement Stack using Queues)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4106 访问. 使用队列实现栈的下列操作: push(x) -- ...

  6. C#LeetCode刷题之#171-Excel表列序号(Excel Sheet Column Number)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3852 访问. 给定一个Excel表格中的列名称,返回其相应的列序 ...

  7. LeetCode 309 Best Time to Buy and Sell Stock with Cooldown 解决方案

    题目描述 给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 .​ 设计一个算法计算出最大利润.在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 你不能同时参与多笔 ...

  8. Linux下安装Readis

    Redis的官方下载网址是:http://redis.io/download  (这里下载的是Linux版的Redis源码包) Redis服务器端的默认端口是6379. 首先我们先把整体的流程先书写下 ...

  9. Linux中.bashrc与.bash_profile的对比

    如果你平时在命令行上花费了大量时间,那么你可能会萌生出希望定制 Shell 环境的想法.今天本文就和大家讲解该如何实现你们的这个想法.其实可以通过创建别名.向环境变量 $PATH 添加新目录或更改 S ...

  10. Redis持久化存储——>RDB & AOF

    Redis中两种持久化存储机制RDB和AOF redis是一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失.幸好Redis还为我们提供了持久化的机制,分别是RDB ...