暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据存储重删和压缩

云存储技术交流 2018-12-09
2272

重删和压缩技术是最有效节约存储空间的热门技术,目前普遍应用在主存、闪存、备份软件和数据传输软件中,但数据重删和压缩技术区别是什么。

  • 重删压缩技术区别和联系

重删和压缩时完全不同的两种技术,解决不同的问题。       

重删:就是说有很多分相同的数据,我只存储其中一份,其他的重复数据块我保留一个地址引用到这个唯一存储的块即可。

压缩:将一个大字符串中的子串用一个很简短的数字来标记,然后检索该字符串出现的位置,用个简单的字符来替代。从而来减少数据表达所需要的空间,带来空间节省。

用通俗的话说:重删就是讲相同的东西只存储一次,而压缩则是改造数据排布用一种算法来统计数据的排布模式,从而达到减少数据存储的模式。

从效果上来看,可以认为重复数据删除是一种基于“数据块”的压缩,而数据压缩是一种基于“字节”的重复数据删除。

从应用上来看,重删和压缩通常会配合起来一起使用。如在备份场景中,为了提高数据的缩减效率,在数据经过重删之后会对唯一数据块再执行一次压缩。这样,数据的缩减效果就是重删和压缩效果的叠加。

 

  • 重复数据删除概述

De-duplication,即重复数据删除,它是一种目前主流且非常热门的存储技术,可对存储容量进行有效优化。它通过删除数据集中重复的数据,只保留其中一份,从而消除冗余数据。如下图所示。这种技术可以很大程度上减少对物理存储空间的需求,从而满足日益增长的数据存储需求。Dedupe技术可以带许多实际的利益,主要包括以下诸多方面:
 (1) 满足ROI(投资回报率,Return On Investment)/TCO(总持有成本,Total Costof Ownership)需求;
 (2) 可以有效控制数据的急剧增长;
 (3) 增加有效存储空间,提高存储效率;
 (4) 节省存储总成本和管理成本;
 (5) 节省数据传输的网络带宽;
 (6) 节省空间、电力供应、冷却等运维成本。


Dedupe技术目前大量应用于数据备份与归档系统,因为对数据进行多次备份后,存在大量重复数据,非常适合这种技术。事实上,dedupe技术可以用于很多场合,包括在线数据、近线数据、离线数据存储系统,可以在文件系统、卷管理器、NAS、SAN中实施。Dedupe也可以用于数据容灾、数据传输与同步,作为一种数据压缩技术可用于数据打包。Dedupe技术可以帮助众多应用降低数据存储量,节省网络带宽,提高存储效率、减小备份窗口,节省成本。

Dedupe的衡量维度主要有两个,即重复数据删除率(deduplocationratios)和性能。Dedupe性能取决于具体实现技术,而重复数据删除率则由数据自身的特征和应用模式所决定。目前各存储厂商公布的重复数据删除率从20:1到500:1不等。

存储系统的重复数据删除过程一般是这样的:首先将数据文件分割成一组数据块,为每个数据块计算指纹,然后以指纹为关键字进行Hash查找,匹配则表示该数据块为重复数据块,仅存储数据块索引号,否则则表示该数据块是一个新的唯一块,对数据块进行存储并创建相关元信息。这样,一个物理文件在存储系统就对应一个逻辑表示,由一组FP组成的元数据。当进行读取文件时,先读取逻辑文件,然后根据FP序列,从存储系统中取出相应数据块,还原物理文件副本。从如上过程中可以看出,Dedupe的关键技术主要包括文件数据块切分、数据块指纹计算和数据块检索。

  • 重复数据删除分类

首先最简单的是文件级重删,这实际上可以不认为是一个重复数据删除,它只是一个重复数据忽略,因为它只会在文件级别进行扫描,比如文件的特性、文件的修改时间,保证每次只备份同一个文件。如果说这个文件做了一些小的修改,整个文件还是需要备份的,所以它的力度是非常低的。

接下来是块级重删,也就是之前讲的先要通过一个算法,把文件进行切割,切割成一个一个小的块,然后每个块进行比对。比对过后,只有不同的块才会被分走,这样可以保证重复数据会在子文件级进行相应的删除,从而提高每个文件相同的比率。然后被切割的这个文件,我们再附上一组指针表。这个指针图表上列出文件是由哪些小的块组成的,保证我们在还原的时候,通过这个基因图和相应的数据块,可以恢复任何的文件。

那么怎么样可以提高我们的重复数据删除率呢?就是这个块的大小,块切得越小,相应的重复数据就越多。比如我们切一个西瓜,西瓜上有很多西瓜子,把西瓜切得越小块,没有西瓜子的块就会越多。

 

对重删来说这就是算法,而算法主要分两类:

定长重删。数据按照固定长度进行分块,之后进行重删。例入一个文件大小为128M,按照128K来切,切完就是一千份的子文件,然后对这一千份进行对比,把重复数据去掉就是定长重删。

变长重删。数据被划分成不同大小的块进行重删,一般来说变长重删可以获得更好的重删效果,因为对企业来说数据是不断更新的。比如定长重删下数据被切割形成一系列字母组合,由于数据变化插入了一个字母,因此整个数据的顺序就改变了,再按照128K切的话,对于备份软件来说所有行都是一个全新的数据块,所以要重新做备份。而变长重删可以保证其余的数据块不变,只在新增字母的块增加一个大小上限就可以了,因此变长重删效率更高。

 

按照重删处理的位置,这里也可以分为两类:

源端重删。在备份的时候,在备份端上agent就有重复数据删除的算法和功能,它可以在备份以前进行相应的切割和对比,只把一些新变化的数据传送到备份服务器上,这样可以大大降低备份数据量,在网络传输过程中的数据量也降低,这样可以降低整个备份网络的带宽要求,对企业来说也可以减少日常运维成本。

目标端重删。直接将数据传输到相应的磁带设备、磁带库或者是虚拟带库上,在目标端进行重复数据删除的算法、对比,然后把一些相应新的数据块元素和指针表也保留下来。

 

还有按照数据的重删执行的时间进行分类:

在线重删。备份的时候先做重复数据删除,在数据存储到硬盘之前,重复数据已经被去除掉了。

后重删。指的是在写到存储设备的同时不进行重删处理,先把原始数据写到硬盘上,随后启动后台进程对这些原始数据进行重删处理。与在线重删相比较,后重删需要更高的硬盘性能,需要更多的硬盘数量,并且在线重删可以大大降低数据的备份量和网络带宽的需求,因此效率更高。


  • 重复数据删除指纹

重复数据删除技术的关键在于数据块"指纹"的生成和鉴别。数据块"指纹"是鉴别数据块是否重复的依据,如果不同数据块的"指纹"相同,就会造成内容丢失,产生不可恢复的严重后果。在目前的实际应用中,一般都选择MD5或SHA-1等标准杂凑(hash)算法生成的数据块的摘要作为"指纹",以区分不同数据块间存在的差异,从而保证不同数据块之间不会发生冲突。但是,MD5,SHA-1等算法的计算过程非常复杂,纯软件计算很难满足存储应用的性能需求,"指纹"的计算往往成为重复数据删除应用的性能瓶颈。

 SHA算法是一种不可逆的数据加密算法,只能算指纹出来,但是无法通过指纹反推出来内容。他可以经一个小于2^64的数据转化成一个160位的不重复的指纹,最关键的是他的计算还很快。所以比较两个数据是否相同,就可以通过计算他的指纹,然后去对比指纹,而不是进行数据的逐字节比对。效率要高得多。这个指纹有没有可能重复,比如说两个人的指纹相同?

按照SHA256算法,在4.8*10^29个数据中出现两个数据指纹重复的概率大概小于10^-18.10^-18就是我们所说的16个9的可靠性。


转化成存储语言我们来讨论一下。假如说我们的存储每秒钟写入的10万个文件,按照存储7*24*365天工作,那么每年写入的数据为365*24*3,600*10,000=3.15*10^12个文件。如果想让存储出现哈希碰撞而导致重删丢数据(概率大于10^-18),那么需要运行1.52*10^17年,可能会遇到一次。

其实我们主流存储设备的可靠性一般为99.9999%也就是我们常说的6个9,是远远不如哈希值可靠的。这也是很多人担心的重删会不会把我的数据删除没有了,导致我的数据损坏呢,其实不用这个担心。

但是还是有人会担心,怎么办呢?还有另外一种方法,那就是遇到一个新数据,我就用两种算法,存储两个hash值,遇到了重复数据进行两重hash比对。但是有人还是对hash算法有担心,也简单,对于重复数据我们再进行一次逐字节比对嘛,不过就是会稍微影响性能。

 

  • 数据压缩概述以及存储应用分析

压缩技术由来已久,分为无损压缩和有损压缩。


      有损压缩主要用于图像处理领域,比如说我微信发一个照片,明明本地10M的高清图片传输到朋友手机里面就有300K的图片。这主要为了节省网络传输的流量以及微信存储空间节省。

存储系统领域用的压缩都是无损压缩。借助于算法的普及,业界主流存储厂商的压缩实现几乎都没有算法上的区别,只是在于压缩的实现选择上,主要考虑兼顾性能和数据缩减率。

基于EMC Unity Sizer的性能评估工具,我们大概可以看到开启压缩相对于不开启压缩,IOPS从20万左右降低到了12万,存储性能下降大概是40%。


其实我们最新的intel CPU里面已经集成了压缩算法,在开启压缩,满负载的进行存储性能压力测试,存储CPU利用率75%的时候,其中用于压缩所消耗的CPU资源不到3%。为什么存储性能下降了这么多。

       我们传统的存储,不需要压缩的时候,我们每个数据都是由自己在硬盘上的固定地址的。比如说LUN1的LBA00xx64~00x128 存储在5号磁盘的低8个扇区的第X位开始的连续64bit地址上。如果我以8KB为存储的最小块大小,那么每个8KB都是存储在一个固定的8KB的物理盘片的具体物理地址上。在我第一次写入的时候被我所独占。

       以后这个8KB不管怎么改写读取,都是8KB。记录这些数据存储的位置的方式非常简单。假如说一个LUN一共1TB,那么我就记录这么1TB分布在几个盘里面,用一个很简单的算法将他分布在那个盘的那个物理地址轻松地就算了出来。我只需要记录一共由几块盘,一共组成了几个RAID组,每个RAID条带深度是多少,起始地址是多少,就能在内存中快速的用这些基本数据算出数据对应的物理地址是多少。这种基本的写入模式叫做COW(copy on write),就是说写前拷贝。

       传统的RAID模式注定了我们只要改写一个位,就需要将原有数据和校验数据同时读取,然后在内存中计算后再写进去。读取的原因是为了方式写入失败我可以恢复回去. 而写前拷贝并不是指的这个问题,而是指在有数据快照的情况下如何写入,这个时候我们不能破坏快照的数据,就只能将原有位置的数据拷贝到一个专门的快照存储区域。这称之为COW,他是相对于ROW(redirecton write)而发明的一个词。

国内很多人对于COW叫做“靠”架构。

由于压缩后一个8KB的数据有可能变成了1Kb、2KB、3KB也可能是8KB,那么我的数据就是一个可变的长度,如果还采用物理地址和逻辑地址一一对应的方式我就达不到节省空间的效果了。我将一个8KB的块压缩成了1KB,结果你还是给我分配了8KB物理空间来存储,这简直就是不合适。因此在压缩的实现上,存储一般都采用ROW架构来实现。


ROW带来了那些性能下降

1、由于ROW架构每个块都需要单独存储一次地址的映射关系,所以容量越大,产生的元数据量也越大,所以ROW架构一般容量越大,性能越差。

为了更好的处理数据,肯定想元数据全部在内存中缓存是效率最好的,所以ROW架构存储对内存的诉求很大。

2、由于ROW架构每次写入都需要记录地址元数据,处于可靠性考虑,我们肯定需要持久化,每次都要元数据下盘,这样一次写入就会产生两次的操作,写入元数据,写入数据。

3、由于ROW架构的数据写入采用了新找地址写入,这样原来逻辑上连续的数据会被不断的离散化,最终连续IO也会变成随机IO,对性能影响较大

4、ROW带来了另一个问题,以上图为例,我们如果没有快照,那么C这个数据块就是一个无效的数据,但是我们并不会在写入的时候立即的删除这个数据,因为会影响性能。我们就需要在没有连续空间或者业务空闲的时候专门来处理这些失效的块。这个也就是我们经常所说的垃圾回收,垃圾回收对性能影响很大,很多厂商干脆就不回收,而采用直接填空写入的方式。不管哪种方式对于垃圾空间的重复利用是对性能影响极大的一个操作。

这些问题在传统硬盘场景影响更为明显,这也是以前Netapp在HDD时代性能被诟病的一个原因。而SSD盘内部的数据处理也是类似,SSD中开启垃圾回收导致的性能下降被称之为“写悬崖”

压缩对于存储性能带来的冲击,根本不是来自与压缩本身,而是由于实现压缩的架构而带来的影响。

按照当前业界主流存储厂商的软件架构和效率来评估,一般ROW架构的存储相对于COW架构在性能上大概要下降35%左右,而压缩本身带来的性能损失一般在5%以内,所以对于整个存储系统来说,开启压缩性能下降幅度大概在40%左右。

文章转载自云存储技术交流,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论