Linux开源存储全栈详解:从Ceph到容器存储
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 Linux开源存储系统方案介绍

本节我们将介绍存储技术的原理和实现,以及Linux开源存储的解决方案,包括Linux系统单节点的存储技术和方案(包括本地文件系统)、分布式存储系统解决方案、软件定义的存储管理软件等。

1.2.1 Linux单节点存储方案

首先介绍Linux单节点存储方案,包括本地的文件系统,以及通过各种网络,比如以太网、光纤通道(Fibre Channel,FC)能够导出的服务。

1.Linux本地文件系统

在Linux操作系统中,对于应用程序来讲,所有设备都是以“文件”的形式使用的。例如,对于网络程序,打开一个socket,其实返回的是一个文件描述符。如果不关注网络,只从一个应用程序的角度来看文件系统,则Linux内核文件系统实现如图1-2所示。

图1-2 Linux内核文件系统实现

· 应用程序通过系统调用访问文件(无论是块设备文件,还是各种文件系统中的文件)。可以通过open系统调用,也可以通过memory map的方式调用来打开文件。

· Linux内核收到系统调用的软中断,通过参数检查后,会调用虚拟文件系统(Virtual File System,VFS),虚拟文件系统会根据信息把相应的处理交给具体的文件系统,如ext2/3/4等文件系统,接着相应的文件I/O命令会转化成bio命令进入通用的块设备层,把针对文件的基于offset的读/写转化成基于逻辑区块地址(Logical Block Address,LBA)的读/写,并最终翻译成每个设备对应的可识别的地址,通过Linux的设备驱动对物理设备,如硬盘驱动器(Harddisk Drive,HDD)或固态硬盘进行相关的读/写。

· 用户态文件系统的管理。Linux文件系统的实现都是在内核进行的,但是用户态也有一些管理机制可以对块设备文件进行相应的管理。例如,使用parted命令进行分区管理,使用mkfs工具进行文件系统的管理,使用逻辑卷管理器(Logical Volume Manager,LVM)命令把一个或多个磁盘的分区进行逻辑上的集合,然后对磁盘上的空间进行动态管理。

简言之,对于Linux操作系统中基于内核文件系统的支持,其实可以分为两大块:一是内核中虚拟文件系统、具体文件系统、内核通用块设备及各个I/O子系统的支持;二是Linux用户态与文件系统相关的管理系统,以及应用程序可以用的系统调用或库文件(Glibc)的支持。

当然在用户态也有一些用户态文件系统的实现,但是一般这样的系统性能不是太高,因为文件系统最终是建立在实际的物理存储设备上的,且这些物理设备的驱动是在内核态实现的。那么即使文件系统放在用户态,I/O的读和写也还是需要放到内核态去完成的。除非相应的设备驱动也被放到用户态,形成一套完整的用户态I/O栈的解决方案,就可以降低I/O栈的深度,另外采用一些无锁化的并行机制,就可以提高I/O的性能。例如,由英特尔开源的SPDK(Storage Performance Development Kit)软件库,就可以利用用户态的NVMe SSD(Non-Volatile Memory express)驱动,从而加速那些使用NVMe SSD的应用,如iSCSI Target或NVMe-oF Target等。

2.Linux远程存储服务

除了本地文件系统,Linux发行版本还自带工具,用于提供基于以太网、光纤通道的远程存储服务,包括块设备服务、文件系统服务,甚至是基于对象接口的服务。当然也有一些提供其他存储服务的开源软件。

1)块设备服务

Linux常用的块设备服务主要基于iSCSI(Internet Small Computer System Interface)和NVMe over Fabrics。

iSCSI协议是SCSI(Small Computer System Interface)协议在以太网上的扩展,一台机器通过iSCSI协议即可通过传输控制协议/网际协议(Transmission Control Protocol / Internet Protocol,TCP/IP)为其他客户提供共享的存储设备。通过iSCSI协议被访问的设备称为Target,而访问Target的客户(Client)端称为Initiator。目前Linux主流的iSCSI Target软件是基于Kernel的Linux-IO,在用户态可以使用targetcli工具进行管理。当然还有其他开源的iSCSI Target,如STGT、SCST等。iSCSI常用的iSCSI Initiator工具包括iscsiadm命令和libiscsi、open-iscsi等软件开发包。

NVMe over Fabrics则是NVMe协议在Fabrics上的延伸,主要的设计目的是让客户端能够更高效地访问远端的服务器上的NVMe盘。相对iSCSI协议,NVMe over Fabrics则完全是为高效访问基于NVMe协议的快速存储设备设计的,往往和带有RDMA(Remote Direct Memory Access)功能的以太网卡,或者光纤通道、Infiniband一起工作。

2)文件存储服务

基于不同的协议,在Linux中可以提供很多文件粒度的服务。例如,基于网络文件系统(Network File System,NFS)协议的服务,服务器端可以直接加载支持网络文件系统协议的daemon。网络文件系统协议最早是由Sun公司在1984年开发的,目前已经发展到了NFSv4。

另外还有基于CIFS(Common Internet File System)的samba服务,使用这个服务可以向Windows客户端共享文件。这样Windows客户端可以把一个网络地址挂载成本地一块磁盘。例如,一个地址为192.168.1.8的Linux服务器导出一个名为XYZ的目录,实际指向/home/XYZ,那么客户端就可以使用\\192.168.1.8\XYZ,但是需要通过samba服务器的用户验证。

此外,Linux还有其他文件服务,如基于文件传输协议(File Transfer Protocol, FTP)的服务,这里不再赘述。另外在Linux系统中,如果用户熟悉SSH(Secure Shell)的一些命令,可以使用scp命令在不同Linux客户端进行文件的复制,或使用wget命令进行文件的下载。这是普通用户常用的功能,但需要服务器端的支持,不过这些服务器端程序的实现一般都比较简单。

1.2.2 存储服务的分类

按照接口,存储服务可以分为3类:块存储服务、文件存储服务,以及对象存储服务。

1)块存储服务

对于块存储服务来说,操作的对象是一块“裸盘”,访问的方式是打开这块“裸盘”,通过逻辑区块地址对其进行读/写操作。对Linux本机访问来说,可以理解为将一块“盘”映射给主机使用。例如,可以通过磁盘阵列(Redundant Array of Independent Disks,RAID)等方式划分出多个逻辑盘,并将这些逻辑盘映射给主机使用。操作系统会识别这些磁盘,也会屏蔽底层物理盘和逻辑盘的划分细节,将整个磁盘看作一个裸设备来使用。在使用上,磁盘通过分区、格式化挂载之后则可以直接使用。

2)文件存储服务

文件存储服务,即提供以文件为基础、与文件系统相关的服务,如目录的浏览等。在客户端看到的就是层次结构的目录,目录里面有相应的数据,包括下级目录或文件等。对于Linux而言,基本文件的操作要遵循可移植操作系统接口(Portable Operating System Interface of UNIX,POSIX)文件系统的应用程序编程接口(Application Programming Interface,API)。其中,比较经典的就是Linux单机系统下的文件系统。如果是共享文件服务,则有一系列的协议,如网络文件系统等。

3)对象存储服务

相比块存储和文件存储,对象存储更简洁。对象存储采用扁平化的形式管理数据,没有目录的层次结构,并且对象的操作主要以put、get、delete为主。所以在对象存储中,不支持类似read、write的随机读/写操作,一个文件“put”到对象存储之后,在读取时只能“get”整个文件,如果要修改,必须重新“put”一个新的对象到对象存储里。

此外,在对象存储中,元数据(Metadata)会被独立出来作为元数据服务器,主要负责存储对象的属性,其他则是负责存储数据的分布式服务器,一般称为OSD(Object Storage Device)。用户访问数据时,通常会通过客户端发送请求到元数据服务器,元数据服务器负责反馈对象存储所在的服务器ID,用户通过ID直接访问对应的OSD,并存取数据。

因为在对象存储中没有目录的概念,所以文件存储与对象存储的本质区别就是有无层次结构。通常文件包含了元数据及内容构成,元数据用来存储该文件的除内容之外的属性数据,如文件的大小、存储位置索引等。例如,在常规的文件系统中,数据内容按照块大小会被分散到磁盘中,元数据中记录了各个数据内容的索引位置,在访问文件数据时,需要不断查找元数据来定位到每一个数据页,所以其读/写性能相对较低。

总的来说,对象存储是为了克服块存储与文件存储的缺点,并发挥它们各自的优点而出现的。块存储的优点是读/写速度快,缺点是不太适合共享;文件存储的优点是利于共享,缺点是读/写速度慢。所以结合它们各自的优点出现了对象存储,对象存储不仅读/写速度快,而且适用于分布式系统中,利于共享。

1.2.3 数据压缩

随着计算能力的不断提升,当代社会正在产生越来越巨量的数据,数据压缩也被应用在生活的方方面面,如在网上打开的图片、视频、音频等都是经过压缩的。

压缩可以分为无损压缩和有损压缩。无损压缩可以通过压缩文件完全恢复原始文件;而有损压缩则会丢失一部分信息。对于文本、可执行程序的压缩是无损压缩的典型应用场景,因为任何一点信息的缺失都是不被允许的。有损压缩在图片、音频、视频方面被广泛应用,因为人们对于损失的部分信息并不敏感。有损并不意味着信息是被随机丢弃的,而是选择丢弃对恢复影响最小的部分。有损压缩既提高了效率,又保证了接受度。

这里主要讨论无损压缩。压缩的意义在于,使压缩文件在存储时占用的体积更小,传输时使用的带宽(Bandwidth)更少,传输速度更快。

1.数据压缩基础

压缩的本质是用更小的数据量表示更多的数据。无损压缩通常通过对数据中的冗余信息的处理来减小数据体积,因此是可逆的。无损压缩可实现的基础是真实世界的数据存在大量冗余,而通过对数据进行编码,就能尽量减少这种冗余。在香农提出的信息论中,他借用物理中度量无序性和混乱度的熵(Entropy)来表示系统中各个状态概率分布的程度,即系统不确定性的量度。分布越随机,概率越平均,熵越大。用公式表示为

其中,PA)表示A信号发生的概率。通过该公式也可以看出概率分布越平均,熵就越大。

香农还定义了自信息量:

自信息量代表了信息中含有的比特数,粗略地讲就是对S这个信息编码所需要的比特数。从这个定义中可以看出,更高的概率意味着更小的信息量。信息熵就可以看作是自信息量对概率加权的求和,也就是信息编码的平均比特数,因此,更大的信息熵就表示需要更多的编码比特数,也就表示信号的分布更平均。实际上熵可以看作信息编码的最小编码率,即压缩的极限编码率。接下来,我们会讨论两种应用广泛的编码方式。

1)霍夫曼编码

霍夫曼编码是由美国计算机科学家大卫·霍夫曼(David Albert Huffman)于1952年攻读博士期间发明的,是一种用于无损数据压缩的熵编码。熵编码,是指对出现的每个不同符号,创建分配一个唯一的前缀码。前缀码是一种可变长度码,并且每个码字都具有前置性,即每个码字都不会被其他码字作为前置部分。

霍夫曼编码的原理是,为出现频率更高的字符分配更短的编码。通过这种方式,可以减少平均自信息量,使编码长度趋于信息熵。目前广泛使用的压缩算法(Compression Algorithm)都是使用霍夫曼编码作为编码方式的,如文件压缩格式gzip、PKZIP,以及图片压缩格式PNG、JPEG等。

2)算术编码

算术编码是一种应用在无损数据压缩领域的熵编码。和其他熵编码不同的是,算术编码可以把整条信息编码成一个一定精度的小数q(0.0≤q<1.0),如霍夫曼编码为一条信息中每个字符至少分配一个符号。

算术编码的基本原理是根据信源发射不同符号的概率,对区间[0,1]进行划分,区间宽度代表各符号出现的概率。通过下边的例子,可以有更清楚的理解。假设某个信源发射信号a1a2a3的概率分别为Pa1)=0.7、Pa2)=0.1、Pa3)=0.2,这个信源发送的信息是a1a2a3,使用算术编码的编码过程如图1-3所示。那么a1a2a3这个信息就可以用[0.5460, 0.5600]这个区间中的任何一个数字来表示。

图1-3 使用算数编码的编码过程

算术编码是到目前为止编码效率最高的一种统计熵编码方式,比著名的霍夫曼编码效率高10%左右。但由于其编码的复杂性、实现技术的限制及专利权的限制,并不像霍夫曼编码那样应用广泛。算术编码有两点优于霍夫曼编码:①符号更紧凑;②编码和符号的统计模型是分离的,可以和任何一种概率模型协同工作。

算术编码是一种高效清除字符串中冗余信息的算法,可以按分数比特位逼近信源熵,突破了霍夫曼编码只能按整数比特位逼近信源熵的限制。但是算术编码的实现有一个缺陷就是很难在具有固定精度的计算机上完成无限精度的浮点运算。对于有限精度的计算机系统,最终区间会收敛到一个点,无法再细分。因此,需要解决无限序列和有限精度之间的矛盾,通过对区间进行动态调整来保证区间不会收敛到一个点,同时这种调整又不能使编码和解码引入歧义。因此,带有区间调整算法的算术编码和基于整数的算术编码就被提了出来,这两种编码都是通过对缩减后的区间进行重新映射。非对称数字系统(Asymmetric Numeral System,ANS)就使用了这种思想,并且在Facebook的Zstandard压缩库中已经做了代码实现。

2.Linux下开源数据压缩软件

目前,越来越多优秀的开源数据压缩软件出现在大众的视野中,这些开源数据压缩软件不仅免费,还提供了多种数据压缩算法,并且支持多种存储格式,因此被越来越多的用户接受。下面介绍常见的开源数据压缩软件。

1)FreeArc

FreeArc是一个开源的数据压缩软件,集成了多种数据压缩算法(如gzip、Multimedia、TrueAudio、Tornado、LZMA(Lempel-Ziv-Markov chain-Algorithm)、PPMD)和过滤器(如BCJ、DICT、DELTA、REP、LZP)。另外,FreeArc会根据文件类型自动选择最优的数据压缩算法,并支持数据恢复及算法加密(如AES +Twofish + Serpent)。FreeArc是目前压缩效率较高的数据压缩软件之一。

2)7-Zip

7-Zip是一款开源数据压缩软件,其特点是使用了LZMA与LZMA2算法的7z格式,具有非常高的压缩比。另外,7-Zip为7z与ZIP提供了更加完善的AES-256加密算法。7-Zip支持多种压缩/解压缩格式,如7z、gzip、ZIP、bzip2、XZ、TAR、WIN等。同时,7-Zip也支持其他格式文件的压缩/解压缩,如ARJ、CAB、CHM、cpio、Cramfs、DEB、DMG、FAT、HFS、ISO、LZH、LZMA、MBR、MSI、NSIS、NTFS、RAR、RPM、SquashFS、UDF、VHD、WIM、XAR、Z。对于ZIP及gzip格式的文件,7-Zip能够提供的压缩比比使用PKZIP和WinZip高2%~10%。

3)Snappy

Snappy是由Google开源的压缩/解压缩软件,具有快速、稳定的特点,一直被用于Google的产品当中。它的目标不是最大限度地兼容其他压缩格式,而是提供高速的压缩速度和合理的压缩比。例如,Snappy在64位的i7处理器上,可达约250MB/sec的压缩速度、500MB/sec的解压缩速度。相对于zlib,Snappy能够提供更快的压缩速度,但同时压缩后的文件大小相对来说会增大20%~100%。

1.2.4 重复数据删除

重复数据删除(DEDUPE)在存储备份系统中有很重要的应用,有利于更高效地利用存储空间。重复数据删除在维基百科上的定义为“一种可粗粒度去除冗余数据的特殊数据压缩技术”,开宗明义地解释了重复数据删除和数据压缩之间的联系。

通俗地讲,数据压缩一般通过字符串或比特级的操作来去除冗余数据,然而重复数据删除判断数据冗余的粒度较大,一般是文件级别或块级别的匹配,其目标是达到性能和去重复比例的平衡。

为何需要进行重复数据删除呢?数据的快速增长是对数据中心最大的挑战,爆炸式的数据增长会消耗巨大的存储空间,这会迫使数据提供商去购买更多的存储,然而即使这样却未必能赶上数据的增长速度。这样的现实迫使我们去考虑一些问题:产生的数据是不是都被生产系统循环使用?如果不是,是不是可以把这些数据放到廉价的存储系统中?怎么让数据备份消耗的存储更低?怎么让备份的时间更短?数据备份后,可以保存的时间有多久(物理介质原因)?备份后的数据能不能正常取出?

在实际情况中,和生产系统连接的备份系统一般每隔一段时间就会对生产系统做一次主备份,即备份生产系统中的所有内容。在两次主备份之间有很多增量式备份,且生产系统和备份系统的工作时间一般来讲是互斥的。当然如果生产系统需要持续运行,那么备份系统则需要在生产系统相对空闲的时间来工作。也就是说,备份系统的工作时间是有限制的,一般这个时间被称为备份窗口。需要被备份的数据必须在这个时间全部被迁移到备份系统中,这就对备份系统的吞吐率提出了要求。

那么怎么提高备份系统的吞吐率呢?纯粹更换硬件是一种方法。例如,10年前,主流的备份系统用的是磁带,其局限性在于吞吐率不够而且只支持顺序读/写。为满足吞吐率方面的需求,主流的备份系统的后端存储开始采用磁盘。

用于备份的数据,或者多次备份过来的数据可能是相似的,如果我们不是机械化地去备份这些数据,而是有意识地识别其中冗余的数据,然后对相同的数据只备份一份或少数几份(出于数据可靠性方面的考虑),那么这种方法不仅减少了备份系统所需要的容量,还减少了备份时对带宽的使用。举一个现实的例子,邮件系统中有很多群发邮件,其内容相同,特别是附件。试问邮件备份系统中需要将用户的相同附件都保存一份吗?答案显然是不必要的。邮件系统的例子体现出重复数据删除的作用,不过邮件系统所用的重复数据删除比较简单,主要针对的是相同的文件。

简言之,文件级别的重复数据删除有很大的局限性。最浅显的问题就是:如果文件内容只是略微有些不同,那要怎样进行数据去重呢?换句话说,文件级别的粒度太大,而粒度太小就变成了常用数据压缩技术,也不太合适。所以我们需要的是粒度适中的,如大小平均在8KB左右(经验值)。这样的重复数据删除能让空间(数据去重比率)和时间(备份性能)达到一个最佳的平衡点。

综上所述,重复数据删除一般用于备份系统中(或二级存储)。衡量一个应用重复数据删除的备份系统是不是优秀,有以下几个主要特征。

· 数据去重复率。数据去重复率越大越能减少备份系统存储方面的压力,同时在二次或多次数据备份的时候,越能减少对网络带宽的使用。

· 吞吐率。使用了数据去重技术后,备份时间是否显著缩短。根据前面所说的,对于很多生产系统来讲,备份窗口时间有限。如果数据吞吐率不高,即使再高的数据压缩比,也很难被采用。

· 数据的可靠性。这是指经过重复数据删除处理后的数据在进行灾难恢复时,数据能否被正常恢复,因为去重后的数据已经不是原来的数据了。这一点往往被外行人忽略,但是一个好的数据备份厂商,一定会重视这个问题。试想如果去重后的数据在某些情况下不能被正常恢复,那又何必应用重复数据删除做数据备份呢?

· 备份过程的安全性。对于企业内部或私有云,基本上默认在数据备份过程中不会出现安全方面的问题,如数据窃取。但是如果将重复数据删除技术作为一个由第三方提供的服务,那么安全问题就需要被重视。

1.重复数据删除的分类

上面简单地介绍了重复数据删除技术,这里稍微讲一下重复数据删除的主流分类,以便读者能够更好地理解重复数据删除。

1)分类一

重复数据删除根据应用的位置,可分为源端重复数据删除和目标端重复数据删除两种,其中源端指备份数据的来源;目标端指备份系统。所谓源端重复数据删除是指在源端判断数据重复的工作。例如,用户在上传某数据的时候,可以操作以下步骤。

(1)使用单向函数(某些哈希算法)生成需要上传的数据的指纹(Fingerprint);

(2)把指纹发送到备份系统,等待确认;

(3)位于目标端的备份系统,判断是否存在相似的数据,给源端返回数据是否存在的信息;

(4)源端接收信息后,决定是否上传数据。

源端重复数据删除的好处显而易见,如果数据已经被备份过了,则不需要将数据再传送给备份系统。当然源端数据去重复,性能未必一定高,在确认数据交换的时候,需要传送大量的指纹(每块数据都会保留一个“指纹”,为了保证指纹的唯一性可以使用比较好的哈希算法),这是一笔不小的开销。

此外,如果源端是不可信的,则可能将引起某些安全问题。试想以下应用场景:假设一个备份系统中存有很多用户的工资信息,每个用户都有一个工资单,且工资单的模板都是一样的,那么某些用户就可以去探测其他人的工资信息,假设工资单中含有的信息是用户姓名、工号、工资,如果用户A知道用户B的姓名、工号,想要猜测对方的工资,只要在源端生成相关文件,然后上传给备份系统,一旦发现生成的文件没有被上传,即可确定B的工资。虽然这种攻击是非常耗时的,但是在理论上完全存在这种可能性。

和源端重复数据删除相对应的是目标端重复数据删除,在这种情况下,源端只要把数据上传给位于目标端的备份系统即可,源端甚至感受不到重复数据删除技术的存在。所有的数据都会通过网络或其他传输机制交给备份系统,备份系统对接收的数据统一地应用重复数据删除技术。相比源端重复数据删除,目标端重复数据删除虽然对传输数据的网络带宽占据较大,但是也有很多好处:客户端完全透明,去除了安全方面的隐患,也不用对客户端做维护工作,如版本升级;去重复数据都在目标端,使得管理集中,可进行全局的去重复,可称为一个相对独立的系统。

2)分类二

根据数据在备份系统中进行重复数据删除的时间发生点,分为离线(Post-process)重复数据删除和在线(Inline)重复数据删除两种。

离线重复数据删除,是指在用户数据上传的过程中,数据去重复并不会发生,直接写到存储设备上;当用户数据上传完全结束后,再进行相关的数据去重复工作。这样的方式可以理解成那些有很多胃的食草动物(如牛),先把食物吃到胃中,然后在某个时间点再进行反刍,以完全消化食物。有反刍能力的食草动物一般有多个胃,对应到备份系统中,就是至少需要两个存储设备。试想如下的场景:用户的备份数据是1PB,备份系统需要的存储至少要大于1PB。其中第一个存储设备大小为1PB,用于存储用户上传的数据,另外一个存储设备大小为X(X为应用重复数据删除后的数据大小,为0~1PB)。这样的去重复手段,相信读者一定会看出其中的问题,即为了确保重复数据删除能正常进行,最差的情况下会有100%的额外存储资源消耗。

为了解决这个问题,在线重复数据删除技术应运而生。所谓在线重复数据删除,就是在用户数据通过网络上传到备份系统的时候,数据去重复就会发生。用户的数据会被重复数据删除子系统分成不同的部分,每个部分视为一个块(Chunk)或切片,每个数据切片会被计算一个相应的指纹,然后通过指纹去查找相关数据切片是否存在,一旦存在,这个数据切片就不会被写入真实的存储设备中。但这一过程对CPU和内存的消耗是非常高的。

虽然存储某个数据需要先查找数据切片是否存在,但是如果能找到这个数据切片,则避免了大量外部存储写操作,以及过多的存储(磁盘I/O)的操作时间,反而提高了备份的速度。另外,多次备份的内容存在很大的相似性,这带来的好处是非常可观的,因此,在线重复数据删除同时“压榨”CPU、内存、网络、存储I/O等模块,使得整个系统的资源能被更好地利用,与离线重复数据删除相比是一个不小的进步。

当然重复数据删除还有很多其他分类,如根据目标端的备份系统可分为单机重复数据删除或分布式重复数据删除,不再一一赘述。

2.深入理解重复数据删除

这里将深入地讨论重复数据删除,以帮助读者了解重复数据删除是怎么应用到备份系统中,并使得备份吞吐率、去重复比率、数据的完整和安全性都能得到满足的。

1)数据切片算法

开始的时候,我们就谈到重复数据删除只是一种数据切片级别的特殊数据压缩技术。一般来讲,数据被切成数据切片有两种分类:定长(Fixed Size)和变长(Variable Size)。

定长就是把一个接收到的数据流或文件按照相同的大小切片,每个数据切片都有一个独立的指纹。从实现角度来讲,定长文件的切片实现和管理比较简单,但是数据的去重复比率比较低。这个也是容易理解的,因为每个数据切片在文件中都有固定的偏移。在最坏的情况下,如果一个文件在文件开始处增加或减少一个字符,将导致所有数据切片的指纹发生变化。最差的结果是备份两个仅差一个字符的文件,导致重复数据删除率等于零。这显然是不可接受的。

为此变长技术应运而生,变长不是简单地根据数据偏移来划分数据切片的,而是根据“Anchor”(某个标记)来划分数据切片的。因为寻找的是特殊的标记,而不是数据的偏移,所以能完美地解决定长数据切片中由于数据偏移略有变化而导致的低数据去重复比率。

那么变长技术中的“Anchor”究竟是怎么确定的呢?一般使用基于内容的分片(Content Defined Chunking,CDC)算法使用滑动窗口技术(Sliding Window Algorithm)来确定数据切片的大小。窗口的大小一般是12~48字节,根据经验值,数据切片大小为8KB时对数据去重复是比较有效的。常用的数据切片算法是利用RabinHash算法计算滑动窗口的指纹进行切片。如果获得的指纹满足预先设定的条件,则这个窗口的位置是一个切分点,两个切分点之间的数据被认为是一个切片。RabinHash算法有很多开源实现,比较早的应用在MITPdos研究组的Pastwatch项目中有相应的源码下载。

当然RabinHash算法也有局限性,在理想情况下,使用RabinHash算法产生的切片大小(按照数学期望)是比较均匀的,但是实际情况往往不是这样的。可能会出现以下的问题:①出现很多小切片,这将导致管理数据切片的代价变大(一般使用树状索引);②数据切片太大,影响数据去重复的效果。

为了解决这两个问题,研究人员提出了一些改进的方法。例如,在NEC的一篇文章中,作者提出了双峰算法,其主要思想是进行二次切片。对于大的数据切片可能继续采取一些分片操作,对于小的切片可能采取切片合并操作。此外HP实验室在A Framework for Analyzing and Improving Content-Based Chunking Algorithms中也提供了一个框架来分析一些常用的基于内容的分片算法,并且提出了一个新的基于内容的分片算法——TTTD(Two Thresholds Two Divisors Algorithm)。其中,Two Thresholds是指规定切片的大小只能在上下界限之间。Two Divisors是指使用RabinHash算法来确定分界的时候有两个值可选:主Divisor和备份Divisor。当使用主Divisor时如果找不到分界点,则备份Divisor的条件不能被满足。此外在NEC发表的文章Improving Duplicate Elimination in Storage Systems中还提出了一种名为fingerdiff的新切片算法,有兴趣的读者可阅读原文。

2)高效删除重复数据

数据切片算法是重复数据删除技术中比较重要的一部分,但只依赖于数据切片算法是远远不够的。前面我们提到衡量数据去重复有两个重要指标:数据去重复率和吞吐率。很多研究表明数据切片越小去重复率越高,但是会导致低吞吐率;反之,数据切片越大去重复率越低,但是吞吐率越高。为此要求应用重复数据删除的系统必须选择合适的切片大小,以在去重复率和吞吐率之间达到一个动态平衡,数据切片大小对数据去重复率和吞吐率的影响如图1-4所示。

图1-4 数据切片大小对数据去重复率和吞吐率的影响

在在线数据去重中,怎样在数据切片后根据数据切片的指纹,高效地在数据切片管理系统中查询或建立新的数据切片索引是提高吞吐率的关键所在。一般来讲,数据是通过网络传输过来的,然后指纹的计算会消耗大量的CPU,指纹的查询会占用大量的内存和进行过多的磁盘操作。因此,整个在线去重复系统就是高效利用了网络、CPU、内存和磁盘4个模块。

例如,Avoiding the Disk Bottleneck in the Data Domain Deduplication File System论文中所描述的DDFS就采用了以下技术来提高数据的吞吐率。

· 摘要向量技术(Summary Vector),对于切片的指纹查询引入了Bloom Filter技术,使用Bloom Filter的好处在于没有假负率(False Negative)。只要在Bloom Filter中找不到,直接就能说明这个指纹不存在。

· 基于流的块排列技术(Streaming Informed Segment Layout,SISL)的前提是如果备份过一次数据流后出现非常相似的数据流,那么对于某个数据流,其应该作为一个整体来考虑,和该数据流相关的切片和指纹应该尽量集中放置在某几个容器(Container)中。在DDFS中,每个容器大小定长,均存储了数据切片和相关的指纹。

· 局部性保持技术(Locality Preserved Cache,LPC)把数据切片和指纹与容器保持一个映射关系。这样的好处在于,如果备份的数据流是有空间局部性的,那么把一个数据指纹加载到内存中时,和这个数据指纹位于同一个容器中的指纹会一起被下载到内存中,后续数据切片的指纹就能直接在内存中找到了,避免了不必要的外部I/O操作。此外内存使用最近最少使用(Least Recently Used,LRU)算法管理容器。

客观来讲,DDFS所使用的策略是非常有效的,这使得整个数据重复删除的效率非常高,为此在工业界,Data Domain公司的产品从目前来讲领先于其他同类产品,占据了很大的市场份额。当然这不是说DDFS的技术无可挑剔了,从学术的角度来讲,还有很多优化可做。例如,在2011年的ATC会议上,有一篇名为SiLo : A Similarity-locality Based Near-exact Deduplication Scheme with Low RAM Overhead and High Throughput的文章对切片指纹的查找提出了进一步的优化方案,文章中提到DDFS这样的系统只是从本地化(Locality)的角度来考虑高效的切片指纹查找的,但是仅仅依靠本地化是不够的。对于全备份来讲,所备份的数据流具有很高的本地化。但是对于那些增量式备份的数据流,本地化则比较差,为此必须考虑另外一个因素,即相似性(Similarity)。相似性所用的策略比较简单,就是把很多紧密相关的小文件分为一组,并放入一个切片中,或者把一些大文件划分成更多独立的小切片来挖掘相似性。同时利用本地化和相似性,作者提出了一个新的系统SiLo,能够更好地去重,并且在占据内存较小的情况下,达到比较高的吞吐率。

当然除了在软件上优化指纹的查找,很多研究人员也从硬件方面考虑问题。我们知道,计算指纹(一般使用哈希算法,如SHA1)需要消耗大量的CPU。为此可以引入其他物理器件,如GPU,从而释放CPU的计算能力。

3)数据可靠性

当人们把过多目光放在重复数据删除的去重复率和吞吐率方面的时候,我们需要考虑备份数据的可恢复性及其完整性,也就是说,不希望备份数据被破坏。那么到底从哪些方面保证数据的可靠性呢?这里认为,对一个去重复系统而言,当数据从客户端通过传输介质进入数据去重复系统后,必须考虑系统中的每一个模块。也就是说在设计整个重复数据删除系统的时候,必须将任何一个模块在运行过程中存在错误的可能考虑进来。

第一个需要考虑的问题是,外部存储的可靠性。现在备份的数据最终会被放到磁盘(取代了以前的磁带)。所以一个简单的问题就是,在备份过程中磁盘设备损坏了该如何处理?为此,磁盘阵列技术被引入。一般在数据去重复系统中常用的应用有RAID0、RAID5或RAID6。当然磁盘阵列技术也有软件和硬件之分,其中,硬件磁盘阵列部署起来虽然比较容易,但是也不能百分之百保证数据不出错。磁盘也一样,写入磁盘的数据未必一定正确,即使错误发生的概率非常低。因此,就需要去重复系统通过软件的方法去验证一些数据的完整性。例如,对于一些数据结构,可采用内嵌的校验和(Checksum)来保证数据的完整性。

第二个需要考虑的问题是,内存的可靠性。众所周知,服务器上的内存都携带ECC(Error Correcting Code)功能。对于重复数据删除系统而言,如果内存有这样的机制,就可以让重复数据删除系统通过ECC去检验这些内存条的错误。如果在同一个区域ECC出现错误的频率变高了,超过了某个阈值,似乎就可以断定这块内存条在一定时间内有损坏的可能,需要及时替换。再扩展一下,就是对系统中所有的硬件都需要有监控,以防止意外发生,如监控CPU和风扇的温度等。

第三个需要考虑的问题是,如果在进行去重复的过程中整个系统崩溃了,那么还能保证数据的完整性吗?这个问题可能比较难解决。对于那些还在CPU或内存中但并没有被刷入外部存储的数据,能不能进行相关的跟踪?发生这样的事情最完美的结局是:系统能恢复正常,还没刷入外部存储的数据(已经经过了指纹处理)能被正常写入外部存储。直观地想,这似乎是不可能的,但是细想一下,似乎还有其他的解决方案。

先把思维发散到数据库中。我们知道支持OLTP的数据库对事务的支持有很强的要求,如那些没被正常提交的事务(Transaction)需要进行回滚。为了满足这一需求,数据库引入WAL(Write Ahead Log)机制,即任何写磁盘操作必须先写日志。在数据去重复系统中,是不是也可以引入WAL机制呢?答案是,可以,但是纯粹使用引入的WAL机制似乎不能满足数据去重复系统高吞吐率的要求,那么怎么办呢?为此,数据去重复系统向一些高端的存储系统学习引入NVRAM,因此日志可以先被写入NVRAM。于是当系统崩溃的时候,一些数据就可以从NVRAM中恢复出来,这在一定程度上解决了系统崩溃所导致的数据丢失问题。但是NVRAM也不是万能的,系统在某些情况下依然会处于一个不能完全恢复数据的状态,当然这样的概率是比较低的。

从数据脆弱性的角度来讲,开发一个好的数据去重复系统还是比较困难的。总的来说,必须把数据可失性的问题从软件和硬件等方面进行全面考虑,才能尽可能地避免数据在去重复或恢复过程中的丢失问题。

3.重复数据删除应用

重复数据删除技术从萌芽到兴起时间不长,但是随着大数据的发展,人们对存储的需求也呈爆炸式增长。前面我们所讲的是当前重复数据删除技术在数据备份系统中的应用,市场上销售的重复数据删除系统基本都是一体化的。所谓一体化系统,是指数据去重系统以容量大小进行销售,也就是说用户会购买一个BOX(包含了所有软件和硬件)。但问题是,随着数据容量的增长,单个BOX是否还能满足要求?

就这里而言,答案是否定的。数据去重复系统的可扩展性,现在还处于探索阶段,目前可以进一步压榨多核或CPU的能力,但是总有一天这种方式的优化效果会变得越来越不显著。为此我们必须将方向转向分布式系统,或者把数据去重和云联系起来。例如,昆腾公司的一款虚拟插件产品DXi V1000,开始把重复数据删除和虚拟化及云相结合。重复数据删除在数据备份方面的应用,还有很长的路要走。

构建分布式的数据去重复系统,或将其重复数据删除和云结合,有很多种玩法。对云服务代理商而言,可以结合重复数据删除技术和一些廉价的云存储服务,来提供更加可靠的存储服务,这里使用重复数据删除技术也是为了降低成本。重复数据删除的供应厂商,不再单纯地将BOX卖给用户,而是提供更加一体化的服务。当用户的BOX容量满了,则需要购买容量更大的BOX来替换。

对于一些小企业来讲,持续的BOX替换是一项比较大的IT开销。因此如果数据去重复厂商提供额外的云服务,允许用户在BOX容量满的情况下,把去重复后的数据放到云端,虽然备份的性能会有所下降,但是确实满足了小型企业的需求。例如,如果用户买了1TB的去重复系统,附加一个10TB的云数据去重复系统。

重复数据删除除了在数据备份系统(主要指Secondary Storage)中的应用,在其他方面也有相应的应用,如主存储(Primary Storage)、文件系统、虚拟化,甚至内存。下面对其进行简单介绍。

· 主存储中的数据去重复。在2012年的FAST会议上,NetApp公司发表了一篇名为iDedup:Latency-aware,inline data deduplication for primary storage的文章,希望重复数据删除在主存储上的应用能同时在存储空间节省和I/O延迟之间做一个平衡。

· 文件系统的数据去重复,如ZFS、liveDFS、SDFS、DEDE,其中,ZFS在文件系统管理中支持了数据去重复功能;liveDFS可在虚拟机内进行重复数据删除;SDFS可在一些文件系统之下进行重复数据删除,不过它是一个用户级数据去重复文件系统;DEDE工作在VMware的VMFS层,可以在线对用户虚拟机磁盘进行重复数据删除。

· 对于内存中的去重复(数据共享),大家应该不会陌生,一般都是在Page级别进行内存共享。例如,在操作系统中进程之间共享内存,使用的写时复制(Copy On Write,COW)机制,以及同一个主机中的不同虚拟机之间通过写时复制机制共享内存。另外还有一些更复杂的基于内存数据去重复机制,这里不再赘述。

4.Linux下开源数据删除软件

Linux下的独立开源存储方案不太多,目前用得比较多的是OpenDedup。OpenDedup针对Linux的重复数据删除文件系统被称为SDFS,主要针对的是那些使用虚拟化环境,且追求低成本、高性能、可扩展的重复数据解决方案的用户。

OpenDedup OST连接器提供了网络备份与OpenDedup之间的集成,其支持以下的功能:将数据写入并备份到OpenDedup卷;从OpenDedup卷读取并恢复;备份OpenDedup卷的加速器支持。此外OpenDedup的开源文件系统SDFS,可以在本地或云存储删除目标。OpenDedup的特定功能如下。

· 对云存储后端(Storage Backend)进行在线重复数据删除:SDFS可以将所有数据发送到AWS、Azure、Google或任何S3兼容的后端。

· 性能:对压缩的数据可以多线程上传和将数据下载到云端。

· 本地缓存:SDFS可以在本地缓存最近访问的数据(默认大小是10GB)。

· 安全性:所有数据在发送到云端时都可以使用AES-CBC 256进行加密。

· 流控:上传和下载速度可能会受到限制。

· 云恢复/复制:所有本地元数据都可以被复制到云端中,并且可以被恢复。

· Glacier支持:支持S3生命周期策略并可以从中检索数据。

此外,还有另外一些开源网络备份和数据恢复软件厂商,如Bacula Systems、Zmanda、Nexenta等。另外重复数据删除功能,也被集成在大型的分布式存储系统中,以提供备份的功能。这方面云服务商用得比较广泛。

1.2.5 开源云计算数据存储平台

首先,回顾一下云计算技术的发展历史及云计算的概念。在传统模式下,想要使用计算机资源,必须自己购买基础设施和软件的许可。同时,企业还需要雇用专业的运维管理人员对其进行维护。随着企业所需的计算机资源规模越来越大,不仅需要扩充各种硬件基础设施,还需要扩大维护人员团队,以保障服务的正常运行。

而对于大部分企业来说,其实计算机基础设施并不是它们真正需要的,它们只是将基础设施作为一种支持上层业务的服务手段。在维护费用上,不仅需要花费大量的资金购买硬件、建立企业的数据中心,而且还需要高价聘请专业人员对其进行管理与维护,这无形中给企业增加了额外的成本费用。倘若有一种服务,让企业无须自己搭建并维护数据中心,只需要出钱就可以直接买到所需要的服务,那么就可以大大降低企业额外的运营成本,并且可以获得高质量的IT服务。这如同我们常见的公共服务一样,如水电站,我们每天都需要用到水和电,但并不是家家户户及每个企业都要去建立自己的发电厂和水井等设施。我们只需要缴纳一定的费用就可以享受这样的服务。

所以,云计算的目标就是为用户提供计算机基础设施服务。在云计算模式下,所有计算机资源都由云计算厂商进行集中管理,用户只需要按需付费,即可获得所需要的服务。这对用户(企业)来说,使用IT资源变得更加简单,费用成本更低。用户不必关心底层的基础设施建设,可以略过一系列复杂的硬件部署、软件安装等步骤,直接使用云计算厂商提供的计算、存储及网络等资源即可。这对于用户(企业)来说是将部署计算机资源从购买产品转换为购买服务。

目前对于云计算的定义有多种说法,现阶段广为接受的是美国国家标准与技术研究院(NIST)的定义:云计算是一种按使用量付费的模式,能够提供可用的、便捷的、按需的网络访问,位于可配置的资源共享池的资源(包括网络、服务器、存储、应用软件、服务)能够被快速提供,用户只需要做很少的管理工作,或者与服务提供商进行很少的交互。

随着云计算的不断推广,目前越来越多的公司开始提供云计算服务,出现了一批优秀的云计算服务,如国外的有Amazon的云计算服务AWS、微软的云计算服务Microsoft Azure和Google的计算服务Google Cloud;国内的有阿里云、腾讯云及金山云等。

“云计算”中的“云”可以简单地理解为任何可以通过互联网访问的服务,那么根据其提供服务的类型,云计算有以下3种落地方式。

· IaaS:通过互联网提供“基础的计算资源”,包括处理能力、存储空间、网络等,用户能从中申请到虚拟或物理的硬件设备,包括裸机(Bare Metal)或虚拟机,可在上面安装操作系统或其他应用程序。典型的代表有Amazon的AWS和阿里云ECS。

· 平台即服务(Platform As a Service,PaaS):将计算环境、开发环境等平台作为一种服务通过互联网提供给用户,用户能从中申请到一个安装了操作系统及各种所需运行库的物理机或虚拟机,可在上面安装其他应用程序,但不能修改已经预装好的操作系统和运行环境。

· 软件即服务(Software As a Service,SaaS):通过互联网为用户提供软件的一种服务方式。应用软件安装在厂商或服务供应商那里,用户可以通过网络以租赁而非购买的方式来使用这些软件。典型的代表有百度云盘、360云盘等。

Iaas、SaaS和PaaS三者的关系如图1-5所示。

图1-5 IaaS、SaaS和PaaS三者的关系

底层为Iaas,提供各种基础硬件平台,如计算、存储及网络。PaaS提供中间层的服务,隐藏了服务器、虚拟机等概念,把一切功能服务化。顶层则为SaaS,提供常见的业务服务。针对云计算的三层结构,出现越来越多的云计算平台,其与云计算服务进行整合,为用户提供了更优质的服务。

1.2.6 存储管理和软件定义存储

存储管理软件对存储而言是非常重要的,是存储运维非常重要的一部分。随着存储系统的多样化,如果依然对不同的存储使用不同的软件,则存储会非常低效,这将增加运维的复杂度。另外不同的存储软件不能互通,这会影响存储的调度。于是急需一个非常高效的、统一的存储软件,以管理不同的存储,并且可以在不同的存储之间根据用户的需求进行相应的调度,这促进了软件定义存储(Software Defined Storage, SDS)的诞生。软件定义存储是用来满足管理、资源调度或编排(Orchestration)的需求的。

1.软件定义存储的发展

最早出现“软件定义”这个词的是软件定义网络(Software Defined Network, SDN)。软件定义网络起源于斯坦福大学的一个研究课题——Clean Slate。2009年,软件定义网络的概念被正式提出。软件定义网络通过将网络设备的控制与数据分隔,运用可编程化控制实现了网络的灵活管理,为网络平台及应用提供了良好的平台。

之后在2012年,VMware于VMworld 2012大会上首次提出了软件定义数据中心(Software Defined Data Center,SDDC)的概念。软件定义数据中心抽象、池化和自动化了云计算的基础架构(计算、存储、网络),整个数据中心可以由软件自动控制(见图1-6)。其目标是利用虚拟化和云计算技术,通过虚拟化,将数据中心的一切资源,构建成一个由虚拟资源组成的资源池,软件定义存储是一种最有效、最经济且恢复力强的云计算基础架构方法。外部应用编程接口可以无缝连接到私有云、公有云及混合云平台。

图1-6 软件定义数据中心

随后,作为软件定义数据中心中的基础服务之一软件定义存储的概念被提出。软件定义存储是一种数据存储方式,其独立于底层硬件,与存储相关的控制工作都在相对于物理存储硬件的外部软件中完成。软件定义存储通常包括一种虚拟化存储的形式,这种形式将存储硬件与管理软件分开,使软件定义的存储软件也可以为数据删除、复制等特性提供管理。

那么为什么会出现软件定义的存储呢?其原因是当下各种新型技术的不断进步,以及互联网行业的快速发展带来了巨大的存储需求。互联网行业的蓬勃发展带来了大量的数据资源,这给存储带来了更大的挑战。在云计算方面,越来越多的基础架构即服务大量涌现,其中存储即服务也需要做到更高效、更快捷的管理。下面从数据中心的3个基础设施服务(计算、存储及网络)的发展来解释是什么推动了软件定义存储的发展。

· 计算:相比之前,CPU的计算能力越来越强,并且随着CPU多核时代的到来,单个多核CPU往往可以处理更多I/O请求。在虚拟化场景中,这显得尤为重要。多核CPU在很大程度上提高了处理器的利用率。相应地,在底层存储上也需要变革。不仅是硬件方面,在软件方面也需要进一步提升以匹配日益发展的计算速度。

· 存储:如今,存储技术在不断变革,存储介质从2D NAND到3D NAND,再到如今英特尔推出的3D XPoint;块设备从最早的SATA硬盘发展到如今的PCIe NVMe SSD,使得存储硬件产生了质的飞跃;磁盘的延时从毫秒级缩短到了亚毫秒级。同时存储软件上也出现了许多变革,为适应最新的硬件产品、提高存储性能,如英特尔推出了SPDK等Kernel Bypass技术。

· 网络:网络技术也在不断变革,从最早的千兆网卡到如今的万兆网卡,这使得网络延时变得越来越小。随着越来越多的分布式服务的出现,网络被广泛用于连接各种存储设备。同时,一些新技术的大量涌现使得网络服务变得更加高效。例如,在硬件上,Mellanox推出RDMA网卡,Infiniband推出RDMA的网络交换机;在软件上,英特尔推出DPDK来改进当前网络方面的性能。

随着上述技术的不断进步,涌现了大量的高性能存储服务,其中包括一些日益成熟的分布式存储系统、存储虚拟化等技术。同时,存储资源管理和使用也日趋复杂。云计算和虚拟化环境需要更加智能的存储管理,从而能够灵活管理和控制其信息,并且能够快捷灵活地部署存储资源。因此,计算、存储及网络3个基础设施服务的发展推动了软件定义存储的发展。软件定义存储通常包含两部分:控制平面(Control Plane)和数据平面(Data Plane)。

下面结合图1-7来介绍软件定义存储中常见的组件。

图1-7 软件定义存储的控制平面和数据平面

1)控制平面

控制平面常见的组件有以下几种。

· VMware SPBM(Storage Policy Base Management),基于存储策略的管理。

· OpenStack Cinder,用于提供块存储服务。

· EMC ViPR,其目标是实现EMC存储、异构存储、商用硬件本地存储资源的存储虚拟化(包括互操作性)。

2)数据平面

数据平面这一层组成比较复杂,组成部分较多,有如下几部分。

· 基于商用的硬件(Based on Commodity Hardware),这一类包含两大类:超融合架构(Hyper Converged Infrastructure,HCI),如VMware VSAN、EMC ScaleIO等;非超融合架构,如DELL Fluid Cache、HP StorVirtual等。

· Traditional SANStorage Area Network Storage Area Network /NSA,传统的外置磁盘阵列,包括SAN存储和NAS(Network Attached Storage)存储。

· Cloud/Object Storage,作为应用的后端存储提供相关的存储资源。

2.软件定义存储开源项目介绍

如下是几个当前被广泛使用的存储资源管理与软件定义存储开源项目。

· OpenSDS:OpenSDS最早由华为提出,旨在为存储业界提供标准化的软件定义存储控制平面,从而为用户解决存储过于复杂多样的问题。由于当前的存储管理往往过于复杂,后端涉及各种各样的存储设备供应商、虚拟化技术等,部署和使用极不方便。OpenSDS开放了统一、标准化的软件定义存储控制器架构,最上层用来向用户提供统一的接口;中间层用来处理基本的调度和管理;最下层接入不同的存储后端支持,从而管理不同的存储后端,提供统一标准的结构,给用户提供一个更加整洁、灵活的使用方式。

· Libvirt Storage Management:Libvirt是由Redhat开发的一套开源的软件工具,其在host端通过管理存储池(Pool)和卷(Volumes)来为虚拟机提供存储资源。Libvirt可以与多种虚拟机进行交互,包括KVM/QEMU、Xen、LXC、Virtual Box、VMware ESX及Hyper-V等。另外Libvirt支持多种后端存储类型,如本地文件系统、网络文件系统、iSCSI、LVM等。

· OHSM(Online Hierarchical Storage Manager):OHSM是企业级开源数据存储管理器。它在高成本和低成本的存储介质之间自动移动数据。OHSM系统的存在是因为高速存储设备(如硬盘驱动器)比慢的设备(如光盘和磁带驱动器)更昂贵(每字节存储)。虽然理想的情况是所有数据都可以在高速设备上使用,但对于许多用户来说这是非常昂贵的。相反,OHSM系统将企业的大部分数据存储在较慢的设备上,然后在需要时将数据复制到更快的磁盘驱动器上,从而实现动态的数据管理。动态的数据管理能够更加灵活、更加充分地利用后端存储资源。

1.2.7 开源分布式存储和大数据解决方案

随着大数据时代的到来,应用系统发生了很大变化,数据量变得越来越大,之前的存储和计算系统已经远远不能满足当今用户的需求。摩尔定律告诉我们:当价格不变时,集成电路上可容纳的元器件的数目,每隔18~24个月便会增加一倍,性能也将提升一倍。换言之,每一美元能买到的计算机性能,将每隔18~24个月增加一倍。

当我们将时间固定在某一个点上,即当时间不变时,如果要提高单机的性能,意味着我们要花费更多的钱。所以说单纯地提高单机的性能,性价比较低。除此之外,单机的计算和存储性能存在一定的瓶颈,即当单机的计算和存储达到一定的峰值后,即使我们花费再多的钱,也无法再提升其性能了。另外,出于可靠性和安全性方面的考虑,当这台机器出现问题,系统就完全不能用了。

所以分布式存储就是将多台独立的设备通过某种网络通信连接起来,组成一个大的集群,从而使集群中不同设备的硬盘驱动器、固态硬盘等介质组成一个大规模的存储资源池。分布式存储系统一般包括三大组件:元数据服务器(也称为主控服务器)、客户端及数据服务器。分布式存储系统结构如图1-8所示。

图1-8 分布式存储系统结构

元数据服务器是分布式存储系统的核心,主要在系统中提供以下服务。

· 命名空间管理。命名空间管理主要负责分布式存储系统中的元数据管理,如对象或文件块到数据服务器的索引、文件之间的关系等。因为在分布式存储系统中,会涉及大量的大型存储对象,它们一般会被分割成小的对象分配到不同的存储位置,因此命名空间的管理极为重要,这不仅涉及系统中数据一致性的问题,而且还涉及访问文件的效率。不同的分布式系统采用不同的命名空间管理方法,有些分布式系统采用将元数据全部基于内存的存储方式,分布式存储系统采用特殊的文件系统或数据库等方式来存储元数据。

· 数据服务器管理。由于分布式存储系统是由多个设备组成的集群,各个数据服务器的运行情况显得极其重要。元数据服务器也兼任了数据服务器管理的工作,它需要实时地掌握集群中各个系统的情况。如果发生某些单点故障,则需要及时进行恢复并启用备份节点。不同的系统采用不同的策略进行数据服务器管理,常见的方式是各个数据服务器节点通过不断地向元数据服务器发送心跳感应来报告当前节点运行的状况。

· 主备份容灾。分布式存储系统为了提高数据的可靠性和安全性,通常会进行多组备份。不仅仅是数据需要备份,同时元数据也需要备份。另外在基于内存的元数据管理方式中,还需要启用日志系统来持久化数据。当单一节点出现问题的时候,元数据服务器会根据当前的系统状态转移并启用备份节点。

数据服务器的重要作用是维护数据存储及副本,主要分为以下几种服务。

· 数据的本地存储。数据服务器会维护数据本地化的持久存储。对于较小的文件,数据服务器通常会进行数据整合。例如,将多个文件存储在同一个块中,从而提高空间的利用率。对于较大的文件,数据服务器通常会将其分割成多个小的文件,从而利用分布式存储系统的特点,将其存放在不同的节点中。同时,所有文件数据块都将与元数据做文件索引,从而实现对文件数据的管理。

· 状态维护。数据服务器除了做数据存储,通常还会进行状态维护。它们将自己的状态信息报告给元数据服务器,通常这些信息会包含当前的磁盘负载、I/O状态、CPU负载、网络情况等,从而方便元数据服务器进行任务的调度和文件数据的划分,同时数据服务器制定负载均衡策略。

· 副本管理。在分布式存储中,为了保护数据的安全性和可用性,通常会将文件数据做多个备份,根据不同的策略将其存放到不同的位置。当有其他节点出现故障或负载不均匀的情况时,元数据服务器会根据情况复制或迁移副本,从而保证整个系统中数据的安全性和可用性。

客户端面向用户,最主要的任务是提供接口给用户,使用户能够访问数据资源。常见的方式是给用户提供可移植操作系统接口,以便能够与虚拟文件系统对接;其次向用户提供基于用户态的用户访问接口。另外,其他的分布式系统向用户提供RESTful接口支持,从而使用户可以通过HTTP的方式访问文件资源。

以下是常见的开源分布式存储软件,其中大部分可以在不同的操作系统上运行,主要部署于Linux操作系统上。

· Hadoop。Hadoop是由Apache基金会所发布的开源分布式计算平台,起源于Google Lab所开发的MapReduce和Google文件系统。准确来说,Hadoop是一个软件编程框架模型,利用计算机集群处理大规模的数据集进行分布式存储和分布式计算。Hadoop由4个模块组成,即Hadoop Common、HDFS (Hadoop Distributed File System)、Hadoop YARN及Hadoop MapReduce。其中,主要的模块是HDFS和Hadoop MapReduce。HDFS是一个分布式存储系统,为海量数据提供存储服务。而Hadoop MapReduce是一个分布式计算框架,用来为海量数据提供计算服务。目前Hadoop已被广泛应用到各个大型公司中,据统计,Yahoo使用4000多个节点的Hadoop集群来支持其广告和搜索业务;Facebook使用1000多个节点的Hadoop集群存储日志数据,并在该数据之上做数据分析和机器学习。

· HPCC(High Performance Computing Cluster)。HPCC是一款开源的企业级大规模并行计算平台,主要用于大数据的处理与分析。HPCC提供了独有的编程语言、平台及架构,与Hadoop相比,在处理大规模数据时HPCC能够利用较少的代码和较少的节点达到更高的效率。

· GlusterFS。GlusterFS是一个开源分布式存储系统,具有强大的横向扩展能力,能够灵活地结合物理、虚拟的云资源实现高可用(High Availability,HA)的企业级性能存储,借助TCP/IP或InfiniBand RDMA网络将物理分布的网络存储资源聚集在一起,并使用统一的全局命名空间来管理数据。同时, GlusterFS基于可堆砌的用户空间设计,可以为各种不同的数据负载提供优质的性能。相对于传统的NAS和SAN,GlusterFS容量可以按比例扩展;廉价且使用简单,可以完全建立在已有的文件系统之上;扩展和容错设计比较合理,复杂度低;适应性强,部署方便,对环境依赖低。GlusterFS由于具有高扩展性、高可用性及弹性卷管理等特性而备受欢迎。

·Ceph。Ceph是一款开源分布式存储系统,起源于SageWeil在加州大学圣克鲁兹分校的一项博士研究项目,通过统一的平台提供对象存储、块存储及文件存储服务,具有强大的伸缩性,能够为用户提供PB乃至EB级的数据存储空间。Ceph的优点在于,它充分利用了集群中各个节点的存储能力与计算能力,在存储数据时会通过哈希算法计算出该节点的存储位置,从而使集群中负载均衡。同时,Ceph中采用了Crush、哈希环等方法,使它可以避免传统单点故障的问题,在大规模集群中仍然能保持稳态。目前,一些开源的云计算项目都已经开始支持Ceph。例如,在OpenStack中,Ceph的块设备存储可以对接OpenStack的Cinder后端存储、Glance的镜像存储和虚拟机的数据存储。

· Sheepdog。Sheepdog是一个开源的分布式存储系统,于2009年由日本NTT实验室所创建,主要用于为虚拟机提供块设备服务。Sheepdog采用了完全对称的结构,没有类似元数据服务器的中心节点,没有单点故障,性能可线性扩展。当集群中有新节点加入时,Sheepdog会自动检测并将新节点加入集群中,数据自动实现负载均衡。目前QEMU/KVM、OpenStack及Libvirt等都很好地集成了对Sheepdog的支持。Sheepdog总体包括集群管理和存储管理两大部分,运行后将启动两种类型的进程:sheep与dog,其中,sheep进程作为守护进程兼备节点路由及对象存储功能;dog进程作为管理进程可管理整个集群。在Sheepdog对象存储系统中,getway负责从QEMU的块设备驱动上接收I/O请求,并通过哈希算法计算出目标节点,将I/O转发到相应的节点上。

1.2.8 开源文档管理系统

文档管理系统(Document Management System,DMS)主要用来管理文档、视频、音频等内容。信息化系统的发展促进了文档管理系统的发展。企业信息化系统发展迅速,信息量越来越大,需要管理的文档文件越来越多,并且各类文档存储形式不同,管理十分困难。例如,各类文档一般以电子文档的形式存在,存在格式为.doc、.ppt、.pdf、.xls等类型。此外,海量文档存在管理困难、查找效率低、文档版本管理混乱、文档缺乏安全保障等问题,所以,尤其对于企业用户来说,通过一些优秀的文档管理系统来管理所有的信息是十分必要的。

最早的文档管理系统是基于B/S架构的,通过将文档上传到服务器来进行集中存储,优点在于管理方便、安全、查找效率高。用户只需要通过互联网就可以连接到文档管理系统,进而可以随时随地对文档进行访问。此外,这类B/S文档管理系统为了满足用户复杂的需求,通常会添加很多额外的功能,如在线编辑、文档共享、权限管理、文档加密等,让用户使用起来更加方便、安全。

文档管理系统有以下主要功能。

· 文档管理:提供文档的集中式存储,为用户提供一个功能完备的海量文档管理平台;提供目录结构,方便用户构建自己的文档组织形式,进行查找及权限控制;提供搜索功能,其中的各类快捷搜索方式,使用户能够更高效地定位所需文档及内容。

· 安全管理:提供权限管理、存储加密及IP地址限制等功能。权限管理功能,如文档的访问权限,可以限制针对个人、部门的权限;存储加密即对文档进行加密以保障文档的安全,从而保护企业数据的安全与可靠性;IP地址限制用户在组织架构中设定的登录IP地址,以保障账户安全,也可以限制外来网络用户的访问,保障安全性。

· 协同办公:在企业用户中,通常存在多名用户需要协同办公的情况。因此,文档管理系统会提供相关的功能,使用户协同办公更加方便。例如,在线共享编辑文档功能使多名用户可以共同合作编写文档;文档审阅功能,使得用户之间可以相互评论、发表意见。

· 格式管理:文档管理系统管理的数据可以有多个分类,如文档、视频、音频,且每个分类下又存在多种格式。例如,文档格式有.doc、.ppt、.pdf、.xls等类型,视频格式有.mp4、.rmvb、.mkv、.avi等类型,音频格式有.mp3、.ape、.wav等类型。因此文档管理的格式复杂多样,文档管理系统必须支持多种格式的管理功能,从而使用户无须关心格式的细节,方便使用。

很多厂商提供了企业级文档管理系统,它们基本上都是闭源且收费的。随着信息量越来越大,闭源的企业级文档管理系统存储存在以下缺点。

· 费用较高:通常各类管理系统是根据用户的场景提供相应适合的文档管理系统的。企业用户的信息量越大,越需要更加高效、复杂的管理系统。这使得用户必须缴纳更多的使用及维护费用,来保障自己所获得的服务。

· 扩展性差:面向大多数的客户开发的文档管理系统,主要有常见的功能。而如果企业用户需要适用于自身情况的特定功能,则需要向厂商提出需求,定制特殊的功能,也需要缴纳额外昂贵的费用。

基于以上两点,企业级闭源文档管理系统不是很受欢迎,因此越来越多的开源文档管理系统出现在用户的视野中。相对于闭源文档管理系统,开源文档管理系统面向用户是免费的,而且具有很高的可扩展性。另外在各类用户及开发者的共同努力下,文档管理系统本身可以结合用户的需求,将更多优秀的源代码合并进来,功能将更加完善。

下面介绍几款开源文档管理系统。

· DSpace。DSpace是一款专门的数字资源管理系统。该系统开放源代码且遵循BSD 3-Clause license,可以收集、保存、存储、索引各种格式、层次结构的数据。DSpace最早是由麻省理工学院图书馆和惠普公司实验室共同研发的,于2000年正式开始使用。DSpace支持多种文件类型,如图像、音频、视频、文档等。同时DSpace运用Java搜索引擎Lucene,提供强大的检索功能,还可以对外提供API访问,具有很强的扩展能力。

· Epiware。Epiware是一款开源文档管理系统,主要面向企业文档管理,使用户能够安全地分享文档、创建计划及管理任务。同时,Epiware提供了一套完整的文件管理功能,包括文档的上传、下载、审核、版本控制及通知等,并且为开发团队提供了一个安全的信息交流及相互合作的平台。

· OpenKM。OpenKM是一款基于Web的多角色的开源电子文档管理系统。它基于Tomcat Java企业级服务器,采用J2EE、Jackrabbit内容管理库和GWT等技术开发,并提供强大的管理功能。OpenKM提供了多种系统功能模块,可以用于管理公共文档、建立用户自己的知识库并修订自己的文档标准模板等。此外,OpenKM还提供了强大的社区技术支持,方便用户对文档进行部署、使用。

1.2.9 网络功能虚拟化存储

网络功能虚拟化(Network Functions Virtualization,NFV)在维基百科的定义是“使用虚拟化技术,将各个类别的网络节点功能虚拟化为连接在一起的通信服务”。

在2012年的德国软件定义网络和OpenFlow世界大会上,ETSI发布的《网络功能虚拟化——介绍、优点、推动因素、挑战与行动呼吁》首次引入NFV,NFV将许多网络设备由目前的专用平台迁移到通用的X86平台上来,帮助运营商和数据中心更加敏捷地为客户创建和部署网络特性,降低设备投资和网络费用。

NFV可以利用成熟的虚拟化设备实施网络技术,并减少新设备的投入。除此之外,不必承担过多的时间成本,短期内即可实现网络架构。NFV最重要的一点在于,可以根据用户的不同习惯,实现快速的网络搭建和调整,在虚拟化产品上搭建网络,满足不同用户群的需求。

NFV的出现改变了网络和通信工业,为了加速NFV技术的推进,Linux基金会于2014年9月发布了一个新的项目OPNFV,基于OPNFV,可以创建一个NFV的参考平台。与其他开源项目相比,OPNFV是一个集成的平台,致力于将很多其他领域的开源项目,包括OpenStack、KVM等集成在一起,针对NFV环境进行部署与测试,从而促进NFV新产品和服务的引入。

NFV主要包括3个部分:NFVI(网络功能虚拟化基础设施)、VNF(虚拟网络功能)和MANO(NFV管理与编排)。其中NFVI中包含虚拟化层(Hypervisor或者其他容器管理系统,如Docker)和物理资源层(如存储设备、交换机等),用于管理和连接虚拟资源。无论是公有云还是私有云,都会涉及不同业务的不同用户,因此网络需求是多样化的,网络业务需要根据用户的需求动态调整。NFV在云计算场景中的架构如图1-9所示。

图1-9 NFV在云计算场景中的架构

NFV将网络功能整合到行业标准的服务器、交换机和存储硬件上,并且提供了优化的虚拟化数据平台,用软件的方式实现了网络功能的计算、存储和网络资源的虚拟化。NFV可以为用户提供VNF服务,根据不同用户的不同需求,动态调整分配给这些VNF的计算和存储资源,实现VNF功能和性能的按需分配。NFV由于具有灵活性、可扩展性等特点,在云计算场景中备受欢迎。

1.2.10 虚拟机/容器存储

如今,随着虚拟化技术不断发展,越来越多的虚拟化技术被运用到企业中。无论是传统的虚拟化技术,还是如今新兴的容器虚拟化技术,都带动了整个虚拟化生态圈的发展。虚拟化的优势在于它可以让CPU、内存、硬盘等硬件成为可以被动态管理的资源,从而使资源能够有更高的使用率,并且能简化运维管理。同时虚拟化技术还能够节约空间、成本,并且提高系统的稳定性,减少宕机事件的发生。

1.虚拟机存储

对于传统虚拟机的存储来说,最早出现的是完全以软件模拟的虚拟化存储技术,后来出现了半虚拟化技术。CPU的发展带来了对虚拟化技术的支持(如英特尔VT),所以出现了硬件辅助的虚拟化技术。

· 完全虚拟化技术:虚拟机(Guest OS)不知道自己运行在真实的物理硬件上,还是虚拟的硬件上。它所基于的所有硬件,都是由Hypervisor模拟实现的。Guest OS不使用任何真实的硬件,仅使用虚拟的硬件。因此在完全虚拟化技术中,当Guest OS需要使用底层系统资源时,都会通过Hypervisor截获,然后模拟这些指令的行为,将结果反馈给Guest OS。然而,在这样完全的虚拟化技术中,其安全性、可靠性及性能方面都存在很大不足。因此,为了解决完全虚拟化技术的缺陷,英特尔在其硬件产品中添加了对虚拟化技术(英特尔VT)的支持。

· 半虚拟化技术:半虚拟化技术建立在全虚拟化基础之上,需要对Guest OS做一定的修改。半虚拟化技术提供了一些API对特殊指令进行优化。因此不再需要Hypervisor进行指令之间的翻译,从而减轻了Hypervisor的负担,提高了性能。相比于完全虚拟化技术,半虚拟化技术在性能上有很大的改善,但是用户需要事先修改,部署和使用都比较烦琐,不够灵活。

· 硬件辅助虚拟化技术:硬件辅助虚拟化技术需要CPU的虚拟化技术的支持,在X86平台上较为明显,如英特尔的CPU通过其英特尔VT技术来实现虚拟化支持。对虚拟化,英特尔VT技术主要有3个方面的支持,包括CPU、内存及I/O。通过硬件辅助的虚拟化技术,CPU可以明确地分辨出来自Guest OS的特权指令,并针对Guest OS进行特权操作。相较于软件模拟的完全虚拟化技术和半虚拟化技术,硬件辅助的虚拟化技术无论是在性能上,还是在使用上,都占有一定优势。

随着虚拟化技术的发展,存储I/O也经历了从I/O全虚拟化到I/O半虚拟化的发展过程。虽然CPU提供的虚拟化支持,使得虚拟机在I/O上有了进一步的性能提升,但是对于纯软件模拟的完全虚拟化I/O来说,当用户进行I/O操作的时候,虚拟机需要通过VM-Exit将CPU控制权交给VMM来处理。所以在处理I/O时,需要触发多次VM-Exit,同时I/O路径相对较长,这使得性能降低。因此为了减少触发VM-Exit的次数,出现了半虚拟化I/O技术——virtio(Virtual I/O Device)。在处理I/O时,配合virtio的前后端一起使用,大大降低了VM-Exit的触发次数。但是在I/O路径上,还需要经过VMM和Host Kernel。

因此为了进一步缩短I/O路径,VHost技术出现了。VHost是Host Kernel中的一个模块,它可以与Guest直接进行通信,数据交换都在Guest和VHost模块之间进行,可以减少VMM的干涉,从而减少了上下文切换缩短了I/O路径。目前,由于VHost是Host Kernel中的模块,I/O需要与Host Kernel相互配合,避免不了从用户态到内核态的上下文切换。因此英特尔提出,在用户态中实现VHost,从而使得QEMU与用户态的VHost实现通信,进一步提高I/O性能。

2.容器存储

在2016年之后,容器存储也得到了迅速的发展,如EMC、华为等企业存储厂商积极拥抱容器生态,并推出相应的Docker Volume-Plugin的实现。其中,EMC打造了开源社区EMC Code,并发布了容器控制生态Polly和Libstorage,致力于向容器生态圈推进其技术。如今,在容器持久化存储生态系统中,已经逐渐发展成以下4种主要形态。

· Data-volume + Volume-Plugin:在Docker最初设计中,便考虑了持久化存储的问题,并提供了Data-volume支持,主要用来支持本地卷,不支持外置存储。随着存储需求的逐渐扩大,仅仅提供本地卷的支持便会遇到很多瓶颈,因此在Docker 1.8版本之后便推出了对数据卷插件(Volume Plugin)的支持。随后,大批存储厂商开始研发自己的数据卷插件,如EMC推出的REX-Ray、华为推出的Fuxi等。数据卷插件用来提供一些简单的卷管理接口,让存储的管控面对接,而在数据面上并未做任何优化。但数据卷插件并没有解决大量实际的问题,如并发性等问题仍然没有很大的改进。

· Container-define Storage:针对Volume-plugin的局限性,为了更好地发挥容器持久化存储的性能,越来越多的厂商意识到,不仅要结合管控面,还要结合数据面的特性,因此便出现了容器定义存储。容器定义存储的特点在于,融合了管控面和数据面,是结合容器的特点定制的,充分发挥了企业存储的特性。例如,CoreOS就是典型的容器定义存储。容器定义存储的缺点在于,存储本身不是云原生的,仍需要解决容器与存储两层之间的调度。

· STaaC(Storage as a Containter):STaaC为容器存储融合了管控面与数据面,并且解决了存储云原生应用的问题,存储自身也是容器化的,比容器定义存储更具有优势,典型的STaaC有StorageOS、BlockBridge等。

· Container-aware(容器感知):对于大型应用来说,通常单个主机会挂载大量的容器,使得宿主机的卷变得越来越难管理,同时速度可能也难以保证。Container-aware具备感知容器的能力,可以实现面向容器引擎Pod集群的容器存储,而不是在容器这一级。这将会大大减少容器存储的粒度,并实现数据库的容器感知能力。基于感知容器数据卷实现Container管理、分析、迁移,是容器存储的最佳形态。

1.2.11 数据保护

随着大数据和云计算时代的到来,企业用户的数据量越来越大,数据一旦发生泄露或丢失,对企业用户来说,是非常大的损失。因此企业将越来越多的数据存储在云端,云端存储大多数采用的是分布式架构,并且保存多份副本,能够在很大程度上提高容错能力。目前,大多数主流的云计算厂商不仅仅是卖计算和存储资源的,还将其基础架构用于帮助用户提供数据保护的服务。

越来越多的主流云存储和虚拟化系统,融入了对数据保护的扩展与支持。例如,虚拟化Hypervisor和管理平台在数据保护方面提供了很高的支持,包括热备份、增量备份、合成备份、一致性处理、单文件恢复、即时恢复等方面。又如,在虚拟化领域大名鼎鼎的VMware在数据保护方面也提供了多种支持,如具有强大功能的VADP (vStorage APIs for Data Protection)接口,其他备份软件只要遵循这个接口,就可以实现数据保护的大多数功能。

开源项目也少不了对数据保护的支持。例如,OpenStack的块存储管理接口Cinder提供了数据备份的支持,每次增量备份,虚拟机的数据要做切片哈希计算和对比,从而确定新增的数据。越来越多的用户会将开源的分布式存储系统作为存储后端,调用文件系统的快照(Snapshot)来做备份。例如,分布式存储系统Ceph和GlusterFS都可以通过网关节点来复制快照,从而把数据备份到本地或远程目标上。

另外一个比较有名的数据保护项目是Karbor,Karbor主要针对OpenStack提供应用数据保护服务,可以使各种数据保护软件通过标准的API和数据保护框架接入OpenStack,从而为OpenStack提供更好的备份、复制、迁移等数据保护的服务。同时为了完成数据保护任务,完成创建、任务触发、保护、数据一致性、数据恢复等整个流程,Karbor会为每个任务阶段都提供相应的API,将这些接口暴露给用户,从而提高灵活性、增加保护范围。Karbor最初由华为与其他数据保护公司主导,致力于解决虚拟机备份难、无标准备份接口的难题。Karbor保护的对象都是关联的资源,对每种资源的保护都是由Karbor中的插件引擎执行完成的,它会通过加载各种资源所需要的插件,来保护相关资源。

从目前来讲,数据保护仍是一个很热门的话题,随着云计算行业的不断推进,数据的保护将变得越来越重要。相信未来会出现更多优秀的技术,来带动数据保护项目的开拓与发展。