具体实施方式
参阅图1,本发明实施例提供一种文件管理方法,其包括:
101、将待存储的文件分割成多个数据块。
具体的,当要存储一个文件时,可以按照设定分割规则将该待存储文件分割为多个数据块,其中,数据块的个数必须小于或等于存储节点的数目。
102、根据存储节点的卷号,将所述多个数据块分别存储到不同存储节点上具有相同前缀值的卷中,其中,存储节点的卷号包括:对应存储节点的索引和所述卷所对应的前缀值,所述前缀值用于区别同一存储节点上不同的卷。
由于前缀值用于区别同一存储节点上不同的卷,则利用存储节点的索引和卷所对应的前缀值组成的卷号就能唯一标识存储系统中的卷了。
在步骤102之前,还包括:为每个存储节点构建前缀树,其中,前缀树是树型结构,包括M层节点,第0层为根节点,第1到M-1层为叶子节点,前缀树中第i层节点的值为长度为i的二进制数(其中,i大于或者等于1),长度为N的子节点的二进制数的前N-1位是所述子结点的父结点的二进制数,最后一位是0或者1。其中,前缀树中没有子节点的叶子节点的值为前缀值。
其中,构建前缀树的过程具体包括:将前缀树的根设为0,控制其逐层进行分裂,即第一层叶子节点的值为0、1;若第一层的各叶子节点再进行分类,即0分裂为00和01,1分裂为10和11,则第二层叶子节点的值为00、01、10、11等。
其中,本发明实施例及后续实施例中的存储系统可以指分布式文件系统或者集群系统。本发明实施例各步骤的执行主体可以是服务器。
本发明实施例中存储节点的卷号包括:对应存储节点的索引和所述卷所对应的前缀值,根据卷号将待存储文件分割出的多个数据块分别存储到不同存储节点上具有相同前缀值的卷中,从而使每个数据块无需在不同的存储节点上存储多个副本,因此本发明实施例提供的文件管理方法不仅节省存储空间,且便于文件的后续管理。
为了使本发明实施例更加清楚明白,请参阅图2,如下实施例将详细介绍本发明实施例提供的文件管理方法,该方法具体包括:
201、服务器对各存储节点中的磁盘进行分区和格式化,在分区的基础上构建卷,为每个存储节点构建前缀树,所述前缀树中的前缀值用于区别同一存储节点上不同的卷;为各存储节点中的卷配置卷号,所述卷号包括:对应存储节点的索引和所述卷所对应的前缀值。
该步骤中构建前缀树的过程包括:将前缀树的根设为0,控制其逐层进行分裂,即第一层叶子节点的值为0、1,若第一层的叶子节点都进行分裂,则第二层叶子节点的值为00、01、10、11,若第二层的叶子节点都进行分裂,则第三层叶子节点的值为000、001、010、011、100、101、110、111,若仅将第二层叶子节点00和11进行分裂,则前缀树结构如图3所示。
具体的,为各存储节点上的每个卷分配卷号,该卷号在存储系统中可以唯一标识该卷,该卷号包括:存储节点的索引和该卷对应的前缀值。例如,存储系统中有4个存储节点,如果每个存储节点上只有一个卷,则各存储节点的卷号如下表1所示:
存储节点0 |
存储节点1 |
存储节点2 |
存储节点3 |
0:00 |
0:01 |
0:02 |
0:03 |
表1
其中,冒号的前面一位为前缀值,冒号的后面两位为存储节点的索引,存储节点的索引即为该存储节点在存储系统中的编号。
如果存储系统中有4个存储节点,每个存储节点上有两个卷,则各存储节点的卷号如下表2所示:
存储节点0 |
存储节点1 |
存储节点2 |
存储节点3 |
00:00 |
00:01 |
00:02 |
00:03 |
01:00 |
01:01 |
01:02 |
01:03 |
表2
其中,冒号的前两位为前缀值,冒号的后两位为存储节点的索引。
202、服务器确定各存储节点上前缀值相同的卷属于同一个超级卷,并记录超级卷的信息,该超级卷信息包括:超级卷标识和该超级卷中的卷的卷号。
具体的,服务器将各存储节点上前缀值相同的卷划到同一个超级卷中,该超级卷的容量等于这些前缀值相同的卷的容量之和。如图4所示,第一个前缀树是为存储节点0构建的前缀树,第二个前缀树是为存储节点1构建的前缀树,第三个前缀树是为存储节点2构建的前缀树,三个前缀树中的前缀值分别对应相应存储节点上的卷,将三个存储节点上具有相同前缀值的卷划到一个超级卷中,如图4中的虚框所示。相应的,记录的超级卷信息如下表3所示:
|
存储节点0 |
存储节点1 |
存储节点2 |
超级卷000 |
000:00 |
000:01 |
000:02 |
超级卷001 |
001:00 |
001:01 |
001:02 |
超级卷110 |
110:00 |
110:01 |
110:02 |
超级卷111 |
111:00 |
111:01 |
111:02 |
超级卷01 |
01:00 |
01:01 |
01:02 |
超级卷10 |
10:00 |
10:01 |
10:02 |
表3
表3中的第一列为超级卷标识,000:00、000:01、000:02分别为三个存储节点上属于超级卷000的卷,同理10:00、10:01、10:02分别为三个存储节点上属于超级卷10的卷。
203、服务器接收待存储的文件,将待存储的文件分割成多个数据块,并控制所分割的数据块数目小于或者等于存储系统中存储节点的个数。
具体的,将待存储文件分割成多个数据块具体的方式可以是:采用RAID-5(Redundant Array of Independent Disk,独立冗余磁盘阵列)、RAID-6或者Erasure Code(纠删码)等方法将文件进行条带化,得到多个数据块。
204、将多个数据块分别存储到同一超级卷的各卷中。
具体的,可以先根据待存储文件计算哈希值,具体的,可以是根据待存储文件的内容计算哈希值,确定哈希值的前N位为待写入的超级卷标识,其中,N为自然数,具体位数可以根据情况进行设定,可以是2位、3位、4位、8位等,具体可以采用MD5(Message Digest Algorithm,消息摘要算法)、SHA-1(HashAlgorithm,哈希算法)、SHA-128等算法计算哈希值,然后将该待存储文件分割成的多个数据块分别存储到该超级卷的各卷中。以获得的哈希值的前3位为待写入的超级卷的标识为例,假定计算的哈希值前3位为001,确定该001为待写入的超级卷标识,则将各数据块存储到卷号为001:00、001:01和001:02的卷中,这三个卷分别位于存储节点0、1、2上。其中,将多个数据块分别存储到该超级卷的各卷中时要保证超级卷中的一个卷只能存储一个数据块,以便后续当存储节点出现故障时,能够利用其他存储节点卷中的数据内容恢复出该故障节点的卷中的数据内容。
本发明实施例通过构建前缀树和为各存储节点分配包括前缀值和存储节点索引的卷号,以便将不同存储节点上具有相同前缀值的卷划为一个超级卷,在存储文件时,将待存储文件分割出的多个数据块分别存储到不同存储节点上具有相同前缀值的卷中,即将一个待存储文件存储到一个超级卷中,不仅节省存储空间,且便于文件的后续管理。
后续需要读文件时,根据文件的哈希值确定该文件所存储的超级卷,然后从超级卷中的各卷读取数据内容。
当有新的应用需要多个超级卷时,需要进行超级卷分裂,参阅图5,如下本发明实施例提供一种超级卷分裂的方法,该方法具体包括:
501、服务器接收第一存储节点发送的卷分裂请求消息,所述卷分裂请求消息携带第一前缀值,所述第一前缀值为第一存储节点请求分裂的卷的前缀值。
当某个存储节点出现新的应用需要多个卷,想对现有的某个卷进行分裂时,其可以向服务器发送卷分裂请求消息,该卷分裂请求消息携带该存储节点所请求分裂的卷的前缀值。
502、服务器将与各存储节点对应的前缀树中与第一前缀值对应的叶子节点进行分裂,得到两个新前缀值,将第一前缀值对应的卷的卷号分别更新为两个卷号,这两个卷号中分别包括一个新的前缀值。其中,该步骤中的各存储节点是卷号中具有所述第一前缀值的叶子节点。
由于服务器为每个存储节点都创建了前缀树,则该步骤中需要将每个前缀树中的第一前缀值对应的叶子节点进行分裂,则相应的得到两个叶子节点,这两个叶子节点分别对应两个新前缀值,具体的,是通过在第一前缀值的末尾分别增加一个值为0的比特位和增加一个值为1的比特位得到两个新前缀值,根据分裂结果,将第一前缀值对应的卷的卷号更新为两个卷号,这两个卷号的前缀值为上述两个新前缀值。如下举例说明,假定第一存储节点(可以假定其为表4中的存储节点1)请求分裂前缀值为01的卷,则服务器将各存储节点的前缀树中前缀值01对应的叶子节点进行分裂,相应的得到两个叶子节点,这两个叶子节点的前缀值分别为010和011,然后根据分裂结果,更新超级卷信息,更新超级卷信息包括更新超级卷标识和存储节点的卷号,比如将超级卷标识01更新为010和011,将存储节点0的卷号01:00更新为010:00和011:00,具体如表4所示。
|
存储节点0 |
存储节点1 |
存储节点2 |
超级卷000 |
000:00 |
000:01 |
000:02 |
超级卷001 |
001:00 |
001:01 |
001:02 |
超级卷110 |
110:00 |
110:01 |
110:02 |
超级卷111 |
111:00 |
111:01 |
111:02 |
超级卷010 |
010:00 |
010:01 |
010:02 |
超级卷011 |
011:00 |
011:01 |
011:02 |
超级卷10 |
10:00 |
10:01 |
10:02 |
表4
503、服务器向各存储节点发送指示卷分裂的消息,所述指示卷分裂的消息包括对应存储节点更新后的两个卷号和指示对应存储节点将第一前缀值所对应的卷分裂成两个卷的指示信息。
后续各存储节点接收到指示卷分裂的消息之后,将第一前缀值所对应的卷分裂成两个卷,其中,步骤502中所分裂成的两个卷的卷号就是所述指示卷分裂的消息中携带的卷号,其他存储节点也会进行类似的处理。这样就将一个超级卷分裂成两个超级卷,如图6A和6B所示,图6A示出了分裂前的超级卷结构,图6B示出了分裂后的超级卷结构。
需要说明的是,步骤501为可选步骤,当出现新的应用需要多个卷时,可以由服务器决定将某个卷进行分裂。
本发明实施例提供的超级卷分裂方法可以实现超级卷的动态分裂,以便使用新的应用。
当有新的存储节点加入超级卷时,可能导致进行卷的数据进行迁移,即在同一超级卷中进行数据迁移,请参阅图7,本发明实施例提供一种数据迁移方法,该方法具体包括:
701、服务器向需要进行数据迁移的源存储节点发送第一迁移指示消息,该第一迁移指示消息包括:目标存储节点标识和第二前缀值,其中,第二前缀值为源存储节点要进行数据迁移的卷所对应的前缀值;服务器向需要接收迁移的数据的目标存储节点发送第二迁移指示消息,该第二迁移指示消息包括:第二前缀值。
其中,第一迁移指示消息用于指示源存储节点向目标存储节点发送第二前缀值对应的本地卷中的数据;第二迁移指示消息用于指示目标存储节点接收源存储节点迁出的数据并存入第二前缀值对应的本地卷中。
702、源存储节点收到第一迁移指示消息之后,向目标存储节点发送数据迁移请求消息。
703、目标存储节点收到数据迁移请求消息之后,将第二前缀值对应的本地卷设置为“傀儡卷”,目标存储节点向源存储节点发送针对数据迁移请求消息的响应消息,该响应消息用于通知源存储节点该目标存储节点已做好接收数据准备。
该步骤中,将本地卷设置为“傀儡卷”的方式为:将该本地卷设置为受保护状态,此时,该卷不可移动,且不能读写,避免在后续接收数据期间系统对“傀儡卷”中的数据进行读写,防止读写错误。
704、源存储节点接收到响应消息后,将第二前缀值对应的本地卷中的数据向目标存储节点发送。
705、目标存储节点接收源存储节点发送的数据并将数据存入第二前缀值对应的本地卷中,在接收完成后,将“傀儡卷”激活,目标存储节点向源存储节点发送通知消息,该消息用于通知源存储节点数据迁移完成。
该步骤中将“傀儡卷”激活的方式为:取消该卷的受保护状态,以后系统可以对该卷中的数据进行读写。
其中,设置该卷为可移动即为设置该卷为可读写状态。
706、源存储节点收到通知消息之后,删除第二前缀值对应的本地卷中的数据。
图8示出了数据迁移的过程,其将存储节点3中卷号为00:3的卷中的数据迁入存储节点4上的卷号为00:4的卷中。
上述实施例提供的数据迁移方法能够在同一超级卷内实现数据的迁移,由于在同一超级卷内进行数据迁移,可便于存储节点故障时的数据恢复,提高数据的安全性。
当某个存储节点发生故障时,会导致该节点上的所有数据丢失,为了恢复出故障存储节点上的数据,请参阅图9,本发明实施例提供一种数据恢复方法,该方法具体包括:
901、服务器通过心跳消息发现某个存储节点故障,选择用于数据恢复的目标存储节点。
902、服务器向目标存储节点发送数据恢复请求消息。
903、目标存储节点接收到数据恢复请求后,确定用于接收数据的卷,并将该卷设置为“傀儡卷”,向服务器发送针对该数据恢复请求消息的响应消息,响应消息包括所确定的卷信息,该响应消息用于通知服务器该目标存储节点已准备好接收数据。其中,卷信息包括:卷的ID、容量及所属的存储节点等信息。
具体的,目标存储节点收到数据恢复请求消息后,检查本地剩余存储空间大小,如果剩余存储空间达到目标存储节点预先设定的可接收数据的阈值,则将剩余存储空间中不属于任何超级卷中的一个卷设置为“傀儡卷”,该“傀儡卷”用于接收后续恢复出的数据。
其中,将一个卷设置为“傀儡卷”的方式为:将该卷设置为受保护状态,此时,该卷不可移动,且不能读写,避免在后续接收数据期间系统对“傀儡卷”中的数据进行读写,防止读写错误。
904、服务器收到响应消息后,将系统状态设置为恢复状态,读取除故障存储节点以外的其他存储节点中具有相同前缀值的卷中的数据,根据所读取的数据恢复出故障存储节点上具有相同前缀值的卷中的数据,根据目标存储节点确定的卷信息,将恢复出的数据存储到目标存储节点中的相应卷中,然后将系统状态设置为正常。
其中,故障存储节点和其他存储节点中具有相同前缀值的卷分别存储有同一文件的不同数据块。
905、目标存储节点在数据接收完成后,将“傀儡卷”激活。
该步骤中将“傀儡卷”激活的方式为:取消该卷的受保护状态,以后系统可以对该卷中的数据进行读写。
本发明实施例在存储节点故障时,可以利用同一超级卷中其他存储节点的卷中的数据恢复出故障存储节点上的数据,提高数据的安全性。
图10示出了数据恢复的过程,假定存储节点3故障,将存储节点3上卷号为00:3中的数据恢复出并存储到存储节点2中。
参阅图11,本发明实施例提供一种服务器,其包括:
分割单元1101,用于将待存储的文件分割成多个数据块;
写入单元1102,用于根据各存储节点的卷号,将所述多个数据块分别存储到不同存储节点上具有相同前缀值的卷中,其中,存储节点的卷号包括:对应存储节点的索引和所述卷所对应的前缀值,所述前缀值用于区别同一存储节点上不同的卷。
在一种实现方式中,为了实现超级卷内的数据迁移,服务器还包括:发送单元1103,用于向源存储节点发送第一迁移指示消息,所述第一迁移指示消息包括:目标存储节点标识和第二前缀值,所述第二前缀值为源存储节点要进行数据迁移的卷所对应的前缀值,所述第一迁移指示消息用于指示源存储节点向目标存储节点发送所述第二前缀值对应的本地卷中的数据;向目标存储节点发送第二迁移指示消息,所述第二迁移指示消息包括:第二前缀值,所述第二迁移指示消息用于指示目标存储节点接收源存储节点迁出的数据并存入第二前缀值对应的本地卷中。
在一种实现方式中,当存储节点故障时,为了恢复出存储节点上的数据,该服务器还包括:选择单元1105,用于当存储有所述文件分割成的数据块的存储节点故障时,选择用于接收故障的存储节点上的数据的目标存储节点;发送单元1103,用于向所述目标存储节点发送数据恢复请求消息;接收单元1104,用于接收目标存储节点发送的针对所述数据恢复请求消息的响应消息;所述响应消息中携带所述目标存储节点确定接收数据的卷信息;恢复单元1106,用于读取除故障存储节点以外的其他存储有所述文件分割成的数据块的存储节点中具有相同前缀值的卷中的数据,根据所读取的数据恢复出故障存储节点上具有相同前缀值的卷中的数据;此时写入单元1102,还用于根据所述目标存储节点确定的接收数据的卷信息,将恢复单元恢复出的数据存储到目标存储节点中的相应卷中。
在一种实现方式中,所述写入单元1102用于根据文件的哈希值的前N位获得前缀值,将多个数据块分别存储到所获得的前缀值所对应的多个存储节点的卷中,其中,N为自然数。
在一种实现方式中,该服务器还包括:构建单元1108,用于为每个存储节点构建前缀树,不再进行分裂的叶子节点的值为前缀值,即没有子节点的叶子节点的值为前缀值;其中,所述前缀树中的前缀值用于区别同一存储节点上不同的卷;卷号分配单元1109,用于为各存储节点中的卷配置卷号,所述卷号包括:对应存储节点的索引和所述卷所对应的前缀值。
在一种实现方式中,为了实现卷分裂,该服务器还包括:
分裂单元1107,用于当各存储节点上第一前缀值对应的卷需要分裂时,将各存储节点中与第一前缀值对应的卷的卷号分别更新为两个卷号,所述两个卷号中的前缀值是通过在第一前缀值的末尾增加一个值为0的比特位和增加一个值为1的比特位得到的两个新前缀值;具体的,是将与各存储节点对应的前缀树中与第一前缀值对应的卷的卷号分别更新为两个卷号。
具体的,分裂单元是将构建单元1108构建的每个前缀树中的第一前缀值对应的叶子进行分裂,则相应的得到两个叶子,这两个叶子分别对应两个新前缀值。
发送单元1103,用于向各存储节点发送指示卷分裂的消息,所述指示卷分裂的消息包括对应存储节点更新后的两个卷号和指示对应存储节点将所述第一前缀值所对应的卷分裂成两个卷的指示信息,其中,对应存储节点所分裂成的两个卷的卷号就是所述指示卷分裂的消息中携带的对应存储节点更新后的卷号。
在一种实现方式中,服务器是接收到某个存储节点的卷分裂请求之后进行卷分裂的,此时该服务器还包括:接收单元1104用于接收第一存储节点发送的卷分裂请求消息,所述卷分裂请求消息携带第一前缀值,所述第一前缀值为第一存储节点请求分裂的卷的前缀值;所述发送单元1103具体用于接收到所述卷分裂请求消息之后,向各存储节点发送指示卷分裂的消息。
需要说明的是,上述几种实现方式的方案可以结合使用,不影响本发明的实现。
本发明实施例中存储节点的卷号包括:对应存储节点的索引和所述卷所对应的前缀值,根据卷号将待存储文件分割出的多个数据块分别存储到不同存储节点上具有相同前缀值的卷中,不仅节省存储空间,且便于文件的后续管理。
参阅图12,本发明实施例提供一种存储系统,其包括:服务器1201和多个存储节点1202,
服务器1201的结构和功能请参阅图11所示实施例以及方法实施例部分,在此不再赘述;
存储节点1202,用于存储数据块。
本发明实施例中存储节点的卷号包括:对应存储节点的索引和所述卷所对应的前缀值,根据卷号将待存储文件分割出的多个数据块分别存储到不同存储节点上具有相同前缀值的卷中,不仅节省存储空间,且便于文件的后续管理。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,例如只读存储器,磁盘或光盘等。
以上对本发明实施例所提供的文件管理方法、设备及存储系统进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。