![随着对 HDD 进行写入,Hyper-V VM 快照是否会不断增长?](https://linux22.com/image/726576/%E9%9A%8F%E7%9D%80%E5%AF%B9%20HDD%20%E8%BF%9B%E8%A1%8C%E5%86%99%E5%85%A5%EF%BC%8CHyper-V%20VM%20%E5%BF%AB%E7%85%A7%E6%98%AF%E5%90%A6%E4%BC%9A%E4%B8%8D%E6%96%AD%E5%A2%9E%E9%95%BF%EF%BC%9F.png)
(请注意,虽然这个问题是专门针对 Hyper-v 的,但我实际上对通用的 VM 快照答案感兴趣,除非 Hyper-v 的具体答案不适用于这种一般性解释。)
我在一家大型公司工作,该公司拥有相当规模的虚拟机基础设施(几千台虚拟机)。我的一位服务器工程师告诉我,他们不允许长时间保存虚拟机快照 - 他们允许在对虚拟机进行重大更改之前拍摄快照作为后备,但他们需要在之后不久删除它(几天左右,一旦我们确定我们的更改没有破坏任何东西)。
我对这个程序没有意见——我并不指望快照可以充当实际备份等的代理。我尊重他们想要节省环境空间的愿望。我不同意他的理由。他说他们事后需要删除快照的原因是“快照可以无限增长,每次写入硬盘时,它都会将额外的数据写入快照,没有限制。这不同于配置原始虚拟硬盘时,在原始虚拟硬盘中可以指定最大大小。您无法为快照指定最大大小。”
据我了解,快照映像与父磁盘映像之间存在 DELTA。例如,如果我在原始映像上有一个如下所示的块:
0101 0101 0101
...然后我重写中间部分如下:
0101 1111 0101
... 那么快照只存储两者之间的差异(加上一些数据结构开销,我确信这会增加复杂性,但从存储角度来看并不重要)。此外,我明白如果我要去改写将这些块恢复到其原始状态,然后增量将丢弃该块(以便将来读取该块时能够读到原始图像)。
(我不太了解快照如何存储差异 - 我确信存在非常复杂的结构来保持一切井然有序。我只对它确实存储差异的原理感兴趣,而不是变化的“运行历史”。)
他说快照不是那样工作的 - 他说如果我有一块数据,我会更改它,然后再改回来,每次我这样做时,快照就会增长,最终占用大量的磁盘空间。
据我所知,快照永远不会超过原始映像的大小(例如,如果您逐个翻转硬盘上的每个位,增量将存储该位),并且可能还会有一些恒定的开销大小。他似乎认为这不是真的,随着对虚拟硬盘的写入越来越多,虚拟机快照将无限增长。
我是否误解了虚拟机快照的工作方式?
答案1
您的工程师遵循了良好的做法,但理由却不对。您说得对,VHDX(或正在使用的任何虚拟磁盘技术)将:
- 重写时重复使用已写好的块,而不是重新编写
- 硬性大小限制等于父虚拟磁盘的最大配置大小。无法指定快照的最大大小的原因是父 VHDX 已经指定了它。
但是,我不知道有任何机制可以在块恢复到其原始状态时丢弃之前写入的增量。即使在相对较小的规模下,对源块和增量块运行差异算法与保留块写入的简单记录相比,性能开销也是相当大的。
除非虚拟机有大量的磁盘变动,否则您可能不会看到其快照急剧增长。
具有单个快照的虚拟机也不会有任何明显的性能损失,尽管我没有看到任何地方提到这一点。
快照有三个非常现实的问题:
- 环境问题可能导致 AVHDX 磁盘成为孤立磁盘
- 快照存在的每一分钟,都会沿着从“有价值”到“负债”的频谱移动
- 数据不重复
此外,即使快照本身不能真正无限制地增长,想象一下没有快照控制的环境。理论上,单个快照可以增长到其父级分配大小的两倍。我相信微软为每个虚拟机设置了 50 个快照的硬性上限,但这只是一种“好吧,你现在只是在胡闹”的故障保护措施,而不是因为技术需要它。因此,虚拟机的理论上限是分配大小的 51 倍。虽然这不太可能发生,但您可以看到,即使只有几个具有多个快照的虚拟机也会让您的存储管理员头疼。这无疑有利于制定合理的快照使用限制。
快照的环境问题
很多事情都可能是导致此类问题的根本原因。它们都归结为一个根本问题:如果父 VHDX 在任何这样,AVHDX 就完全失效了,完全没用了。如果所属 VM 已打开电源,那么这种修改应该非常困难。但是,如果所属 VM 已关闭,那么父 VHDX 只是一个文件。Hyper-V 或您的其他系统在您尝试访问子 AVHDX 之前不会知道有什么问题。
快照存在的时间越长,出现问题的可能性就越大,尤其是在有多个管理员的环境中。如果虚拟机有多个快照,那么问题可能会加剧。
该问题并非快照所特有;任何虚拟磁盘差异系统都可能出现这些问题。
快照的价值会随着时间而贬值
这确实是不长期保留快照的主要原因。正如你正确猜测的那样,差异机制确实不是保留更改的历史记录;仅保留对块的最新更改。因此,您只有现在以快照后形式存在的虚拟机,以及拍摄快照时存在的虚拟机。您可以恢复到旧版本或保留新版本。没有中间版本。
为了便于讨论(也因为这种情况已经发生过),假设您有一个小型 Exchange 环境,所有环境都在单个虚拟机上运行。在从 Exchange 2013 升级到 Exchange 2016 之前,您拍摄了快照。然后让它运行了一年。那个快照有什么用?您会恢复到那个快照吗?猜猜当您删除它时,合并需要多长时间?
快照不重复数据
快照的目的是快速将虚拟机恢复到某个时间点。它通过直接修改虚拟机的状态来实现这一点。它绝不会复制数据。如果 AVHDX 损坏,则只有父级保留有效信息,并且自快照以来所做的任何更改都会丢失。如果父 VHDX 损坏,则两个文件都无用。此外,我不知道有任何工具可以深入 AVHDX 并仅提取更改的数据。因此,为了在一段有意义的时间内保持不同的状态,备份是您的最佳选择。它不像快照那样快速或方便,但它解决了所有其他问题。