Dledger的是如何实现主从自动切换的
前言
hello小伙伴们,今天王子又来继续和大家聊RocketMQ了,之前的文章我们一直说Broker的主从切换是可以基于Dledger实现自动切换的,那么小伙伴们是不是很好奇它究竟是如何实现的呢?今天我们就来聊一聊这个话题。
首先我们回顾一下上一篇文章深入研究Broker是如何持久化的中,producer发送消息给Broker后,首先将消息写入到CommitLog日志文件中,然后会把具体的MessageQueue中消息的位置信息存储到ConsumeQueue中。
之后Broker为了实现高可用,是有一个Broker组的,包含Master和Slave,Master接收到数据同步给Slave,一旦出现故障,可以实现主从自动切换。
使用Dledger技术替换CommitLog
现在我们就开始聊聊Dledger是如何实现主从自动切换的。
首先我们要知道Dledger是个什么东西,实际上Dledger自己就有一套CommitLog机制,如果使用了它,它接到数据第一步就是写入自己的CommitLog。
所以,引入Dledger技术,其实就是使用Dledger的CommitLog来替换掉Broker自己的CommitLog。
然后Broker仍然可以基于Dledger的CommitLog,把消息的位置信息保存到ConsumeQueue中。
Dledger是怎么选举Leader的
了解了Dledger是干什么的,那接下来我们就来探索一下,它是如何选举Leader的。
实际上它是通过Raft协议来进行选举的,那Raft又是个什么东东,别急我们慢慢聊。
假设我们的一组Broker中有三台机器,它们之间首先要选择一个Leader,这需要发起一轮一轮的投票,三台机器互相投票最终确定出Leader。
在刚刚启动的时候,这三台机器都会投给自己一票,说:"我要当Leader,别跟老子抢",然后把这条消息通知给其他机器。
为了方便说明,我们把三台机器分别命名为A,B,C.
那么经过第一轮投票后,A,B,C分别给自己投了一票,并发送给了别人。
这个时候A接到消息一看,好家伙,每个人都投的自己,都很自私,那算了,这次投票直接无效。
接着,每个人开始一段随机时间的休眠,比如A休眠了3秒,B休眠了4秒,C休眠了5秒。
那么3秒过去了,A醒了,抓紧给自己投了一票,又发给别人了。
又过了1秒,B醒了,它也想给自己投票,但是它发现已经有人发给了它消息,现在A已经有一票了,这个时候B会尊重别人的选择,也把票投给A,然后发送给别人。
又过了1秒,C醒了,同样也想给自己投票,但是发现别人已经投了两票给A了,那这时候它也会直接尊重别人的选择,投票给A,然后发送给别人。
这个时候所有人都收到了投票,全是投票给A的,那么A就光荣上岗了。
选举的时候就是谁的票数多,谁就去当老大。
这就是Raft协议中选举Leader的简单解释,总结起来就是,假如一轮投票不能得到结果,那就每个人随机休眠一下,先醒过来的投给自己,后醒过来的尊重大多数人的意见。
依靠这种方式的投票,几轮下来就能选出一个Leader了。
当然,职位越高,责任越大,选举出Leader后,所有的接收消息操作全都由Leader来负责了,Follower只能同步Leader的数据。
Dledger的数据同步机制
现在我们了解了Dledger的投票选举机制,那么Broker接收到消息后,是如何基于Dledger实现数据同步的呢?
同样,Dledger也是通过Raft协议进行多副本同步的,简单来讲,数据同步分为两个阶段,uncommitted阶段和committed阶段。
首先,当Leader接到消息数据后,会先标记消息为uncommitted状态,然后通过Dledger的组件把uncommitted状态的消息发送给Follower上的DledgerServer。
接着Follower接到消息后,会发送一个ack给Leader上的DledgerServer,然后如果Leader发现超过半数的Follower已经给自己返回了ack,那么就认为同步成功了,这时候把状态改为committed。
然后再发消息给Follower,将Follower上的状态也改为committed。
这就是基于Dledger的数据同步机制。
总结
到这里,关于Dledger如何实现主从自动切换的问题我们已经聊完了。
可能有的小伙伴会问,如果Leader宕机了,它是怎么实现自动切换的,好像还是没有说啊。
其实我们只要明白了Dledger是如何通过Raft协议进行选举的就很容易能够猜测出这个问题的答案。
Leader宕机后,自然是剩余的Follower重新发起新的一轮的选举了,然后还是按照老规矩,最后一定会选出一个Leader。
新的消息就由新选举出来的Leader来接收就可以了。
同时,由于数据同步是分为两阶段同步的,超过半数的机器返回ack才会认为是同步成功。
所以就算是在同步过程中Leader宕机了,其实Follower中已经同步了消息,只不过状态是uncommitted而已,新的Leader可以根据这些uncommitted的消息进行数据的恢复操作,更改消息状态为commited。
好了,这下子相信小伙伴们就能更好的理解Dledger了吧,那今天的文章就到这里了,下次见。
往期文章推荐:
Dledger的是如何实现主从自动切换的的更多相关文章
- java使用Redis7--分布式存储并实现sentinel主从自动切换
前面实现了分布式存储,也实现了sentinel单点故障时主从自动切换,现在还需要一种机制,实现分布式存储下,单点故障时的主从自动切换. Server配置 # cd /usr/redis/src/tes ...
- 【转】双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计
架构简介 前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上.于是设计了如下的架构.此架构主要是由kee ...
- 双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计
前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上.于是设计了如下的架构. 架构简介 此架构主要是由ke ...
- redis哨兵主从自动切换
1.用的是TP5框架,改写框架自带的redis类 thinkphp/library/think/cache/driver/Redis.php //两台服务器都配置好了监控哨兵 //主从配置要设置好密码 ...
- 利用Redis Sentinel实现redis主从自动切换
redis主从配置很简单,只需要在slave的配置里加slaveof 192.168.0.100 6379(master的ip和端口) 如果master有密码再设置 masterauth passwo ...
- mysql mha 主从自动切换 高可用
mha(Master High Availability)目前在MySQL多服务器(超过二台),高可用方面是一个相对成熟的解决方案. 一,什么是mha,有什么特性 1. 主服务器的自动监控和故障转移 ...
- Redis集群_3.redis主从自动切换Sentinel(转)
Redis SentinelSentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在redis2.4+的版本中 一.Sentinel作用:1):Master状态检测 2 ...
- java使用Redis6--sentinel单点故障主从自动切换
Redis SentinelSentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在redis2.4+的版本中 一.Sentinel作用:1):Master状态检测 2 ...
- Keepalived与MySQL互为主从自动切换配置
为解决Mysql数据库单点问题,实现两台MySQL数据库互为主备,双向replication.当一Master出现问题,则将Slave切换为Master继续工作. 环境说明 系统版本:CentOS L ...
随机推荐
- latex:数学式中的省略符号
数学式中有很多省略符号,具体命令符号和用法如下 数学式中的省略符号 \cdots 水平位置与减号等高,例如$-\cdots +$,得到- … + \ddots 对角省略号,例如$A\ddots M$, ...
- 全国大学生信息安全竞赛初赛writeup
本文首发于“合天智汇”公众号 作者:Fortheone WEB Babyunserialize 扫目录发现了 www.zip 下载下来发现似曾相识 之前wmctf2020的webweb出了f3的反序列 ...
- Java面试题(RabbitMQ篇)
RabbitMQ 135. rabbitmq 的使用场景有哪些? ①. 跨系统的异步通信,所有需要异步交互的地方都可以使用消息队列.就像我们除了打电话(同步)以外,还需要发短信,发电子邮件(异步)的通 ...
- 力扣Leetcode 202. 快乐数 -快慢指针 快乐就完事了
快乐数 编写一个算法来判断一个数 n 是不是快乐数. 「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不 ...
- 我用 Java 8 写了一段逻辑,同事直呼看不懂,你试试看。。
业务背景 首先,业务需求是这样的,从第三方电商平台拉取所有订单,然后保存到公司自己的数据库,需要判断是否有物流信息,如果有物流信息,还需要再进行上传. 而第三方接口返回的数据是 JSON 格式的,其中 ...
- android开发之集成zxing,二维码,以及扫描二维码的功能实现。带源代码下载
package cc.jiusansec.www; import com.google.zxing.WriterException; import com.zxing.activity.Capture ...
- wpf之DataGrid绑定DataTable,其中DataGridComboBoxColumn双向绑定枚举enum
百度了快一天,没结果,除了几个原创的,都是复制粘贴的内容. 不想用别的笨办法,于是脑洞大开,想出了我的办法. 首先是前台代码,与网上的比较类似: xmlns:jz="clr-namespac ...
- 11_Python的69个内置函数详解
1.内置函数分类 思维导图: https://www.processon.com/view/link/5dcabc48e4b0bd68d813b24f 2.基础数据类型-和数字相关的函数(14) 数据 ...
- 目标检测中的IOU和CIOU原理讲解以及应用(附测试代码)
上期讲解了目标检测中的三种数据增强的方法,这期我们讲讲目标检测中用来评估对象检测算法的IOU和CIOU的原理应用以及代码实现. 交并比IOU(Intersection over union) 在目标检 ...
- Java使用ArrayList实现“群主发红包”功能
群主发普通红包,某群有多名成员,群主给成员发普通红包,普通红包的规则: 群主的一笔金额,从群主余额中扣除,平均分成n等份,让成员领取: 成员领取红包后,保存到成员余额中. 请根据描述,完成案例中所有类 ...