有没有在刷 MIT 6.824 分布式系统 的朋友?

2017-05-04 04:41:44 +08:00
 duduscript
有没有在刷 MIT 6.824 分布式系统的朋友,这门课的 lab 和论文 list 都挺有难度(大神请无视。。。),想和别人交流又没有环境,课程也不允许去看别人的代码,不知道有没有在刷这门课的朋友,大家建了群一起交流。

http://nil.csail.mit.edu/6.824/2017/index.html
17851 次点击
所在节点    程序员
46 条回复
zhangyifei216
2017-05-04 18:40:30 +08:00
@duduscript 我正在学习,可以相互督促
tinylcy
2017-05-04 18:47:20 +08:00
刚做完 Lab 1,写了篇博客: http://tinylcy.me/2017/05/03/6-824-Lab-1-MapReduce/
lins05
2017-05-04 22:39:37 +08:00
路过, CMU 这门 advanced distributed system 列出的 paper 也挺全的 https://www.cs.cmu.edu/~15712/syllabus.html
bxgty
2017-05-05 09:09:36 +08:00
@duduscript 我倒觉得没关系。重点是看别人的代码不是为了过 test,而是看看和自己的思路有什么不一样。
另外,如果实在是不想看别人 Raft 代码,可以先写写以前 Paxos 的作业~
erenno1
2017-05-05 10:36:58 +08:00
之前完成到 Lab3A 了,感觉还是很过瘾的
duduscript
2017-05-05 12:27:07 +08:00
@lins05 thx!
duduscript
2017-05-05 12:28:48 +08:00
@erenno1 raft 实现我有几个点有点模糊,可以交流下 raft 论文里边的一些实现细节吗!?
erenno1
2017-05-05 17:09:56 +08:00
@duduscript
可以说出来听听。

我的经验是很多问题多读几遍论文。
多读几遍他们写的 advice https://thesquareplanet.com/blog/students-guide-to-raft/ 基本就清楚了。
另外就是并发的问题仔细想清楚。
duduscript
2017-05-05 19:05:12 +08:00
@erenno1 目前实现 lab2 中有几个点还是不清晰,比如 server 的 commitIndex 和 lastApplied 的区别,RequestVoteRPC 中的 lastLogTerm 和 term 的具体是哪一个,还有比较 candidate 的 term 为什么是 term>=currentTerm,而不是 term>currentTerm...
duduscript
2017-05-05 19:06:25 +08:00
@erenno1 我感觉可能是我论文还是没完全看懂,但我带问题去找也没有找到具体的 point...
erenno1
2017-05-05 20:01:23 +08:00
@duduscript
1. commitIndex 只是代表这个 index 已经被总数过半确认了,并不代表着写入 state machine,工程实现上 apply 可以批量完成,不用太纠结在这里
2. lastLogTerm 就是当前 replica 的日志中最后一个 entry 的 term,这个 term 小于等于 replica 的 current_term ;以保证选出的 leader 肯定持有已经 commit 的 log entry
3. 很明显去掉等于也是可以的,但是等于的意义在于可以让投票尽快完成(不浪费投票权);为什么这么说呢? 因为票是否投出是由 term + votefor 一起决定的,term 的增长有两种方式,一种是自己加 1 变成 candidate 去选举,此时 votefor 等于自己,意味着自己先投自己一票;另一种情况是 term 通过接收心跳( AppendEntries )和投票请求( RequestVote )发现了比自己 term 更大的 term 而发生的增长,要知道收到了 RequestVote,即要满足 term >= currentTerm 同时又要满足 LogUpToDate 才会真正投赞成票,更新 voteFor ;试想如果只是 term>currentTerm, logUpToDate 不满足,那就意味着只更新了自己的 term,后续针对这个 term 是依然有投票权的,因为 voteFor 没有更改;


3 的不理解是因为你还没有理解 2 ( LogUpToDate )的意义。
erenno1
2017-05-05 20:01:53 +08:00
@duduscript
再多读几遍,打日志调试调试就理解了
erenno1
2017-05-05 20:03:45 +08:00
@duduscript
针对 2 补充一下:LogUpToDate 的意义是用以保证选出的 leader 肯定持有已经 commit 的 log entry,否则 failover 就丢数据了
duduscript
2017-05-05 20:36:12 +08:00
@erenno1 Orz..
duduscript
2017-05-05 20:44:04 +08:00
@erenno1 3 我明白了
对于 2,我可不可以这么理解,其实 term 也有 commit 和没有 commit 的区别
比如一个成为 candidate 的 follower,他的 term 会+1,+1 以后的 term 就是 lastLogTerm,这个 term 是没有 commit 的 term,而 commit 的 term 是要小于 lastLogTerm 的
erenno1
2017-05-05 22:07:58 +08:00
@duduscript
刚下班路上想了下问题 1,我先再补充一下 1 吧。 如果将 commitIndex 和 lastApplied 合二为一的话,新的达成一致的 log entry 可能会需要阻塞等待前一个 log entry apply 结束(落盘)然后才能记录下来该 entry 已经达成一致了(即总数过半已经同步)才能响应客户端请求,而且等待的时候如果发生宕机之类的事情,会导致该 entry 的状态不明确,虽然日志不会丢失,但是需要后续 client 重试来确认该 entry 是提交。 毕竟 raft 是给出明确的实现方案的一致性算法,这里的 commitIndex 不是必须的,但是是一种高质量的优化。nextindex 也是一种优化;

以上是我的理解,供参考
erenno1
2017-05-05 22:14:45 +08:00
@duduscript

2 这样理解是不对的,假设当前一个 replica 为 S1 是 folower,其 current term 是 7, 假设当前的 leader 向 S1 成功同步日志,leader 的 current term 也是 7,所以 S1 的 last log entry 里的 term 一定是 7,对应的 index 是 10

之后 leader 挂了,S1 变成 candidate,current term + 1 为 8,这时发送 requestVote 的时候,需要告诉投票人当前的 current term 是 8 (即参数 term ),同时告诉对方 LastLogTerm 是 7,lastLogIndex 就是 10 ;

至于 lastlogterm lastlogindex 的作用就是为了所谓 LogUpToDate 了
erenno1
2017-05-05 22:16:27 +08:00
“对应的 index 是 10 ” 是假设 index 是 10
7 也是假设,即假设 leader 的 current term 是 7,所以 S1 也是 7,起同步的日志的 term 也一定是 7
duduscript
2017-05-05 23:52:24 +08:00
@erenno1
2 我们的理解是一致的,我说的可能不准确
对于 1
如果 leader 发出 AppendEntry,但是堵塞期间 down 掉,那么可能会使得这条 log 在超过半数的机器上存在(commit),但是却没有返回给 client,导致不一致。
那是不是这样,如果在比较稳定的情况下,commitIndex 应该是最大的一个被 commit 的 index,那 follower 接收到 appendEntries 的那个 index 就是 lastApplied,比这个 index 小都是 commit 的 index,commitIndex 通常比 lastApplied 小 1 ?
erenno1
2017-05-06 00:02:21 +08:00
@duduscript
稳定 leader 没有并发写的情况是这样的,但是并发写的时候就不一定小 1 了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/358970

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX