快照原理(二)——ROW技术

ROW: redirect on write 。 写时重定向。

如下图所示,左边是我们的文件。上边是inode,下边是block,里边都是123且是指向关系。然后我们对它拍一个快照snap01,snap01中也有索引123,且指向block中对应的数据。这些步骤和COW是一模一样的。不同的是,COW会生成一个COW区域用来存放和原block不同的数据,但是ROW不会。ROW会在底层生成一个.img形式的磁盘文件,我们称这个文件为ROW差分卷。差分就是区别的意思,这里的差分就是指和左边block的区别。原磁盘底层(左边block)也是一个.img形式的磁盘文件(虽然是.img形式结尾,但是这个文件是磁盘文件),当我们拍了一次快照之后,原来的磁盘文件(左边底层block)就直接变成了只读。那这个时候如果我们改变数据会发生什么情况呢?

 

删除:假设我们删除inode中的3,差分卷会怎么做呢?和COW一样,因为snap01中的索引和block中的数据依然是一一指向关系,所以这个时候差分卷什么都不会做。维持原样。

 

 

修改:假设我们的数据发生变化,差分卷会怎么做呢?比如我们把inode中的3改成5。因为之前的block在拍快照之后变成了只读文件,所以没办法写入数据。当inode中的3改成5之后,它会直接把本该写入block中的5写入row差分卷中,然后修改inode中5的指向直接指到差分卷中。

 

 

新增:假设新增数据,会怎么办呢?假设我们新增了数据678,因为原block是只读的,所以678也是直接写到了差分卷中。然后修改inode中678的指向直接指到差分卷中。

 

如果我们接着拍了第二个快照,会发生什么呢?如下图所示,假如我们拍了snap02,那么它就会产生第二个row差分卷,重要的是第一个差分卷就变成了只读,所以只要有新的差分卷生成,之前的差分卷就会变成已读。当有数据写入时,会直接写入到新的差分卷中。snap02中的索引也会一一指向block和第一个差分卷中的数据。所以如果我们连续的拍快照,最后就会形成一个快照链,因为每一个row差分卷都是有用的,快照链如下图所示。

 

 

这就是写时重定向ROW,所谓重定向就是在写入数据的时候直接把他写入到了差分卷中。

 

最后我们总结一下ROW和COW的区别:

cow拍快照后,如果对数据进行修改和新增,不仅会影响原磁盘中的block,也会影响cow区域。

row拍快照后,如果对数据进行修改和新增,只会影响最后一次快照对应的row差分卷。

  

实验:

我们做个实验来看一下ROW的底层到底是什么样的。

如下图所示,我们查看我们虚拟机的磁盘信息,发现它就是一个.img文件,这就对应了我们上边说的磁盘block也是一个.img文件。我们可以看到它的大小是40G,这就是我们创建虚拟机时划分给它的磁盘大小。但是它的实际使用量只用了11G。然后我们给这个虚拟机拍一个快照,我们可以看到这时候多了一个.img文件出来,这就是快照生成的ROW差分卷,我们可以看到这时候它的大小只有9M,因为这时候还没有数据写入。

 

  

这个时候我们在虚拟机中写入一些数据,我们可以看到差分卷的大小变成了136M,这就是我们前边说的ROW快照模式下,原先的磁盘会变成只读,有数据写入时只会写入ROW差分卷中。

 

 

这个时候我们在拍一次快照,我们可以看到又多了一个新的img文件出来,这就是我们说的每拍一个快照,就会生成一个新的row差分卷。

 

 

然后我们在往磁盘中写入数据,我们会发现原先的差分卷大小没有发生变化,而新的差分卷变成了103M。这就是我们说的新的差分卷生成之后,之前的差分卷也都会变成只读。新的数据只会写入到最新的差分卷。

 

 

那么这个时候如果我们删除第二个快照会发生什么呢?我们可以看到第二个快照对应的差分卷已经没有了。第一个差分卷的大小从221M变成了274M,这就意味着他把第二个差分卷中的数据合并到了第一个差分卷中。这就是ROW快照合并。这时候再有数据写入的话,它会直接写入到第一个差分卷中。以此类推,假如我们再把第一个快照删了,那么第一个差分卷中的数据也会合并到原磁盘中。

 

 

posted @ 2022-04-07 15:49  云计算成长路  阅读(1444)  评论(0编辑  收藏  举报