首页 >运维 >linux运维 >如何处理文件系统和快照空间大小不一致

如何处理文件系统和快照空间大小不一致

坏嘻嘻
坏嘻嘻原创
2018-09-29 15:38:432312浏览

本文在介绍如何处理文件系统和快照空间大小不一致的基础上,重点探讨了其具体步骤,本文内容紧凑,希望大家可以有所收获。

为什么文件系统和快照空间大小不一致?

有用户咨询,在ECS实例内删除文件后再打快照,发现快照容量并没有变小。出现该现象的原因与快照原理、以及文件系统与磁盘、快照的关系有关,即,只要被写过数据的存储块(Block),即使在磁盘中的相关文件已经被删除,数据块仍会被记录到快照中,所以出现快照比磁盘占用空间大的现象。文件系统中所谓删除只是在需要删除的文件头部做个标记,让用户知道这块空间可以利用了,但并不会减少磁盘本身的空间占用。

为什么文件系统和快照空间大小不一致?

用户在实例内部看到的是磁盘 (EBS),在磁盘分区上创建的是文件系统 (File System)。文件系统负责管理磁盘空间,其操作最终均转化为磁盘的 I/O 请求。EBS 会记录 Block(指磁盘的逻辑块地址被块存储划分为相同大小的块)状态,按需将脏数据拷贝到 OSS,这就是打快照的过程。

以下原因可能会造成文件系统的空间与快照大小不一致:

文件系统本身的元数据会占用磁盘空间。

创建文件系统过程会写大量 Block。特别的,Windows 的慢速格式化会写脏大量 Block,而使用快速格式化可以减少写Block 的数量。

文件系统为了减小开销,删除文件只是在内部做个标记,而 EBS 不感知这个删除指令,Block 仍然是已分配状态,所以仍会把这部分也做到快照里,导致快照比文件系统大。

Virtio-block 和 Xen 的 Block-front 等模块不支持 TRIM 指令(一种IO指令,提示LBA上的某段数据不再使用,可以被删除),因而磁盘无法感知数据可以被删除。

创建快照原理

创建快照原理如下图所示。

说明:

将磁盘 LBA(逻辑块地址) 划分为 Block,未分配过的称为空块,图中白色小方框表示。

只要 Block 被写过(已分配,将不再是空块),就将参与计量。

磁盘第一个快照是全量,空块不拷贝。

磁盘后续快照是增量快照,拷贝自上一个快照以来的增量脏数据,因此同一个 Block 在不同快照中可能会出现多个版本(图中用不同颜色来表示)。

微信截图_20180929153521.png

快照计量方法

如上图所示,快照记录空间共有 11 个 Block,比磁盘 T2 中的 9 个 Block 还要多出 2 个。

对单块磁盘的所有快照整体计量。

只对已分配的 Block 进行计量。不同时间点相同版本 Block 只统计一次。

不同版本的 Block 占用 N 倍空间。

删除快照的原理

删除快照的原理如下图所示。

说明:

离线分析已删除快照的所有 Block,删除其中未被其他快照引用的数据。

删除 S1 之后,剩下的快照一共有 10 个 Block(包含 S0 的 6 个、S1 产生的 2 个脏数据、S2 的 2 个。),而不是 8 个 Block(S0 的 6 个、S2 的 2 个)。

微信截图_20180929153531.png

“数据写入操作”的准确定义

首先澄清一个概念,对底层分布式存储系统而言,“数据写入操作”不仅仅意味着用户写入的业务数据,也包括格式化磁盘等一系列I/O操作。

用户在拿到磁盘后,必须要先格式化才能正常使用。格式化的本质是建立文件系统的过程。一个分区或磁盘在作为文件系统使用前,需要初始化,并将数据结构记录到磁盘上,这个过程就叫建立文件系统。

因此,在磁盘上建立文件系统,也就意味着对磁盘有数据写入操作。不同的文件系统,在格式化时写入的文件大小也不尽相同,具体如下:

Windows系统格式化,分为快速和正常格式化:

快速格式化只是给分区分配文件系统,并重写目录表;

正常格式化不但会进行上述工作,还会对分区逐扇区进行扫描以确定和标记坏扇区;

因此正常格式化操作,会填充磁盘空块,相当于把磁盘全盘写了一遍。在此种情况下,第一个全量快照的大小会近似于磁盘容量。而快速格式化占用的实际空间则相对较少。

Linux系统格式化,也同样是建立文件系统的过程。因此刚刚格式化完毕的磁盘,在用户没有写入业务数据的时候,第一个快照也会有一定的容量大小,具体要看不同的文件系统格式而定。

以上是如何处理文件系统和快照空间大小不一致的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn