Rust 实战 · 手写下一代云原生消息队列
15
15
1.0x
00:00/00:00
登录|注册

08|基于Raft协议构建分布式集群(二)

本课程为精品小课,不标配音频
你好,我是文强。
这节课我们继续完善基于 Raft 协议开发的分布式集群,我们会完成存储层和网络层这两部分的开发。接上节课的内容,我们首先来看一下 RaftMachineStorage 的实现逻辑。

Raft 存储层:RaftMachineStorage

从代码上看,RaftMachineStorage 的作用是使用 RocksDB 来持久化存储 Raft 运行数据。由于 RaftMachineStorage 的代码较多,这里我就不把全部代码贴出来了,建议你先去看一下文件《RaftMachineStorage》中的代码。
下面这张图是 RaftMachineStorage 的功能列表。
从函数名称中可以知道,RaftMachineStorage 的功能就是对 Entry、HardState、ConfState、First Index、Last Idnex、Uncommit Index、Snapshot 等数据进行读写。
因为 RocksDB 是 KV 存储模型,因此我们需要先定义保存数据的 Key。来看下面这段代码:
// 存储未过期的第一个Entry的Index
pub fn key_name_by_first_index() -> String {
return "/raft/first_index".to_string();
}
// 存储最新的一个 Entry 的Index
pub fn key_name_by_last_index() -> String {
return "/raft/last_index".to_string();
}
// 保存 Raft 元数据 HardState
pub fn key_name_by_hard_state() -> String {
return "/raft/hard_state".to_string();
}
// 保存 Raft 元数据 ConfState
pub fn key_name_by_conf_state() -> String {
return "/raft/conf_state".to_string();
}
// 根据Entry的 Index 保存Entry 信息
pub fn key_name_by_entry(idx: u64) -> String {
return format!("/raft/entry/{}", idx);
}
// 保存未正常 commit 的index列表
pub fn key_name_uncommit() -> String {
return "/raft/uncommit_index".to_string();
}
// 保存快照信息
pub fn key_name_snapshot() -> String {
return "/raft/snapshot".to_string();
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. RaftMachineStorage使用RocksDB来持久化存储Raft运行数据,定义了保存数据的Key,包括First Index、Last Index、HardState、ConfState、Entry、Uncommit、Snapshot等数据。 2. Raft状态机产生HardState和ConfState数据,网络层负责Raft节点间的通信流程,节点根据自身角色触发不同行为,生成不同类型的消息,如MsgPropose、MsgRequestVote等,并通过网络层发送给其他节点。 3. Raft节点间的通信流程包括投票、心跳、快照、Leader切换等不同类型的消息,节点根据自身角色生成相应类型的消息,并通过网络层发送给其他节点. 4. 基于 gRPC 的网络层实现中,定义了一个名为 SendRaftMessage 的 RPC 方法,以及方法对应的请求和返回参数,参数中的 message 字段是由 raft-rs 中名为 Message 的结构体 encode 得到。 5. 在网络层,将 Message encode 成 Vec<u8>,传递给其他节点,实现节点间的通信和信息交换。 6. gRPC Service的实现中,核心逻辑是接收参数、decode Message、将得到的 Message 传递给 Raft 状态机执行,完成比如投票、选举、保存用户数据等行为。 7. 存储层的开发主要对 First Index、Last Index、HardState、ConfState、Entry、Uncommit、Snapshot 这 7 个数据进行读写。 8. 网络层的核心是在多个 RaftNode 之间传递 Raft 状态机生成的消息,完成比如投票、选举等核心流程。 9. Raft Node 是指一个唯一的 Raft 投票者,需要通过唯一的 ID 来标识,不能重复。 10. 网络层本身不做业务逻辑处理,当 Raft Node 拿到消息后,需要将数据传递给 Raft 状态机进行处理。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 实战 · 手写下一代云原生消息队列》
立即购买
登录 后留言

精选留言

由作者筛选后的优质留言将会公开显示,欢迎踊跃留言。
收起评论
显示
设置
留言
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部
文章页面操作
MAC
windows
作用
esc
esc
退出沉浸式阅读
shift + f
f11
进入/退出沉浸式
command + ⬆️
home
滚动到页面顶部
command + ⬇️
end
滚动到页面底部
⬅️ (仅针对订阅)
⬅️ (仅针对订阅)
上一篇
➡️ (仅针对订阅)
➡️ (仅针对订阅)
下一篇
command + j
page up
向下滚动一屏
command + k
page down
向上滚动一屏
p
p
音频播放/暂停
j
j
向下滚动一点
k
k
向上滚动一点
空格
空格
向下滚动一屏
播放器操作
MAC
windows
作用
esc
esc
退出全屏
⬅️
⬅️
快退
➡️
➡️
快进
空格
空格
视频播放/暂停(视频全屏时生效)