Broker的主从架构是怎么实现的?
前言
上一篇文章我们一起聊了聊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的生产部署架构,欢迎小伙伴们持续关注。
往期文章推荐:
中间件专辑:
算法专辑:
Broker的主从架构是怎么实现的?的更多相关文章
- RocketMQ源码详解 | Broker篇 · 其五:高可用之主从架构
概述 对于一个消息中间件来讲,高可用功能是极其重要的,RocketMQ 当然也具有其对应的高可用方案. 在 RocketMQ 中,有主从架构和 Dledger 两种高可用方案: 第一种通过主 Brok ...
- MySQL 主从架构配置详解
无论是哪一种数据库,数据的安全都是至关重要的,因此熟练掌握数据库的安全备份功能,是作为开发人员,特别是后端开发人员的一项必备技能.MySQL 数据库内建的复制功能,可以帮助我们对数据进行异地备份,读写 ...
- 【高并发架构】Redis缓存高并发之-主从架构
Redis主从架构 到目前为止,Redis Cluster 能实现很好的性能,但如果只是缓存几个G的数据,那么单机Redis就足够了,但缓存主要用来读的,单机的QPS有一定的极限,一两万QPS一台应该 ...
- 关于mysql主从架构master宕机后,请求转移问题解决办法
mysql架构:一主一从 问题一:有两台mysql数据库,已做好主从.如果运行某一天master服务器mysql故障导致前端请求无法处理怎么办? 答:将前端需要数据库处理的请求转移到slave机上. ...
- redis主从架构,分片集群详解
写在前面:这篇笔记有点长,如果你认真看完,收获会不少,如果你只是忘记了相关命令,请翻到末尾. redis的简单介绍: 一个提供多种数据类类型储存,整个系统都在内存中运行的, 定期通过异步的方式把数据刷 ...
- redis集群之主从架构
https://redis.io/topics/replication1. redis主从架构概述(1)一个master可以配置多个slave(2)slave与master之间使用异步复制进行数据同步 ...
- 采用redis 主从架构的原因
如果系统的QPS超过10W+,甚至是百万以上的访问,则光是Redis是不够的,但是Redis是整个大型缓存架构中,支撑高并发的架构非常重要的环节. 首先,你的缓存中间件.缓存系统,必须能够支撑起10w ...
- MySQL主从架构之Master-Slave主从同步
MySQL复制 MySQL复制是指将主库上的DDL和DML操作通过二进制日志传到从库上,使主库和从库上的数据保持同步 复制原理: 主服务器将更新写入二进制日志文件,并维护文件的一个索引来跟踪日志循环. ...
- 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 ...
随机推荐
- CF1349F 【Slime and Sequences】part1
由于本文过长,\(\LaTeX\) 炸了,分两篇,part2 题目描述 定义一个正整数序列为好序列,当且仅当如果某个数 \(k\) 出现过,那么一定有 \(k-1\) 在最后一个 \(k\) 的前面出 ...
- 仅需1秒!搞定100万行数据:超强Python数据分析利器
前言 使用Python进行大数据分析变得越来越流行.这一切都要从NumPy开始,它也是今天我们在推文介绍工具背后支持的模块之一. 2 Vaex Vaex是 一种更快.更安全.总体上更方便的方法,可以使 ...
- Python数据类型-dic,set常见操作
字典常见方法 语法:字典名[新key]=value 功能:给字典增加键值 语法:字典名[字典里存在的key]=新的value 功能:修改字典里的值 功能:删除字典的元素,通过key来进行删除, ...
- 在centos 上安装python
1.下载最新版本python源码包 下载地址为https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tgz 2.解压源码包 tar -zxf Pyt ...
- 【模式识别与机器学习】——logistic regression
虽然叫做“回归”,但是这个算法是用来解决分类问题的.回归与分类的区别在于:回归所预测的目标量的取值是连续的(例如房屋的价格):而分类所预测的目标变量的取值是离散的(例如判断邮件是否为垃圾邮件).当然, ...
- eclipse中启动tomcat出现错误的解决方法
前段时间跟着老师做课设,各方面调试都没有问题.近段时间想起来,看看之前写过的代码,翻着翻着就发现启动tomcat出现了错误 错误如下: 错误原因:tomcat路径配置有问题,之前可能配置好了然后由于种 ...
- 2020-04-06:为什么HashMap不一直使用红黑树?
红黑树的阈值是8,当链表大于等于8时链表变成了红黑树结构,大大减少了查找的时间. 当长度低于6时会由红黑树转成链表,TreeNodes占用空间是普通Nodes的两倍,所以只有当bin包含足够多的节点时 ...
- 9个常用ES6特性归纳(一般用这些就够了)
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应 ...
- WKWebView 网络请求Header 丢失
WKWebView 是苹果手机上主要的H5加载控件,它相比UIWebView 有诸多优势.在次不做比较,但是它的坑缺比较多.网上也有很多的例子但是做的比较好的真不多,我在这里推荐俩博客供大家参考.ht ...
- 41.4 Method Security方法安全性
41.4.1 <global-method-security> 这个元素是为Spring Security beans上的安全方法添加支持的主要手段.可以通过使用注释(在接口或类级别定义) ...