拿快照来说,为啥我们支持快照的多链这么复杂?按道理虚拟机只需要一个卷,至于这个卷背后的链是完全不需要关心的。如果计算存储分离,快照局限于存储模块,计算只需要一个卷。

现象:快照的多链为什么这么复杂

拿快照来说,为啥我们支持快照的多链这么复杂?

按道理虚拟机只需要一个卷,至于这个卷背后的链是完全不需要关心的。

但是放到我们代码,复杂无比,即便是单链也异常复杂,多链简直就做不下去了。

如果分开,不过多复杂的快照链,只需要在快照模块处理。

但是我们现在的代码,各种功能和存储都在一起:

  • 开关机要管理快照链(不是调接口,而是一行一行的命令呀);
  • 克隆要管理快照链;
  • 迁移对快照链的操作更多了;
  • 回滚快照、打快照,那更复杂了(快照的管理,一行一行的命令,元数据的修改,都在各种流程中交错)。简直了!

为什么这么难改

你可能会说,改呀,重构呀。

几十万行的屎山,牵一发动全身。不是一个人就能改的了的。

而且你改的过程中,别人还在持续扩展新功能,别人要怎么配合你的修改,都是很难的事。

这种推动,一定是自上而下的。不是说一人之力不能改,而是没人敢让你上。

得需要资源做 QA 大规模测试,还需要新扩展能力的配合,还需要领导有魄力,胆大心细。

执行人能做到心细,但是执行人胆大没用,别人怕出了问题你承担不了呀,得别人背锅。

需要决策人有魄力,自顶向下的推动。

但是如果老板或决策者离一线(售后、研发)远了,很可能不看重这些。

决策者大概率觉得,能跑就行,技术是工具,能满足客户需求即可。

但实际是,很多客户因为稳定性而流失,稳定性是因为屎山代码、架构问题、代码问题。

但是这些东西不能给财务数据带来改善,销售才能改善财务数据,所以继续怼销售提的需求,继续挖坑,继续流失客户。

根因:快照和计算绑定

就是因为我们的快照的处理、链的管理,都在计算里面。

因为我们主要用的 qcow2,qcow2 的快照性能高呀。

但是它有个问题,qcow2 的快照是和计算绑定的。

它为啥性能高,因为它需要计算层联动切换读写头。

如果要计算存储分离,就需要存储提供一种快照模式,不切换读写头,就能做快照。

lvm 是一种方式,bitmap,但是它做快照后写性能很低。

不考虑性能的因素下,计算、存储分离,极大降低快照开发的复杂性。

快照局限于存储模块,甚至是存储模块的快照子模块。计算只需要一个卷,不管其背后的链。

快照模块如何实现多链

A->B->C-> active

回滚到 A 后,A->active。

这个时候,要实现 B、C 的保留,且不被影响,也不影响别人,保留且独立。

  • 如果是 qcow2 快照,那么天然是独立的,保留卷、保留链的数据关系即可;
  • 如果是 lvm 这种,每个快照本身是独立的,保留即可,保留链关系元数据即可。

归根到底,链关系好处理,复杂性还是在存储端,性能和空间的取舍。

数据表的设计也简单,就是一个以原卷为根的一个树结构。

小结

  • 边界:计算、存储、网络要分离;
  • 按道理虚拟机只需要一个卷,至于这个卷背后的链是完全不需要关心的;
  • 计算存储分离,极大降低快照开发的复杂性;
  • 快照局限于存储模块,计算只需要一个卷,不管其背后的链;
  • 几十万行的屎山,牵一发动全身,这种推动一定是自上而下的。