存储基础知识(二)回滚的原理

时间:2024-04-07 16:23:47

虽然用户开启快照,可在通过创建时间点来保护修改的数据,但要回到修改之前的状态就必须用到回滚。打个比方,我在t1时刻给画板上画了一棵树,t2时刻又画了一只猴子,t3时刻画的时候发现画错了,我不想要猴子和现在所画的东西,我想回到那棵树的时刻,就会用到回滚。

快照的回滚也是如此,用户创建多个时间点,每个时间点都可能保护着数据,但想回到某个时刻的数据状态,同样需要回滚。原理图如下所示:

存储基础知识(二)回滚的原理

在建时间点P1之前的数据为ABCD,P1时刻,将AB写为A'B',于是快照保护了被修改的数据AB,原数据变为A'B'CD;

在时间点P2时刻,用户又将C写为C',于是快照保护了P2 时刻被修改的数据C,原数据变为A'B'C'D

在时间点P3时刻,用户将之前修改过的A'写为A'',于是快照保护了被修改的数据A',原数据变为A''B'C'D

此时,用户想回到P1时间点之前的状态,也即回到数据为ABCD的状态,会从P1——>P2——>P3依次找被保护的数据,并进行比较组合。比如上图中,它找到A相关的数据有A和A',但由于A早于A',所以选择A,BC不用选择,首次出现,所以最终组合出来的数据为ABC,也就是说,从P1时刻之前到现在所有修改的数据为ABC,那么只需要把ABC写回当前时刻数据块,就会变得跟P1时刻一样。

      至于回滚为什么要新建时间点P4,很好理解,用户从当前回滚到时间点P1 之前时刻后,又想滚回来怎么办?你的数据已经从A''B'C'D写入ABC后变为ABCD,无法回到之前的数据状态,所以需要建时间点P4,用来保护你修改的数据,保证数据不丢