Rockect基于Dledger的Broker主从同步原理

1.前言

此文章是在儒猿课程中的学习笔记,感兴趣的想看原来的课程可以去咨询儒猿课堂

这篇文章紧挨着上一篇博客来进行编写,有些不清楚的可以看下上一篇博客:

RocketMQ原理简述(二)-CSDN博客

2.Broker的高可用

如果想让Broker实现高可用的话,就需要有一个Broker组,这个Broker组里面有一个Leader Broker来接收写入数据,然后进行同步到其他的Follow Broker上。这样的话,一条数据就会在三个Broker上有副本,如果Leader Broker宕机了,就会从其他的Follow Broker上进行选举一个新的Leader Broker来进行接收新的请求。

1. DLedger代替broker进行管理commitLog

Broker的高可用是基于Dledger技术来实现的,Dledger技术首先它会有一个CommitLog机制,你把数据交给它,它就会将数据写入到磁盘文件中。使用Dledger技术来实现Broker的高可用就是用Dledger来代替Broker进行管理CommitLog。

2. DLedger基于Raft协议进行选举leader

那么是怎么做到选举新的Leader节点呢,是基于Raft协议来进行选择Leader节点的。这个Raft协议的具体是怎么实现的。

我们可以举一个例子,假设我们现在有三台机器,A,B,C。这三台机器在刚启动的时候都会投票给自己,让自己成为一个leader节点,然后把自己的投票信息给同步到别的机器上,那么在第一轮的时候,就会发现大家都投票给自己,那么就没办法选举出来leader节点。

紧接大家都进入一个随机时间的休眠,A休眠1秒,B休眠2秒,C休眠3秒

A会先苏醒过来,它会给自己投票成为leader,并把自己的投票信息给B,C;当B和C苏醒之后,发现已经有投票信息过来了,就会接受A的投票信息,并把自己的投票信息给A;这样的话大家都会进行投票给A机器成为Leader。超过了半数,那么A机器就会成为Leader节点。依靠这种随机时间的休眠,通过几轮的投票就会选举出来一个leader节点。

3.DLedger进行多副本数据的同步

DLedger是是基于Raft协议来进行数据信息的同步,简单来说:数据会分为两个阶段,一个阶段为uncommited阶段,一个阶段为commited阶段。首先DLedger收到数据之后,会将数据标记为uncommited状态,然后通过内部的DLedgerServer组件将这个uncommited的数据进行同步到Follower的DLedgerServer上去。然后Follower的DLedgerServer收到这个请求之后会返回一个ack到leader节点的DLedgerServer上去。当leader节点的DLedgerServer收到一半机器的ack之后,会将这个数据标记为commited状态,然后再次进行同步到follower的DLedgerServer,让他们也把数据标记为commited状态。

相关推荐
echo175425几秒前
Apipost免费版、企业版和私有化部署详解
java
夜夜敲码6 分钟前
C语言教程(十六): C 语言字符串详解
c语言·开发语言
宋康13 分钟前
C语言结构体和union内存对齐
c语言·开发语言
异常君18 分钟前
Java 高并发编程:等值判断的隐患与如何精确控制线程状态
java·后端·代码规范
异常君18 分钟前
Java 日期处理:SimpleDateFormat 线程安全问题及解决方案
java·后端·代码规范
都叫我大帅哥20 分钟前
Spring AI中的ChatClient:从入门到精通,一篇搞定!
java·spring·ai编程
都叫我大帅哥21 分钟前
《@SpringBootApplication:Spring Boot的"一键启动"按钮,还是程序员的"免死金牌"?》
java·后端·spring
居然是阿宋23 分钟前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin
triticale25 分钟前
P12167 [蓝桥杯 2025 省 C/Python A] 倒水
java·蓝桥杯
-曾牛41 分钟前
Spring AI 快速入门:从环境搭建到核心组件集成
java·人工智能·spring·ai·大模型·spring ai·开发环境搭建