tinykv Project2c完成记录
tinykv project2C 学习记录
1. 理清流程
1. log剪裁过程
- 当onRaftGcLogTick()时,Raftstore检查当前Log是否超过RaftLogGcCountLimit
- 如果是,则先propose一个admin command(CompactLogRequest)到raft中,直到该command被commit之后,raftstore开始处理LogGc
- 为什么要propose到raft中去而不是直接进行gc?
- answer: 需要通知所有follower都进行log的裁剪
- follower的log会不会不够长呢?
- 不会 当该log被commit之后,就说明该follower一定拥有所有之前的log且已经进行了持久化了,可以被清理
- 为什么要propose到raft中去而不是直接进行gc?
- Raftstore首先更新PeerStorage中的meta信息,主要是RaftApplyState中的RaftTruncatedState信息。
- 接着Raftstore先将内存中的RaftLog进行剪裁,再分配任务给raftlog-gc worker来进行异步的删除log操作
2. raft中snapshot的操作
- 当进行append和heartbeat操作时,接受到resp发现follower所需要的log已经被裁减了,则向Storage获取snapshot,并发送snapshot message
- follower接收到snapshot后,需要将snapshot的meta信息记录到raft中。主要是将baseIndex修改
- 同时snapshot还会包含conf信息,用于同步最新的region信息
- 为什么要有region信息
- answer:因为可能有changeConf的cmd包含在snapshot中,所以需要Conf信息来同步region信息给滞后的follower
- 为什么要有region信息
3. 上层接收到snapshot是如何处理的
-
当follower同步了raft的meta信息后,会将snapshot随ready交由raftstore进行处理。
-
首先将状态信息持久化
- snapshot里保存了什么状态信息
- snapshot记录的index和term
- 当前的raft conf信息
- apply snapshot需要更新那些状态信息
- apply_state里的truncate_state
- 将已经被压缩的log删除
- 为什么前面已经commit过gc命令还要再次清理
- answer:因为该follower可能没有apply gc命令
- snapshot里保存了什么状态信息
tinykv状态梳理
raft_log
- 作用
- 用于存放持久化的log
- 更新时机
- 处理ready时
- log gc时
- 位置
- raft db
raft_state
- 作用
- 记录raft需要持久化的信
- LastIndex
- LastTerm
- Term
- Vote
- Commit
- 记录raft需要持久化的信
- 更新时机
- 处理raft ready时
- 用snapshot启动时
- 位置
- raft db
apply_state
- 作用
- 记录上层状态机的信息
- 记录snapshot的截断位置
- 更新时机
- 上层状态机接受raft的commit
- log gc创造snapshot时
- 位置
- kv db
region_state
- 作用
- 记录该region的状态
- 记录该region的信息
- region的id
- key的范围
- conf的版本信息 RegionEpoch
- 该region的所有peer的信息
- peer自身的id
- 所在的store的id
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现