要点
- Figure 8
- 线性一致性
- 快照安装时的线性一致性保证
persister.RaftStateSize()
返回已经持久化的raft日志(连同若干个需要持久化的变量)的大小。server持续调用该函数,当返回值等于maxraftstate
的时候进行snapshot。需要处理maxraftstate==-1
的情况。snapshot时还需要传入snapshot对应的最后一条raft日志的下标,需要多维护一个变量。
snapshot包含KV数据库的底层map和一些用于维护一致性的变量。当服务器重启时,Persister
中保存的snapshot直接复制到server层即可。
maxraftstate
是否需要持久化到Persister
当中?不需要,因为maxraftstate
是StartKVServer()
的参数,在启动server时被传入。
applyCh
中读到snapshot时应该执行什么操作?直接覆盖原有database即可。
将maxOpIndexs
保存到snapshot当中,进行持久化。
MIT 6.824 Lab3 翻译(Key/Value Server Base on Raft) - 知乎 (zhihu.com)
首先按照自己的思路进行了基本实现,踩了许多坑。
错误1:
Test: one client (3A)