- 化茧成蝶:Go在FreeWheel服务化中的实践
- InfoQ中文站
- 407字
- 2025-02-18 00:11:22

Snapshot文件管理优化
ETCD中快照的主要内容是内存数据库的JSON编码版本,可以用此数据直接将内存数据库快速恢复至某一个稳定状态。从ETCD的数据模型上看,快照可以加速节点启动,当日志比较多的时候,快照可以让节点从某一个状态直接恢复。所以就算快照损坏了,也不应该影响节点启动。
Fig 4.4.1 V1 Snapshot实现

V1中的快照还比较简单,始终只保留1个最新的快照。V1中快照如果损坏,节点就会直接挂掉无法重启,需要手动清除损坏的快照。
Fig 4.4.2 V2 Snapshot实现


触发快照的时间是Apply阶段,即执行已经Commit的Log阶段。保存快照操作改为异步执行,不再阻塞节点。存储格式相比V1发生了改变,数据结构更清晰。这里需要特别提一下在V2中的一个优化:当Snapshot损坏时,不再需要手动清理损坏的文件了。
Fig 4.4.3 节点启动读取Snapshot实现

Snapshot文件损坏考虑了两种情况:
· 文件损坏,内容已经无法解析
· 内容可以读取,但crc校验失败,数据可能被篡改
如果文件损坏,读取Snapshot时会自动将该文件重命名为.broken文件,不过节点会启动失败,然后重启即可自动恢复。