2022年11月总结
月总专注时间:4935min 最大值:435min 最小值:0min 平均每日专注时间:165min 主要做的事情: 学习MIT6.824 完成了Lab Raft的Log和Persistence部分 读书: 《当我们不再理解世界》——本哈明·拉巴图特 LeetCode算法题44道 3场LeetCode周赛/双周赛 写了三篇博客MIT6.824 Raft-Leader Election实验记录、MIT6.824 Raft-Log实验记录、MIT6.824 Raft-Persistence实验记录 发现的问题: 月底几天沉迷原神,没怎么学习 日均专注时长虽然比10月要高,但距离240min的目标仍有较大差距 MIT6.824课程需要耗费的时间比我预想中的要长 学习进度推进不规律,状态时好时坏 漫无目的地刷LeetCode导致算法能力提高缓慢,进入瓶颈期 一些统计: 英语词汇量:7000 打字速度: 中文:85 英文:310 咖啡:19天 LeetCode竞赛分:1737 这个月开始刻意学习英语语法,感觉到理解长难句的能力有提高,预计下个月能熟悉大致的语法框架,希望能提高我的英语阅读速度。 距离春招已经不剩多少时间了,下个月要加大学习强度,尽快完成MIT6.824课程。也要更有计划地刷LeetCode,按照题目类型进行专项练习。
MIT6.824 Raft-Persistence实验记录
Lab用时:3.5小时 实验分析 本实验要让Raft在在上一个Leader Election和Log的基础上,对Raft的部分数据进行持久化,以便于能在Raft服务器发生故障后,Raft还能恢复crash之前的状态。 我们需要实现: persist()方法把Raft的状态数据编码成字符,存储到实验提供的persister结构中 readPersist()方法解码persister结构中的数据,并恢复Raft的部分状态 选择合适的时机对Raft调用persist()和readPersist()方法 这部分lab的测试涉及到Leader Election和Log中没检测到的一些极端条件,因此可能会需要修改部分旧代码才能跑通所有测试 结构设计 这一部分lab不涉及到新增结构。 逻辑设计 这一部分的lab非常简单,也给出了操作persister结构的样例代码,基本上照抄即可,一共也只有十几行,不再赘述。 踩坑 TestFigure8Unreliable2C会报apply error,参考Students’ Guide to Raft的term confusion部分,在RPC请求回复之后,检测一下args.Term和rf.currentTerm是否相等,不相等的话直接return即可。 rf.mu.Unlock() rf.sendRPC(i, args, reply) rf.mu.Lock() if rf.currentTerm != args.Term { return } 优化空间 尚未想出。 总结 比较简单,没什么总结。
MIT6.824 Raft-Log实验记录
Lab用时:14.5小时 实验分析 本实验要让Raft在在上一个Leader Election的基础上,对clients的请求做出响应,接受clients的command,并在command被安全committed后响应clients。 Raft paper中的Figure 2仍然是最有价值的参照: 我们需要实现: leader要能够把Start方法的command参数append到自身的log中,然后通过AppendEntries RPC把log发送给别的peers。 followers不能仅把AppendEntries RPC当作heartbeat,还要把RPC参数和自己的log比较,并在恰当的时机修改自身的log相关的字段,并返回Figure 2要求的reply。 注意上一个Leader Election lab中并没有要求实现paper中5.4.1章节的Election Restriction,我们还需要在RequestVote RPC handler中实现。 结构设计 这里只写相较于Leader Election需要增添或更改的部分。 logEntry 除了必须的Term和Command字段外,我也把log的Index写入了logEntry中,这样代码会更加简洁,详见我后面踩坑部分的解释。 type logEntry struct { Index int Term int Command interface{} } Raft 除了Leader Election中已经实现的字段外,对于这个lab,我加上了这些字段: type Raft struct { log []logEntry // 自身的log条目 commitIndex int // 最近一次commit的log的index,要保证这个字段只能单增 sequreCommit int // 可以安全commit的log的index // paper中nextIndex字段我没有用到,实测只需要matchIndex就足够了,维护nextIndex的状态反而会使代码逻辑更加复杂 matchIndex []int // 长度为peers的数量,表明当前peer和别的peers匹配成功的最大log index applyCh chan ApplyMsg // 每当commitIndex递增时,就应该向applyCh发送一个ApplyMsg,以供Tester测试 } RequestVoteArgs Leader Election只需要Term和CandidateId,若要实现5....
MIT6.824 Raft-Leader Election实验记录
Lab用时:9小时 实验分析 实现Raft的Leader Election机制,保证peers能够正常选出唯一的Leader,并且在Leader故障(或网络故障)之后能够重新选举出新的Leader。 Raft paper中的Figure 2涵盖了这个Lab需要实现的所有功能,我们目前只需要关注和Leader Election有关的数据结构和要求即可。 结构设计 一些常量 const ( // Raft.state Leader = 1 Candidate = 2 Follower = 3 // timing MinTick = 200 * time.Millisecond TickInterval = 300 * time.Millisecond HeartbeatInterval = 100 * time.Millisecond timerLoop = 20 * time.Millisecond ) 我选择的heartbeat间隔是100ms,election timeout在200到500ms之间。timerLoop是每次检查heartbeat和election是否到期的间隔,也可以按照Raft Lab的第二部分的建议改用sync.Cond。 Raft 除了已经给出的部分字段外,我这里还实现了以下的字段。 type Raft struct { currentTerm int // 当前term号 votedFor int // votedFor = -1表明当前term还未投票时 // for leader election: state int // leader, candidate, follower votes int // candidate竞选过程中收到的票数 heartbeat time....
2022年10月总结
月总专注时间:4625min 最大值:365min 最小值:0min 平均每日专注时间:149min 主要做的事情: 学习MIT6.824 读了4篇papers 完成了Lab MapReduce和Lab Raft的Leader Election部分 读书: 《异类》——马尔科姆·格拉德威尔 LeetCode算法题49道 5场LeetCode周赛/双周赛 写了一篇博客MIT6.824 MapReduce实验记录 发现的问题: 非专业类书籍阅读太少 英语阅读速度慢,读papers非常耗时 学习进度推进不规律,状态时好时坏 日均专注时长距离240min的目标仍有较大差距 一些统计: 英语词汇量:6600 打字速度: 中文:116 英文:331 咖啡:26天 跑步半小时,20+天(下个月开始具体记录) LeetCode竞赛分:1730 这个月最大的变化是心态上的一些转变:开始实践斯多葛主义,专注于做的事情本身,尽可能不去关注事情的结果。相比于外界的赞赏和激励,更应该守好自己内心中的一亩三分地,尽人事听天命,半躺平式地在乱世中求安宁。