- 化茧成蝶:Go在FreeWheel服务化中的实践
- InfoQ中文站
- 407字
- 2020-06-26 06:03:27
![](https://epubservercos.yuewen.com/58535E/10210293804691401/epubprivate/OEBPS/Images/1.png?sign=1739273808-FeZOMS8jAt7mFb3dXtfXAO6Nym1pTRal-0-5076abdf8735477e61b1c7bb6a6569f1)
Snapshot文件管理优化
ETCD中快照的主要内容是内存数据库的JSON编码版本,可以用此数据直接将内存数据库快速恢复至某一个稳定状态。从ETCD的数据模型上看,快照可以加速节点启动,当日志比较多的时候,快照可以让节点从某一个状态直接恢复。所以就算快照损坏了,也不应该影响节点启动。
Fig 4.4.1 V1 Snapshot实现
![](https://epubservercos.yuewen.com/58535E/10210293804691401/epubprivate/OEBPS/Images/figure_0069_0001.jpg?sign=1739273808-66UTK1lFiKDMnpnZMPyGXUMXpdird2Nc-0-8a4609cd44d3ad5cb18ed48e493a5a17)
V1中的快照还比较简单,始终只保留1个最新的快照。V1中快照如果损坏,节点就会直接挂掉无法重启,需要手动清除损坏的快照。
Fig 4.4.2 V2 Snapshot实现
![](https://epubservercos.yuewen.com/58535E/10210293804691401/epubprivate/OEBPS/Images/figure_0069_0002.jpg?sign=1739273808-0sKwOnahPy7w5p1bCZaqEOc5l4Dce03w-0-e4848341ae53b5f6dc516834e127aaef)
![](https://epubservercos.yuewen.com/58535E/10210293804691401/epubprivate/OEBPS/Images/figure_0070_0001.jpg?sign=1739273808-lE3rfb48qka4lRREz6gvdLxUV6PsUVnW-0-0dad94123ba453194e7b6f0fc28c232a)
触发快照的时间是Apply阶段,即执行已经Commit的Log阶段。保存快照操作改为异步执行,不再阻塞节点。存储格式相比V1发生了改变,数据结构更清晰。这里需要特别提一下在V2中的一个优化:当Snapshot损坏时,不再需要手动清理损坏的文件了。
Fig 4.4.3 节点启动读取Snapshot实现
![](https://epubservercos.yuewen.com/58535E/10210293804691401/epubprivate/OEBPS/Images/figure_0070_0002.jpg?sign=1739273808-3MJhYz1aS69aa4b4XMN1VM69SP4BrQ3E-0-47639a4d02c5d6d68224402a16aa311a)
Snapshot文件损坏考虑了两种情况:
· 文件损坏,内容已经无法解析
· 内容可以读取,但crc校验失败,数据可能被篡改
如果文件损坏,读取Snapshot时会自动将该文件重命名为.broken文件,不过节点会启动失败,然后重启即可自动恢复。