一种分布式存储的快照方法与流程

文档序号:13915574阅读:238来源:国知局

本发明属于快照技术领域,特别涉及一种分布式存储的快照方法。



背景技术:

快照(snapshot)是某个数据集在某一特定时刻的镜像,也称为即时拷贝,它是这个数据集的一个完整可用的副本。存储网络行业协会snia对快照的定义是:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点的映像。快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。

在存储系统层次上,快照通常以逻辑单元为快照实体,以数据块(block)的粒度进行副本数据复制。在分布式存储中,快照以逻辑卷为快照实体,逻辑单元为粒度进行数据复制。快照生成的是原存储系统的逻辑副本,使用时需要借助原存储系统,虚拟视图技术是其典型代表。生成快照时,只需要产生一系列指向原存储系统的指针,因而创建时间极短;若在使用快照的过程中发生对原存储系统的写操作,将对应数据单元的原有数据存入快照,该数据单元分为快照中的某个时间点数据和当前数据,其他未发生更新的数据在快照和原存储系统中共享。虚拟视图的灵活性及使用存储空间的高效性,使得它成为快照技术的主流。

通常而言,快照都要经过初始化、数据拷贝和终止几个处理阶段,其中数据拷贝是快照的技术核心。当前数据拷贝有主要有两种技术,一种是写时复制(cow,copyonwrite)。另一种技术是写入重定向(row,redirectonwrite)。

(1)写时复制cow

cow快照需要消耗一些存储空间--建立快照卷。当为一个数据卷创建一个快照之后,这些预留的空间用来存放被变化数据更新的旧数据。cow快照在初始化的过程中仅仅创建用来描述源数据块位置的指针信息(元数据),而不是完整的将源数据块拷贝过来。因此初始化的过程几乎可以在瞬间完成,对系统的影响也很小。

cow快照会跟踪数据卷的写操作和数据块变化。当某个数据块发生改变时,在将旧的数据覆盖之前,首先将该块的旧数据复制到预留的快照卷,该步骤仅在数据卷相应数据块位置发生第一次写操作请求时进行。这个处理过程确保快照出来的数据与发起快照的那个精确时间点保持完全一致。这个过程也描述了“copyonwrite”这个名字的含义。

如果需要访问某个时间点的快照数据,对没有改变过的块直接从数据卷读取;对已经改变并被复制的块则从快照空间读取。从快照被创建那一刻开始,每个快照都会跟踪记录描述块改变的元数据信息。

cow快照的主要优势在于空间的高效利用,因为快照卷只需要保留发生过变化的数据块,与数据卷相比要小得多。但是cow快照有个明显缺点,它会引起数据卷性能的下降,这是因为创建快照之后,对数据卷的写操作会增加一个等待的过程,即旧数据块复制到快照卷的过程。另外一个关键问题是每个快照卷必须依赖一个完整的数据卷。

传统存储快照技术是基于时间点的复制,能够在一个存储单元中建立数据的完全卷拷贝。如果生产系统此时对某一个数据集合进行频繁的修改,在这种情况下产生一个时间点一致拷贝是比较困难的。当进行快照时,快照的源卷将会被冻结几秒钟;当快照拷贝的位图建立之后,源卷才可以继续进行i/o操作。当位图建立后,后台拷贝需要进行一段时间,但是在目标卷上看来,拷贝已经完成了。

(2)写入重定向row

快照实现技术中的另一种技术是i/o重定向(i/oredirect)。即将读写操作重新定向到另一个存储空间中。在一个快照生成期间,所有的写操作将被重定向到另一个介质,而读操作是否需要读重定向,则需要根据读取的位置是否有过自上次快照以来的写重定向,必须对有过写重定向的位置进行读重定向,否则不需要进行读定向。当要创建一个快照时,则将自上次快照以来所有的重定向写数据所对应在源介质中的数据复制出来生成这个时间点的快照,然后再将这些重定向写数据写回到源介质中的相应位置上,从而完成一个快照生成过程。

从row快照过程来看,关键的性能影响在于快照生成时的四次i/o操作(一次读源介质,一次写快照数据,一次读快照介质,一次写源介质),另一个则是重定向的计算工作。这种方式虽然看起来最后生成快照时的i/o操作较多,但是考虑到这个操作是在生成快照时才会发生,特别是快照生成时可以对i/o操作进行排序,可以使得对介质的读写得到较好的优化,因此使影响很小。而对于重定向的计算操作对于当下的计算能力来说,不会成为一个性能的瓶颈问题。因此这种快照实现方式在非快照执行期间的影响甚小。因此这种方式比较适合write-intensive(写密集)类型的存储系统。

写时复制cow和写入重定向row两种快照机制,创建快照时都是仅仅复制了原始数据物理位置的元数据,因此快照创建非常快,可以瞬间完成快照操作。然而,一旦快照创建完成后,则每个快照副本需要跟踪原始卷的数据变化(即原始卷写操作),原始卷数据块发生首次更新则需要复杂的操作并产生副作用。主要有三个不足之处:

(1)严重影响原始卷性能

cow和row快照,对原始卷的后续读写会产生较大的额外系统开销,造成性能大幅下降,实际中最大降幅甚至达到50-80%。cow快照对写性能影响大,原始卷数据的首次变化需要复制数据,多一次读写的数据块迁移过程,i/o需要等待时间比较长;但原卷数据的布局没有任何改变,对读性能没有影响。row快照对读性能影响大,多次读写后,原始卷的数据变得非常分散,对于连续读写性能下降很大,尤其是机械式硬盘存储系统;row快照对原始卷的写性能基本没有损耗,只是修改数据块映射指针,实现效率很高。

(2)快照无法独立于原始卷

目前主要的cow/row快照实现方式,需要预留存储空间(通常是30%),并创建快照卷用于存储写操作时引起的变化数据。快照卷仅存储了原始卷更新的数据,无法得到完整的物理副本。如果需要完整物理副本,则必须依赖原始卷的数据,快照卷也无法独立于原始卷存在。

(3)快照数量存在限制

传统存储或者分布式存储通常都会对快照数量进行限制,主要是出于两方面的原因。一是性能影响,快照数量越多,cow/row处理开销越大,导致原始卷性能降低到无法正常应用的状态。比如,限制单卷快照数量不要超过128。二是存储容量,快照卷需要预留一定比例的存储空间,对于频繁读写的原始卷,如果快照数量太多,更新数据量必然很大,从而可能导致预留存储空间不足引起快照失效。



技术实现要素:

本发明要解决的技术问题是提供一种快照前后原始卷性能一致性好、提高快照读写性、能解除快照卷对原始卷的存在性依赖关系、不需要专门为快照预留存储空间、不限制快照数量的分布式存储的快照方法及其系统。

本发明以如下技术方案解决上述技术问题:

一种分布式存储的快照方法,采用分布式对象存储系统hipersan分层存储,所述对象包括数据对象和虚拟磁盘vdi对象,每个对象有一个64bit的全局唯一标识符,hipersan分层存储对外提供服务的是虚拟磁盘vdi,每个虚拟磁盘vdi对应一个vdi对象使得该虚拟磁盘vdi的逻辑空间和实际存储的物理空间一一对应起来;所述虚拟磁盘vdi和及其快照采用相同的虚拟视图对象,共享存储资源池;创建快照时采用写入重定向row方法,将当前工作虚拟磁盘vdi保存为快照,创建一个新的vdi虚拟视图对象并复制原虚拟磁盘vdi的虚拟视图信息,新的虚拟磁盘vdi成为了当前工作vdi;创造快照后的原始虚拟磁盘vdi的写操作,则采用cow写时复制方法。

所述创建快照的具体步骤为:

(1)更新当前工作虚拟磁盘vdi为快照

a)读取当前工作vdi的虚拟视图对象,修改快照创建时间;

b)为虚拟磁盘vdi每个数据对象的引用计数加1;

c)将虚拟磁盘vdi虚拟视图对象进行持久化存储;

(2)新建虚拟磁盘vdi作为当前工作vdi

a)新建一个虚拟磁盘vdi虚拟视图对象,复制原虚拟磁盘vdi的虚拟视图信息;

b)设置新建虚拟磁盘vdi中的快照标识id为原始vdi的快照标识id加1,成为工作虚拟磁盘vdi;

c)将新建虚拟磁盘vdi的引用计数加1;

d)将新建虚拟磁盘vdi虚拟视图对象进行持久化存储。

所述cow写时复制方法中采用log日志,

(1)基于对象级别的log日志,按时间顺序记录cow对象复制到当前虚拟磁盘vdi之前的所有的写操作;

(2)请求写入日志成功,则返回;存储单元定期合并这些请求,然后再与cow对象合并,生成更新过的当前虚拟磁盘vdi中的对象;

(3)以cow标志作为对象是否触发log读写流程的判断依据;

(4)读取数据时需要进行判断,未更新的数据直接从cow对象读取,更新过的读log日志;

(5)log日志文件与数据对象,通过hash分布在与对象相同的存储单元上,对象与相应log文件具有相同的hash值,副本数也相同;

(6)merge操作优先一切对象操作。

所述log日志的写入流程如下:

(1)判断请求有无cow标识,有则进入log写入流程;

(2)log写入流程直接在存储单元处理,读写请求正常分发;

(3)存储单元查找数据对象和log日志文件,没有则创建并初始化对应log日志文件;

(4)若存在log日志文件,判断是否存在merge线程,不存在则以追加形式将写请求添加到log日志文件,更新偏移量offset范围,增加写入总次数,累加log日志文件总长度,生成log日志文件的校验值;

(5)若存在merge线程,将请求添加到master的merge线程队列中,直接合并成功后,更新虚拟磁盘vdi虚拟视图中的索引,添加对象到对象列表缓存中,删除log文件。

所述log日志的log读取流程如下:

(1)判断请求有无cow标识,进入log读取流程;

(2)存储单元收到请求后,查询是否存在log日志文件,不存在则对cow对象直接读取,然后返回;

(3)若存在log日志文件,判断读取范围是否在log日志范围内;

(4)若不在log日志范围内,直接读取cow对象,然后返回;

(5)若在log日志范围内,判断merge操作是否正在执行,若是则将请求加入merge线程队列,读取合并后的数据;

(6)若没有执行merge,则触发merge操作生成对象,成功后执行读取操作。

所述log日志的合并流程如下:

(1)同一个对象的merge操作可能有多个,选出master执行merge操作;

(2)merge线程连接zookeeper,提交对象id和log文件长度,log文件最大的为标准对象大小,时间最早的选为master;

(3)master上merge线程处理log日志文件中记录的写入请求和随后到来的读写请求;

(4)将log日志文件头部读出,根据log日志头部中的cow_vid和idx读取cow对象数据到缓存;

(5)按照log文件记录的总次数,逐次读取写请求,按照偏移量和长度将数据合并到cow对象缓存中,然后将队列中请求按顺序处理,直接读取缓存,然后返回,写合并到缓存;

(6)完成后,生成校验值,将新数据写入对象;

(7)通知zookeeper其他节点,操作成功,注销log缓存,删除log日志文件

本发明的优点:

(1)综合了cow和row快照机制的优势,创建快照采用row机制,写时采用cow机制,并采用log日志机制消除快照引起的原始卷读写性能大幅下降和快照前后原始卷性能一致性问题。log日志对i/o请求进行合并,快照后的读写性能还能高于快照前的读写性能。

(2)采用独立的虚拟视图对象统一表示原始卷和快照卷,快照卷具有完整的物理副本,解除了快照卷对原始卷的存在性依赖关系。

(3)原始卷和快照卷共享整个分布式存储资源池,不需要专门为快照预留存储空间,因此,只要分布式存储资源池足够,创建的快照数量就不受限制,突破了快照数量限制的瓶颈。

附图说明

图1是本发明hipersan分布式存储中虚拟磁盘与数据对象的映射关系图。

图2是本发明方法log日志的写入流程图。

图3是本发明方法log日志的读取流程图。

图4是本发明方法log日志的合并流程图。

具体实施方式

以下结合附图对本发明的具体实施方式作详细说明,但不构成对本发明权利要求保护范围的限制。

一种分布式存储的快照方法,采用分布式对象存储系统hipersan分层存储,hipersan分层存储是分布式块存储系统,利用多个x86服务器的计算和存储能力,结合高性能、低延迟网络,构建分布式的存储系统,并能与云计算、虚拟化等应用系统实现超融合部署。hipersan提供多种企业级数据服务功能,例如qos、自动精简配置和快照,可实现大规模、高可靠、高性能、超融合的存储应用,非常适合对可扩展性和存储性能要求不断提升的应用场景,如数据库、虚拟化、云计算等。其中,快照是核心数据服务功能之一。

hipersan分层存储核心是分布式对象存储,所有的数据包括元数据,均以对象方式组织并存储在底层存储设备上,其中又以64bit的objectid作为对象的全局唯一标识符。hipersan对外提供服务的虚拟磁盘vdi(virturaldiskimage,或lun),是基于对象的卷级(volume)抽象,由一组特定对象所组成的集合。hipersan是无中心的集群存储架构,采用一致性哈希dht和虚拟节点确定对象存储位置。

hipersan分层存储的对象存储中,每个数据对象存储固定大小的数据,具有唯一的标识符64bit的objectid,客户端不用关心对象存储位置。对于一个虚拟磁盘vdi,整个逻辑存储空间缺省被切分为多个4mb固定大小的数据对象,一个虚拟磁盘vdi最大可以具有2^20个对象,因此一个虚拟磁盘vdi最大可达4tb。通过调整对象大小,单个虚拟磁盘vdi可以突破4tb限制,达到512tb甚至更大。每个虚拟磁盘vdi对应一个vdi对象vdiobject,其中包含对象分配表和映射关系,如图1所示,这样虚拟磁盘vdi逻辑空间就和对象的物理空间一一对应起来。

描述虚拟磁盘vdi的元数据,即为虚拟视图对象。hipersan分层存储中对原始虚拟磁盘vdi和快照采用相同的虚拟视图对象,区别在于快照是只读视图,对应的对象不允许修改。对于一个虚拟磁盘vdi,可以创建快照,每一个快照对应一个虚拟视图对象,快照是一个完整的虚拟磁盘vdi,能够访问整个虚拟磁盘数据集合,摆脱了对原始虚拟磁盘vdi的依赖束缚。所有虚拟磁盘vdi及其快照共享整个分布式存储资源池,不需要为快照预先保留存储空间,因此只要存储空间足够,创建的快照数量不受限制。简单地讲,虚拟磁盘vdi快照创建过程实际就是对虚拟视图对象的复制克隆,类似cow快照机制,由于这个对象很小,快照可以瞬间完成。

hipersan创建快照时,只是简单地将原始vdi冻结,不再允许修改,并创建新的虚拟磁盘vdi,并将视图索引指向快照中的虚拟视图对象,因为此时新vdi没有经过修改,数据与快照相同。虚拟视图对每一个数据对象进行索引,通过vid和index计算数据对象名字,当指向数据对象的vid与当前虚拟视图不同时,说明当前虚拟视图的index指向其他虚拟视图的对象文件,属于引用,此时如果需要修改该对象中数据,需要在引用的数据基础上创建自己的对象文件。

本发明的快照方法,综合了cow和row快照机制的优势。创建时,它创建了一个新的vdi虚拟视图对象,新的vdi成为了当前工作vdi,而老的vdi成为了快照vdi,此后i/o读写都工作在新的vdi上面。这个过程和row快照相似,新建的快照卷用于存储变化的新数据。但创造快照后的原始vdi写操作,则采用cow写时复制机制,并采用log日志机制优化性能下降问题。快照创建过程分为两个部分:

(1)更新当前工作虚拟磁盘vdi为快照

a)读取当前工作vdi的虚拟视图对象,修改快照创建时间;

b)为虚拟磁盘vdi每个数据对象的引用计数加1;

c)将虚拟磁盘vdi虚拟视图对象进行持久化存储;

(2)新建虚拟磁盘vdi作为当前工作vdi

a)新建一个虚拟磁盘vdi虚拟视图对象,复制原虚拟磁盘vdi的虚拟视图信息;

b)设置新建虚拟磁盘vdi中的快照标识id为原始vdi的快照标识id加1,成为工作虚拟磁盘vdi;

c)将新建虚拟磁盘vdi的引用计数加1;

d)将新建虚拟磁盘vdi虚拟视图对象进行持久化存储。

快照的创建是将当前工作vdi保存为快照,在vdi虚拟视图对象基础上创建新的vdi虚拟视图对象作为工作vdi。因为两者拥有相同的数据对象,新建工作vdi只需复制快照vdi中的数据索引,指向快照数据对象,通过cow机制,修改数据对象时,使用快照的对象数据创建自己的数据对象,然后修改工作vdi的数据索引。

hipersan以4m大小作为数据对象的默认大小,读写请求在4m范围内,以偏移量和长度执行i/o读写。虚拟磁盘vdi支持自动精简配置,第一次执行写请求时,创建相应数据对象,此过程伴随着对象初始化,用零和待写入数据填充4m空间。除非写入4m数据,初始化过程必然存在写放大问题,写入的块越小,写放大越严重,性能越低。对数据卷做快照后,当前卷相当于自动精简配置的新卷,因为cow机制的存在,需要初始化对象并执行读取4m然后写入4m的操作,需要的时间是原来vdi对象写入的2倍以上。对此,引入log日志机制优化cow带来的写性能损耗和写放大问题。

(1)基于对象级别的log日志,按时间顺序记录cow对象复制到当前vdi之前的所有的写操作;

(2)请求写入日志成功,则返回。存储单元定期合并这些请求,然后再与cow对象合并,生成更新过的当前vdi中的对象;

(3)以cow标志作为对象是否触发log读写流程的判断依据;

(4)读取数据时需要进行判断,未更新的数据直接从cow对象读取,更新过的数据从log日志读取;

(5)log日志文件与数据对象,通过hash分布在与对象相同的存储单元上,对象与相应log日志文件具有相同的hash值,副本数也相同;

(6)日志文件merge操作优先一切对象操作(创建,加载,修复,冻结等)。

在cow机制基础上引入log日志机制,虚拟磁盘vdi的读写流程发生根本的变化,对象数据写操作先写入log即返回,然后在后台在合适的时机以异步方式进行合并成正常的对象。log机制消除了cow带来的写性能损耗,保证了原始卷在有无快照的情况下的性能一致性。同时log机制还能将随机写转化为顺序写,从而大幅提升随机写性能。log写入、读取和合并详细工作流程如下:

log写入流程:

(1)判断有无cow标识,进入log流程;

(2)log流程直接在存储单元处理,读写请求正常分发;

(3)存储单元查找对象和log文件,没有则创建并初始化对应log;

(4)若存在log文件,判断是否存在merge线程,不存在则以追加形式将写请求添加到log文件,更新偏移量offset范围,增加写入总次数,累加log文件总长度,生成log文件的校验值;

(5)若存在merge线程,将请求添加到master的merge线程队列中,直接合并,成功后,更新vdi虚拟视图中的索引,添加对象到对象列表缓存中,删除log文件。

log读取流程:

(1)判断有无cow标识,进入log流程;

(2)存储单元收到请求后,查询是否存在log文件,不存在则对cow对象直接读取,然后返回;

(3)若存在log文件,判断读取范围是否在log范围内;

(4)若不在log范围内,直接读取cow对象,然后返回;

(5)若在log范围内,判断merge操作是否正在执行,若是则将请求加入队列,读取合并后的数据;

(6)若没有执行merge,则触发merge操作生成对象,成功后执行读取操作。

log合并流程:

(1)同一个对象的merge操作可能有多个,选出master执行merge操作;

(2)merge线程连接zookeeper,提交对象id和log文件长度,log文件最大的为标准对象大小(典型的为4mb),时间最早的选为master;

(3)master上merge线程处理log文件中记录的写入请求和随后到来的读写请求;

(4)将log文件头部读出(log文件可能很大),根据log头部中的cow_vid和idx读取cow对象数据到缓存;

(5)按照log文件记录的总次数,逐次读取写请求,按照偏移量和长度将数据合并到cow对象缓存中,然后将队列中请求按顺序处理,直接读取缓存,然后返回,写合并到缓存;

(6)完成后,生成校验值,将新数据写入对象;

(7)通知zookeeper其他节点,操作成功,注销log缓存,删除log文件。

快照具有很广泛的应用,例如作为数据备份源、作为数据分析的源、作为测试环境,或者数据复制的一种手段等。快照不能对生产环境产生较大的影响,尤其是性能的一致性。本发明方法通过独立的虚拟视图对象、共享存储资源池、cow/row机制优化、引入log日志机制等方法,有效解决了分布式存储系统中快照导致原始卷性能大幅下降、快照卷独立性和快照数量限制等一系列相关问题,有效拓宽了数据应用负载的适用范围,尤其是快照使用较多的应用场景,比如数据库、虚拟化、备份容灾等。

本发明的方法,关键在于:

(1)采用虚拟视图对象统一表示原始卷和快照卷,共享存储资源池。

原始卷和快照卷采用相同的虚拟视图对象,区别在于快照是只读视图,每一个虚拟视图对象均表示一个完整的vdi,能够访问整个虚拟磁盘数据集合,摆脱了对原始vdi的依赖束缚。所有vdi及其快照共享整个分布式存储资源池,不需要为快照预先保留存储空间,因此只要存储空间足够,创建的快照数量不受限制。vdi快照创建过程实际就是对虚拟视图对象的复制克隆,类似cow快照机制,由于这个对象很小,快照可以瞬间完成。

(2)综合cow和row快照机制的优势,创建快照采用row机制,写时采用cow机制。

本发明方法综合了cow和row快照机制的优势。创建快照时采用row机制,它创建了一个新的vdi虚拟视图对象(表示一个完整的vdi),新的vdi成为了当前工作vdi,而老的vdi成为了快照vdi,此后i/o读写都工作在新的vdi上面,新建的快照卷用于存储变化的新数据。后面的原始vdi写操作,则采用cow写时复制机制,并采用log日志机制优化性能下降问题。

(3)引入log日志机制消除快照引起的原始卷性能大幅下降。

在cow机制基础上引入log日志机制,虚拟磁盘vdi的读写流程发生根本的变化,对象数据写操作先写入log即返回,然后在后台在合适的时机以异步方式进行合并成正常的对象。log机制消除了cow带来的写性能损耗,保证了原始卷在有无快照的情况下的性能一致性。同时log机制还能将随机写转化为顺序写,从而大幅提升随机写性能。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1