一种数据存储方法和装置与流程

文档序号:13943311阅读:110来源:国知局

本申请涉及通信技术领域,尤其涉及一种数据存储方法和装置。



背景技术:

随着移动网络、大数据、云计算的大量应用,对存储容量和存储性能提出了越来越高的要求,ceph(基于linuxpb的分布式文件系统)、gfs(googlefilesystem,基于linux的专有分布式文件系统)、gluster、hdfs(hadoopdistributedfilesystem,分布式文件系统)等分布式文件系统均得到了快速的发展。

其中,分布式文件系统可以包括多个osd(objectstoragedevice,对象存储设备),osd是数据存储服务单元,一个osd可以对应一个物理磁盘。

为了实现数据文件的存储,将数据文件拆分成多个数据对象,获取每个数据对象的元数据(metadata),并将该数据对象存储到osd,将该元数据存储到分布式文件系统的管理节点。其中,数据对象的元数据,可以包括数据对象在osd中的存储位置、数据对象的大小、时间信息(如创建时间、修改时间、访问时间)、属性(如只读、隐藏)、文件类型、打开方式等。

但是,由于针对每个数据对象均需要存储元数据,当数据对象的数量很多时,所有数据对象的元数据会占用大量存储资源,并且需要频繁的访问分布式文件系统的管理节点,以从管理节点读取元数据,占用了大量读取资源。



技术实现要素:

本申请提供一种数据存储方法,应用于客户端,所述方法包括:

获取待存储的第一数据文件、所述第一数据文件对应的第一lun标识;

根据第一集群视图信息确定所述第一lun标识对应的多个第一osd;其中,所述第一集群视图信息是从监控服务器获取的,且所述第一集群视图信息包括第一lun标识与第一osd的对应关系;

将所述第一数据文件拆分成多个数据块,确定每个数据块对应的第一osd,将数据块发送给对应的第一osd,以使所述第一osd存储所述数据块;

将所述第一数据文件对应的元数据存储到所述监控服务器。

本申请提供一种数据存储装置,应用于客户端,所述装置包括:

获取模块,用于获取待存储的第一数据文件、所述第一数据文件对应的第一逻辑单元号lun标识;根据第一集群视图信息确定所述第一lun标识对应的多个第一对象存储设备osd;其中,所述第一集群视图信息是从监控服务器获取的,所述第一集群视图信息包括第一lun标识与第一osd的对应关系;

处理模块,用于将所述第一数据文件拆分成多个数据块;

确定模块,用于确定每个数据块对应的第一osd;

发送模块,用于将数据块发送给对应的第一osd,以使所述第一osd存储所述数据块;将所述第一数据文件对应的元数据存储到所述监控服务器。

基于上述技术方案,本申请实施例中,仅存储整个数据文件的元数据,大大减少元数据数量,节省元数据占用的存储资源。由于只从监控服务器读取整个数据文件的元数据,不用读取大量元数据,从而可以减轻客户端的处理压力,减轻元数据的访问频率和数量,提高集群访问性能,提高元数据的获取效率,减轻元数据管理的复杂度。

附图说明

为了更加清楚地说明本申请实施例或者现有技术中的技术方案,下面将对本申请实施例或者现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据本申请实施例的这些附图获得其他的附图。

图1是本申请一种实施方式中的应用场景示意图;

图2是本申请一种实施方式中的lun与osd的对应关系的示意图;

图3是本申请一种实施方式中的数据存储方法的流程图;

图4a-图4d是本申请一种实施方式中的数据块的存储示意图;

图5是本申请另一种实施方式中的数据存储方法的流程图;

图6a-图6d是本申请一种实施方式中的扩容后的数据块存储示意图;

图7是本申请一种实施方式中的数据存储装置的结构图;

图8是本申请一种实施方式中的客户端的硬件结构图。

具体实施方式

在本申请实施例使用的术语仅仅是出于描述特定实施例的目的,而非限制本申请。本申请和权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其它含义。还应当理解,本文中使用的术语“和/或”是指包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本申请实施例可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本申请范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,此外,所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

本申请实施例中提出一种数据存储方法,该方法可以应用于包括客户端和服务器的系统,如分布式文件系统,服务器可以包括数据服务器(dataserver)和监控服务器(monitorserver),参见图1所示,为分布式文件系统的结构图。

其中,客户端可以是用户进行数据写入/数据读取的接口,用户通过客户端访问数据服务器,从而在数据服务器写入数据、从数据服务器读取数据。

其中,监控服务器用于监控数据服务器的健康状态、管理数据服务器的存储资源、存储数据服务器的元数据和集群视图信息。若数据服务器的健康状态是异常,则用于快速恢复数据服务器的故障。用户可以通过管理接口连接到监控服务器,从而管理数据服务器的存储资源,查询数据服务器的存储的元数据和集群视图信息。监控服务器通常是高可用模式,以避免监控服务器故障。

其中,数据服务器可以包括多个osd,每个osd均用于存储数据。此外,一个lun(logicalunitnumber,逻辑单元号)可以对应多个osd,每个osd相当于一个物理磁盘,lun可以是这些物理磁盘组成的逻辑存储介质。此外,为每个osd提供独立的osd服务进程,该osd服务进程用于对该osd进行处理。例如,可以为osd1提供osd服务进程1,并为osd2提供osd服务进程2,这样,若接收到客户端发送的针对osd1的处理请求,则由osd服务进程1进行处理,在处理过程中,osd服务进程1可以在osd1的物理磁盘中写入数据或者从osd1的物理磁盘中读取数据;若接收到客户端发送的针对osd2的处理请求,则由osd服务进程2进行处理,以此类推。通过为每个osd提供独立的osd服务进程,可以在osd服务进程异常时,快速恢复osd服务进程,且不会对其它osd服务进程造成影响。例如,当osd服务进程1异常时,则osd服务进程2可以继续工作,由于osd服务进程1只对osd1提供服务,osd服务进程1管理的资源很少,因此可以快速恢复osd服务进程1。

例如,lun1可以对应osd1、osd2、osd3、osd4,lun2对应osd5、osd6、osd7、osd8,若用户需要将数据写入到lun1中,则客户端是将数据写入到lun1对应的osd1、osd2、osd3、osd4中,以此类推。

在一个例子中,参见图2所示,为lun与osd的对应关系的示例,lun1对应osd1和osd2,lun2对应osd2和osd3,lun3对应osd3和osd4。

假设osd1是10g存储空间,osd2是20g存储空间,osd3是20g存储空间,osd4是8g存储空间,则:lun1可以占用osd1的10g存储空间、占用osd2的10g存储空间(如前10g存储空间);lun2占用osd2的10g存储空间(如后10g存储空间)、占用osd3的10g存储空间(如前10g存储空间);lun3占用osd3的10g存储空间(如后10g存储空间)、占用osd4的8g存储空间。上述只是给出了lun与osd的对应关系示例,对此不做限制。

其中,一个lun可以属于一个存储池,一个lun对应的多个osd可以位于主机(host)上,这些主机可以位于机架(rack)上。例如,分布式文件系统可以包括机架1和机架2,机架1可以包括主机11和主机12,机架2可以包括主机21和主机22,主机11可以包括osd111、osd112、osd113,主机12可以包括osd121、osd122、osd123、osd124,主机21可以包括osd211、osd212,主机22可以包括osd221,上述只是给出了一个示例,对此不做限制。

基于上述架构,一个lun对应的多个osd可以尽量分布在不同机架的不同主机上。例如,一个lun对应的4个osd,可以分别是osd111、osd121、osd211、osd221,osd111位于主机11上,osd121位于主机12上,osd211位于主机21上,osd221位于主机22上。这样一来,当某主机发生故障时,只有一个osd无法使用,lun对应的其它osd可以继续使用,避免lun对应的所有osd都无法使用。当某机架发生故障时,只有两个osd无法使用,lun对应的其它osd可以继续使用,避免lun对应的所有osd都无法使用。

在上述应用场景下,参见图3所示,为本申请实施例中提出的数据存储方法的流程图,该方法可以应用于客户端,且该方法可以包括以下步骤:

步骤301,获取待存储的数据文件、该数据文件对应的lun标识。

其中,当用户需要存储数据文件(为了方便描述,可以将需要存储到osd的数据称为数据文件,如400m的数据文件)时,则客户端可以获取到待存储的数据文件、以及该数据文件对应的lun标识(即用户指定的lun标识)。

步骤302,根据集群视图信息确定该lun标识对应的多个osd。

在一个例子中,该集群视图信息可以是客户端从监控服务器获取的,且该集群视图信息可以包括但不限于:lun标识与osd的对应关系。

在一个例子中,在步骤302或者步骤301之前,客户端可以与监控服务器建立连接,并向监控服务器发送视图信息获取消息,监控服务器在接收到视图信息获取消息后,可以将集群视图信息(也称为数据分布信息)发送给客户端。

其中,该集群视图信息可以包括但不限于lun标识与osd的对应关系、osd对应的磁盘容量、osd的起始空闲地址等,对此内容不做限制。例如,lun1对应osd1、osd3、osd5、osd7;lun2对应osd2、osd4、osd6、osd8;lun1属于存储池1;lun2属于存储池2;osd1的磁盘容量是10g、osd2的磁盘容量是10g、osd3的磁盘容量是10g、osd4的磁盘容量是10g、osd4的磁盘容量是12g、osd6的磁盘容量是12g、osd7的磁盘容量是11g、osd8的磁盘容量是12g;osd1-osd8中的每个osd的起始空闲地址。

基于上述集群视图信息,客户端获取到数据文件对应的lun标识后,假设lun标识为lun1,确定lun1对应的osd为osd1、osd3、osd5、osd7。

步骤303,将数据文件拆分成多个数据块,并确定每个数据块对应的osd。其中,可以预先指定数据块的大小,如数据块的大小为4m,假设数据文件的大小是400m,可以将数据文件拆分成100个4m的数据块。这里是将数据文件拆分成数据块,数据块就是数据文件中的数据,不包括元数据等信息。

其中,针对“确定每个数据块对应的osd”的过程,可以包括但不限于:

方式一、为每个数据块分别设置oid(objectidentifier,对象标识符),不同数据块的oid不同。采用第一hash算法对数据块的oid进行hash处理,得到hash处理结果,并将hash处理结果对应的osd,确定为该数据块对应的osd。第一hash算法用于使不同osd对应的数据块数量的差小于预设阈值。

其中,针对“为每个数据块分别设置oid”的过程,在将数据文件拆分成多个数据块后,多个数据块的序号依次为0、1、2、3等,而这些数据块对应的oid也就依次是0、1、2、3等。例如,从数据文件拆分的第一个数据块的oid为0,第二个数据块的oid为1,第三个数据块的oid为2,以此类推。

其中,针对“采用第一hash算法对数据块的oid进行hash处理,得到hash处理结果,并将hash处理结果对应的osd,确定为该数据块对应的osd”的过程,可以包括:以第一hash算法是取余hash算法为例,则使用数据块的oid对osd总数量(即步骤302中确定的osd数量)进行取余处理,得到hash处理结果(即取余处理的余数)。然后,通过查询余数与osd的对应关系,得到hash处理结果对应的osd,并将该osd确定为该数据块对应的osd。

例如,假设步骤302中确定的osd为osd1、osd2和osd3,则预先配置余数0与osd1的对应关系,余数1与osd2的对应关系,余数2与osd3的对应关系。基于此,针对oid为0的数据块,由于0对总数量3的取余结果为0,因此,将余数0对应的osd1确定为该数据块对应的osd。针对oid为1的数据块,由于1对总数量3的取余结果为1,因此,将余数1对应的osd2确定为该数据块对应的osd。以此类推,可以确定出每个数据块对应的osd。

当然,上述是以取余hash算法为例,在实际应用中,第一hash算法还可以是其它hash算法,对此第一hash算法不做限制,只要第一hash算法能够使不同osd对应的数据块数量的差小于预设阈值(如1、2)即可。例如,第一hash算法用于使不同osd对应的数据块数量相同,如数据块数量为100,osd数量为4时,第一hash算法用于每个osd对应的数据块数量为25;数据块数量为100,osd数量为3时,第一hash算法用于osd1对应的数据块数量为34,而osd2对应的数据块数量为33,osd3对应的数据块数量为33,以此类推。

在一个例子中,参见图4a所示,为方式一的处理过程示意图,参见图4b所示,为采用第一hash算法确定每个数据块对应的osd的示意图,从图4b中可以看出,可以将数据块(如d0-d5等)尽量均衡的分布在各个osd上。

方式二、客户端可以将多个数据块划分到n个数据组中,每个数据组中包括至少两个数据块,n的取值大于等于osd总数量(即步骤302中确定的osd数量)。然后,可以采用均衡策略确定每个数据组对应的osd,其中,所述均衡策略用于使不同osd对应的数据块数量的差小于预设阈值。然后,可以将数据组对应的osd,确定为所述数据组中的至少两个数据块对应的osd。

其中,针对“将多个数据块划分到n个数据组”的过程,可以先确定n的取值,n的取值需要大于等于osd总数量,如n的取值可以为osd总数量,或者osd总数量的2倍、3倍等,当然,n也可以为其它数值,只要大于等于osd总数量即可。例如,osd总数量为3时,n可以为3、4、6、9等。

然后,可以将多个数据块划分到n个数据组中,如尽量平均到每个数据组,在无法平均到每个数据组时,保证不同数据组中的数据块数量之差不超过1个。当然,也可以采用其它方式将多个数据块划分到n个数据组中,只要保证每个数据组中包括至少两个数据块即可,本实施例对此划分方式不做限制。

例如,假设osd总数量为3,n为3,数据块的总数量为100,则可以将第1个数据块至第34个数据块划分到数据组1,将第35个数据块至67个数据块划分到数据组2,将第68个数据块至100个数据块划分到数据组3。

又例如,假设osd总数量为3,n为6,数据块的总数量为100,则可以将第1个数据块至第17个数据块划分到数据组1,将第18个数据块至34个数据块划分到数据组2,将第35个数据块至51个数据块划分到数据组3,将第52个数据块至68个数据块划分到数据组4,将第69个数据块至84个数据块划分到数据组5,将第85个数据块至100个数据块划分到数据组6。

其中,针对“采用均衡策略确定每个数据组对应的osd”的过程,可以平均划分每个数据组对应的osd,例如,当数据组的数量n与osd总数量相同时,每个数据组对应一个osd,如数据组1对应osd1,数据组2对应osd2,数据组3对应osd3。又例如,数据组的数量n为osd总数量的2倍时,则两个数据组对应一个osd,如数据组1对应osd1,数据组2对应osd2,数据组3对应osd3,数据组4对应osd1,数据组5对应osd2,数据组6对应osd3。

当然,上述均衡策略只是一个示例,只要均衡策略用于使不同osd对应的数据块数量的差小于预设阈值(如1、2)即可,对此不做限制。

例如,所述均衡策略用于使不同osd对应的数据块数量相同或者近似,如数据块数量为100,osd数量为4时,则均衡策略用于使每个osd对应的数据块数量为25,且可以通过将连续25个数据块划分到一个数据组来实现。

在一个例子中,参见图4c所示,为采用方式二确定每个数据块对应的osd的示意图,从图4c中可以看出,可以先将连续的多个数据块(如d0-d5等)分布在一个osd。例如,在将数据文件拆分成100个数据块(以100个为例,且假设osd数量为4,数据组数量为4)后,可以按照顺序,先将第1个数据块至第25个数据块存储到第一个osd,在这个存储过程中,由于osd没有发生变化,因此,可以将这25个数据块依次发送给同一个osd,充分保证磁盘指针的顺序访问,提高磁盘访问带宽,而不是每存储一个数据块后就改变osd。

步骤304,将数据块发送给对应的osd,以使该osd存储该数据块。

例如,在采用上述方式一时,可以将数据块1发送给osd1,以使osd1存储该数据块1,将数据块2发送给osd2,以使osd2存储该数据块2,将数据块3发送给osd3,以使osd3存储该数据块3,将数据块4发送给osd1,以使osd1存储该数据块4,以此类推。在采用上述方式二时,可以将数据块1-数据块34发送给osd1,以使osd1存储数据块1-数据块34,将数据块35-数据块67发送给osd2,以使osd2存储数据块35-数据块67,将数据块68-数据块100发送给osd3,以使osd3存储数据块68-数据块100,以此类推。

在一个例子中,在将数据块存储到osd时,每个数据块占用osd的一个子存储空间,子存储空间的大小与数据块的大小相同,如均为4m。每个osd被占用的子存储空间是连续的,其每个子存储空间用于存储一个数据块。

其中,osd能够提供一个完整存储空间,如10g存储空间。为了存储4m的数据块,则完整的存储空间可以被划分为一个个小存储空间,每个小存储空间可以是4m大小的子存储空间,与数据块大小对应。为了区分方便,可以将该4m大小的存储空间称为子存储空间,每个子存储空间存储一个数据块。

例如,假设osd1被占用的子存储空间的数量为25,osd2被占用的子存储空间的数量为25,osd3被占用的子存储空间的数量为25,osd4被占用的子存储空间的数量为25,则osd1在接收到数据块后,可以从起始空闲地址开始(如osd1的前100个子存储空间被占用时,则起始空闲地址是第101个子存储空间),使用连续25个子存储空间(如第101个子存储空间至125个子存储空间)存储数据块。同理,osd2在接收到数据块后,可以从osd2的起始空闲地址开始,使用连续25个子存储空间存储数据块;以此类推。

步骤305,将数据文件对应的元数据存储到监控服务器。

在一个例子中,在采用上述方式存储数据文件对应的多个数据块后,还可以获取数据文件对应的元数据,并将数据文件对应的元数据存储到监控服务器。

其中,该元数据可以包括但不限于:lun标识、lun标识对应的osd、多个数据块在osd的起始地址、结束地址等,对此元数据不做限制。

其中,客户端可以将数据文件对应的元数据发送给监控服务器,由监控服务器在本地的数据库中存储该元数据。而且,数据库可以单独放置在一个高性能磁盘中,使得数据库不会成为性能瓶颈。因此,仅存储整个数据文件的元数据,大大减少元数据数量,节省元数据占用的存储资源。而且,由于只需要从监控服务器读取整个数据文件的元数据,不用读取大量元数据,从而可以减轻客户端的处理压力,减轻元数据的访问频率和数量,提高集群访问性能,提高元数据的获取效率,减轻元数据管理的复杂度。由于减少整个分布式系统的元数据,并减少磁盘io操作和查表操作,继而提高存储性能。

当需要读取数据文件时,客户端还可以先获取数据文件对应的元数据,并基于所述元数据从各个osd中读取数据文件。例如,基于osd1的起始地址(如第101个子存储空间的起始地址)和结束地址(如第125个子存储空间的结束地址),客户端可以从osd1中读取出25个数据块,以此类推,对此读取过程不做限制。然后,客户端可以将读取的所有数据块组成上述数据文件。

在上述实施例中,各osd在存储数据块时,还可以按照数据块的大小(如4m等),在各osd之间形成数据条带(stripe)。其中,一个数据条带可以占用每个osd的一个子存储空间,且一个子存储空间可以存储一个数据块。

参见图4d所示,为构建数据条带的示意图,在图4d中,为lun0构建3个数据条带,为lun1构建1个数据条带,为lun2构建2个数据条带。在集群视图信息中,可以记录lun对应的osd的起始空闲地址,这个起始空闲地址也是该lun在整个数据条带的起始位置,因此,各osd在存储数据块时,可以根据数据条带的起始位置计算出每个数据块的存储位置。例如,osd0将接收到的第一个数据块,存储到第一个数据条带的起始位置,将接收到的第二个数据块,存储到第二个数据条带的起始位置,以此类推。同理,osd1将接收到的第一个数据块,存储到第一个数据条带的起始位置,以此类推。

参见图4d所示,由于数据块在多个osd的分布是:采用数据紧致排列的方式,即在数据条带内是连续的存储,因此,可以提高数据访问的效率。

上述实施例中,已介绍数据文件的存储过程,实际应用中,可以对分布式系统进行扩容处理或缩容处理,扩容处理是指增加osd的数量,缩容处理是指减少osd的数量。例如,对分布式系统进行扩容处理前,lun1对应osd1、osd3、osd5、osd7,lun2对应osd2、osd4、osd6、osd8,对分布式系统进行扩容处理后,lun3(与扩容前的lun不同)对应osd1、osd3、osd5、osd7、osd9,lun4对应osd2、osd4、osd6、osd8、osd10。又例如,对分布式系统进行缩容处理前,lun1对应osd1、osd3、osd5、osd7,lun2对应osd2、osd4、osd6、osd8,对分布式系统进行缩容处理后,lun3对应osd1、osd3、osd5,lun4对应osd2、osd4、osd6。

其中,扩容/缩容后的lun对应的多个osd均属于存储池,且这多个osd尽量分布在不同机架的不同主机上,其原理可以参见图2,在此不再赘述。

其中,在对分布式系统进行扩容/缩容处理后,集群视图信息会发生变化,监控服务器可以将变化后的集群视图信息发送给客户端,以使客户端根据变化后的集群视图信息确定lun标识对应的osd。为了与扩容/缩容前的处理过程进行区分,将扩容/缩容前的数据文件称为第一数据文件,将lun标识称为第一lun标识,将集群视图信息称为第一集群视图信息,将osd称为第一osd。将扩容/缩容后的数据文件称为第二数据文件,将lun标识称为第二lun标识,将集群视图信息称为第二集群视图信息,将osd称为第二osd。

在图3所示的流程中,已经详细介绍扩容/缩容前的处理流程,下面结合图5所示的流程,对扩容/缩容后的数据存储方法进行说明,该方法可以包括:

步骤501,获取待存储的第二数据文件、第二数据文件对应的第二lun标识。步骤501与步骤301的处理过程类似,在此不再重复赘述。

步骤502,根据第二集群视图信息确定该第二lun标识对应的多个第二osd;其中,所述多个第二osd包括第一osd和扩容osd。

在一个例子中,该第二集群视图信息是从监控服务器获取的,且该第二集群视图信息可以包括但不限于:第二lun标识与第二osd的对应关系。

例如,以扩容为例,在第一集群视图信息中,扩容前的第一数据文件对应的第一lun标识为lun1,lun1对应osd1、osd3、osd5、osd7,在第二集群视图信息中,扩容后的第二数据文件对应的第二lun标识为lun3(与lun1不同),lun3对应osd1、osd3、osd5、osd7、osd9。在第二集群视图信息中,第二osd为osd1、osd3、osd5、osd7、osd9,osd1、osd3、osd5、osd7为第一集群视图信息的第一osd,osd9为扩容osd。

其中,第二集群视图信息包括第二lun标识与第二osd的对应关系、第二osd对应的磁盘容量、第二osd的起始空闲地址等,对此不做限制。

其中,可以将不同集群视图信息作为不同的视图版本,如初始状态的集群视图信息是视图版本1,集群视图信息第一次变化时,集群视图信息是视图版本2,在集群视图信息第二次变化时,集群视图信息是视图版本3,以此类推。

在一个例子中,第二集群视图信息还可以包括每个第二osd的权重因子,对于第二osd包括的第一osd和扩容osd,且扩容osd的权重因子大于第一osd的权重因子。例如,当第二osd为osd1、osd3、osd5、osd7、osd9时,则osd9的权重因子可以大于osd1、osd3、osd5、osd7的权重因子。

步骤503,将第二数据文件拆分成多个数据块,并确定每个数据块对应的第二osd,将数据块发送给对应的第二osd,以使该第二osd存储该数据块。其中,可以预先指定数据块的大小,如数据块的大小为4m,假设第二数据文件的大小是400m,将第二数据文件拆分成100个4m的数据块。这里将第二数据文件拆分成数据块,数据块是第二数据文件中的数据,不包括元数据。

其中,针对“确定每个数据块对应的第二osd”的过程,可以包括但不限于:从第二集群视图信息中获取每个第二osd的权重因子,扩容osd的权重因子大于第一osd的权重因子。为每个数据块分别设置oid,不同数据块的oid不同;采用第二hash算法对数据块的oid进行hash处理,得到hash处理结果,并将hash处理结果对应的第二osd,确定为所述数据块对应的第二osd;其中,第二hash算法用于使权重因子越大的第二osd,对应的数据块数量越多。

针对“为每个数据块分别设置oid”的过程,在将第二数据文件拆分成多个数据块后,多个数据块的序号依次为0、1、2、3等,而这些数据块对应的oid也就依次是0、1、2、3等。例如,从第二数据文件拆分的第一个数据块的oid为0,第二个数据块的oid为1,第三个数据块的oid为2,以此类推。

针对“采用第二hash算法对数据块的oid进行hash处理,得到hash处理结果,并将hash处理结果对应的第二osd,确定为所述数据块对应的第二osd”的过程,可以包括:第二hash算法是基于权重的hash算法,例如,使用数据块的oid对总权重(即各osd的权重之和)进行取余处理,得到hash处理结果(即取余处理的余数)。然后,通过查询余数与osd的对应关系,得到hash处理结果对应的osd,并将该osd确定为该数据块对应的osd。

例如,假设第一osd为osd1、osd2和osd3,扩容osd为osd4,osd1、osd2和osd3的权重因子为1,osd4的权重因子为4,则预先配置余数0-3与osd4的对应关系,余数4与osd1的对应关系,余数5与osd2的对应关系,余数6与osd3的对应关系。基于此,针对oid为0的数据块,由于0对总权重7(4+1+1+1)的取余结果为0,因此,将余数0对应的osd4确定为该数据块对应的osd。针对oid为1的数据块,由于1对总权重7的取余结果为1,因此,将余数1对应的osd4确定为该数据块对应的osd。以此类推。

当然,上述算法只是第二hash算法的示例,在实际应用中,第二hash算法还可以是其它hash算法,对此第二hash算法不做限制,只要第二hash算法能够使权重因子越大的第二osd,对应的数据块数量越多即可。

例如,当osd1、osd2和osd3的权重因子为1,osd4的权重因子为4时,第二hash算法用于使连续的7个数据块,有4个对应osd4,有1个对应osd1,有1个对应osd2,有1个对应osd3。以此类推。

在一个例子中,客户端将数据块发送给对应的第二osd后,第二osd可以存储该数据块,在将数据块存储到第二osd时,每个数据块占用第二osd的一个子存储空间,子存储空间的大小与数据块的大小相同,如均为4m。

其中,第二osd存储数据块的过程,与步骤304的存储类似,不再赘述。

步骤504,将第二数据文件对应的元数据存储到所述监控服务器。

在一个例子中,采用上述方式存储第二数据文件对应的多个数据块后,还可以获取第二数据文件对应的元数据,并将第二数据文件对应的元数据存储到监控服务器。该元数据可以包括但不限于:第二lun标识、lun标识对应的第二osd、多个数据块在第二osd的起始地址、结束地址等,对此不做限制。

其中,步骤504的处理与步骤305的处理过程类似,在此不再重复赘述。

在上述实施例中,由于扩容osd的存储空间较大,而第一osd的存储空间较小,因此,为扩容osd设置较大的权重因子,为第一osd设置较小的权重因子,使得数据块尽量存储到扩容osd,从而在所有osd之间实现负载均衡,使得各osd的访问压力、数据块数量尽可能均衡,均衡分布式文件系统的负载。

而且,虽然第一osd的数据块的数量大于扩容osd的数据块的数量,但是,并不需要将第一osd存储的数据块迁移到扩容osd,而是对需要存储的新数据块进行处理,以使需要存储的新数据块,尽量存储到扩容osd,从而实现负载均衡,即在零数据迁移的基础上,实现数据块的均衡分配。即提供基于集群视图版本的零数据迁移的扩容方案,减少集群扩容过程对系统性能的影响。

上述过程详细介绍了对分布式系统进行扩容时的处理,在对分布式系统进行缩容时,与上述过程类似,其不同之处在于:需要对被缩容的osd的数据块进行迁移,例如,当缩容前的lun1对应osd1、osd3、osd5、osd7,而缩容后的lun3对应osd1、osd3、osd5时,则需要将osd7存储的数据块迁移到osd1、osd3、osd5中,对此迁移方式不做限制,例如,可以将数据块平均迁移到osd1、osd3、osd5中,也可以都迁移到负载最小的osd。

综上所述,在对osd进行扩容、磁盘满、或者异常等情况下,数据块的存储布局发生改变,产生不同的lun,并使用不同的集群视图信息,可以实现零数据迁移,实现数据均衡分配,持续的提供客户服务,不涉及大量数据迁移。而在传统的san存储方式中,无法对osd进行扩容,无法实现零数据迁移。

参见图6a所示,假设在扩容之前已经存储了数据块d0-d4,扩容后的osd为osd0-osd5,则可以将当前的数据块(d5-d10)存储到扩容后的osd0-osd5,在存储过程中,不需要对扩容前的数据块d0-d4进行迁移,从而实现零数据迁移。

参见图6b所示,假设在扩容之前已经存储了数据块d0-d28,且扩容之前的osd0-osd3已经写满,扩容之前的osd4和osd5还未写满,则可以扩容osd6和osd7,可以将当前的数据块(d29-d34)存储到扩容之前的osd4和osd5、扩容后的osd6和osd7,在存储过程中,不需要对扩容前的数据块进行迁移。

参见图6c所示,当需要进行系统扩容时,对于扩容之前已经存储了数据块d0-d28,且扩容之前的osd0-osd3已经写满,扩容之前的osd4和osd5还未写满,则可以扩容osd6和osd7。由于osd0-osd3已经写满,osd0-osd3的权重因子为0,由于osd4和osd5的负载较高,osd4和osd5的权重因子为1,由于osd6和osd7负载较轻,osd6和osd7的权重因子为2。基于此,针对当前的数据块(d29-d34),存储到osd6和osd7的数据块数量,会大于存储到osd4和osd5的数据块数量,不会将数据块存储到osd0-osd3。

参见图6d所示,数据块d0-d11对应lun1,数据块d12-d13对应lun2,数据块d14-d42对应lun3,在此基础上,假设用户删除已创建的lun2,造成存储空间的空洞发生,即数据块d12-d13占用的存储空间产生空洞。基于此,可以使用一个链表,针对当前待存储的数据块d43-d48,可以不是连续条带存放,而是根据链表定位数据块的存储位置,其可以重新利用空闲的存储空间。

在一个例子中,考虑到数据块写入过程中,可能存在数据块写入失败的情况,则可以采用raid机制或者nvdimm(non-volatiledualinlinememorymodule,非易失性双列插入式记忆模块)机制进行处理,保证数据块不丢失。

其中,采用raid(redundantarraysofindependentdisks,独立冗余磁盘阵列)机制进行处理可以是指:采用raid1方式或者raid5方式在osd写入数据块,这样,当某个数据块写入失败时,可以对写入失败的数据块进行恢复,对此恢复过程不再赘述。具体的,通过采用raid方式存储数据块,当某个osd发生故障时,可以避免数据块发生丢失,可以恢复数据块。例如,当数据块所在的子存储空间损坏时,还可以恢复损坏的数据块,可以实现数据的冗余备份(即通过多副本实现冗余的数据分布策略),提供更高的数据可靠性,避免数据丢失导致的不可用问题。而且针对采用raid1的镜像方式、采用raid5的纠删码方式,均可以在提供数据高效访问的同时,提供数据高可靠性。

其中,采用nvdimm机制进行处理可以是指:在数据块成功写入到osd之前,还可以在nvdimm中保存该数据块,只有数据块成功写入到osd之后,才可以从nvdimm中删除该数据块。这样,当某个数据块写入失败时,可以通过nvdimm中存储的数据块进行恢复,从而可以保证数据块的安全性。

在一个例子中,为了实现存储空间的精简配置,可以根据实际的使用需求,为lun分配连续的存储空间。例如,假设lun1需要使用10g的存储空间,并不是一次性为lun1分配10g的存储空间,而是先为lun1分配连续的1gb存储空间,在这1gb存储空间使用完成后,再为lun1分配连续的1gb存储空间,以此类推。这样,可以避免将10g存储空间都分配给lun1后,由于这些存储空间没有被使用所导致的存储资源浪费,从而可以提高存储资源的利用率。

基于与上述方法同样的申请构思,本申请实施例中还提出了一种数据存储装置,可以应用于客户端,如图7所示,为该装置的结构示意图,该装置包括:

获取模块701,用于获取待存储的第一数据文件、所述第一数据文件对应的第一逻辑单元号lun标识;根据第一集群视图信息确定所述第一lun标识对应的多个第一对象存储设备osd;其中,所述第一集群视图信息是从监控服务器获取的,所述第一集群视图信息包括第一lun标识与第一osd的对应关系;

处理模块702,用于将所述第一数据文件拆分成多个数据块;

确定模块703,用于确定每个数据块对应的第一osd;

发送模块704,用于将数据块发送给对应的第一osd,以使所述第一osd存储所述数据块;将所述第一数据文件对应的元数据存储到所述监控服务器。

所述确定模块703,具体用于在确定每个数据块对应的第一osd的过程中,为每个数据块分别设置对象标识符oid,不同数据块的oid不同;采用第一hash算法对数据块的oid进行hash处理,得到hash处理结果,并将所述hash处理结果对应的第一osd,确定为所述数据块对应的第一osd;其中,所述第一hash算法用于使不同第一osd对应的数据块数量的差小于预设阈值。

所述确定模块703,具体用于在确定每个数据块对应的第一osd的过程中,将所述多个数据块划分到n个数据组中,其中,每个数据组中包括至少两个数据块,所述n的取值大于等于第一osd的总数量;采用均衡策略确定每个数据组对应的第一osd,其中,所述均衡策略用于使不同第一osd对应的数据块数量的差小于预设阈值;将数据组对应的第一osd,确定为所述数据组中的至少两个数据块对应的第一osd。

所述获取模块701,还用于获取待存储的第二数据文件、所述第二数据文件对应的第二lun标识;根据第二集群视图信息确定第二lun标识对应的多个第二osd;所述多个第二osd包括第一osd和扩容osd,第二集群视图信息是从监控服务器获取的,且包括第二lun标识与第二osd的对应关系;

所述处理模块702,还用于将所述第二数据文件拆分成多个数据块;

所述确定模块703,还用于确定每个数据块对应的第二osd;

所述发送模块704,还用于将数据块发送给对应的第二osd,以使第二osd存储所述数据块;将所述第二数据文件对应的元数据存储到所述监控服务器。

所述确定模块703,具体用于在确定每个数据块对应的第二osd的过程中,从所述第二集群视图信息中获取每个第二osd的权重因子;其中,所述扩容osd的权重因子大于所述第一osd的权重因子;为每个数据块分别设置oid,不同数据块的oid不同;采用第二hash算法对数据块的oid进行hash处理,得到hash处理结果,并将所述hash处理结果对应的第二osd,确定为所述数据块对应的第二osd;其中,所述第二hash算法用于使权重因子越大的第二osd,对应的数据块数量越多。

本申请实施例中提供的客户端,从硬件层面而言,其硬件架构示意图具体可以参见图8所示。可以包括:机器可读存储介质和处理器,其中:

机器可读存储介质:存储指令代码。

处理器:与机器可读存储介质通信,读取和执行机器可读存储介质中存储的所述指令代码,实现本申请上述示例公开的数据存储操作。

这里,机器可读存储介质可以是任何电子、磁性、光学或其它物理存储装置,可以包含或存储信息,如可执行指令、数据,等等。例如,机器可读存储介质可以是:ram(radomaccessmemory,随机存取存储器)、易失存储器、非易失性存储器、闪存、存储驱动器(如硬盘驱动器)、固态硬盘、任何类型的存储盘(如光盘、dvd等),或者类似的存储介质,或者它们的组合。

上述实施例阐明的系统、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。

为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。

本领域内的技术人员应明白,本申请的实施例可提供为方法、系统、或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本申请实施例可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本申请是参照根据本申请实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可以由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其它可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其它可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

而且,这些计算机程序指令也可以存储在能引导计算机或其它可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或者多个流程和/或方框图一个方框或者多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其它可编程数据处理设备上,使得在计算机或者其它可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其它可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

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