发明内容
本发明要解决上述技术所存在的缺陷,提供一种分布式文件系统虚拟目录及命名空间的实现方法。
本发明解决其技术问题所采用的技术方案:这种分布式文件系统虚拟目录及命名空间的实现方法,主服务器在整个存储网络中建立一个统一的虚拟目录,保存着每一个文件的具体信息,并将文件实际存储的位置和虚拟目录中的地址做映射,屏蔽硬件、操作系统和文件存储结构的差异;从客户端来看,并不知道文件具体存储在哪里,看到整个系统中的文件是按统一的方式存储的,和普通的文件系统没有区别,即为虚拟文件系统;从服务器上保存着存储在此从服务器上文件的相关信息,形成了自己的文件系统。
在建立虚拟目录时,每个文件或者目录保存着相关信息如唯一的ID,名字,创建时间,最后修改时间,文件版本号,是否是目录,父目录的ID等。其中ID是唯一的,每个文件知道它的父目录的ID,父目录可以知道它的上一级目录的ID,这样所有的文件就组成了一个树形结构的虚拟文件系统。
要对虚拟文件系统中的文件进行重命名,删除,以及新建文件夹等操作时,需要先在Master上修改相关文件的信息,在通知存储此文件的Slave修改Slave上的文件信息。在虚拟文件系统中建立命名空间,在虚拟文件系统中进行文件操作时,要通过以下的步骤:
1.为了避免多个用户同时对文件进行修改的冲突,需要保证某一时刻只能有一个用户对文件进行修改操作。在此引入了锁的概念,当一个文件被修改时,可以对此文件进行加锁,表示此文件正在被修改,其余用户不能对他进行修改了。而需要对文件进行修改时,命名空间首先检查要修改的文件是不是正在别的用户修改,如果此文件没有正在被修改则获得该文件的锁,此时其他用户只能有读的权限,而不能对文件进行修改。
2.命名空间检查看是否在同一目录下是否有和此文件同名的文件,若有相同的名字,则提示出错的信息。
3.若通过检查,则启动事务对Master上的文件相关信息进行修改操作。
4.完成后通知存储此文件的从服务器进行相关的修改操作,若同步成功则结束事务,若不成功执行回滚操作,恢复到原来的状态,最后释放锁。
本发明有益的效果是:通过虚拟系统目录方便了用户的操作,文件存储对于用户来说是透明的。通过命名空间链式操作保证了多用户并发访问文件时的一致性,解决了名字冲突问题,取得了良好的效果。通过虚拟文件系统和命名空间的建立,把所有从服务器上的文件组织在了一起,形成了树状结构的虚拟文件系统,用户感觉不到服务器是分布式的,他可以像操作本地文件一样操作虚拟文件系统的文件。而且文件结构是树形的,便于得到虚拟路径。命名空间的建立保证了文件的命名不会出现冲突,解决了多用户并发大规模并发访问时的正确性。
具体实施方式
下面结合附图和实施例对本发明作进一步介绍:
1.1元数据的基本概念
在分布式文件服务器中,元数据用来描述虚拟文件系统中的文件和文件夹的基本信息。元数据可分为文件元数据和文件夹元数据两类,对于文件和文件夹的操作都需要先从元数据服务器上获得元数据,然后完成相关虚拟文件系统操作。
文件和文件夹元数据统一存储在数据库中,元数据包含的内容有虚拟文件ID、文件名或者目录名、创建时间、最后修改时间、是否被删除、是否是目录、是否传输完成、文件大小、文件版本号、父节点ID和描述属性值等内容。Master上文件的元数据如下表所示。Slave上的信息比Master多了文件大小和存储位置两项。
名称 |
可否为NULL |
备注 |
ID |
N |
虚拟文件ID |
NAME |
N |
文件名/目录名 |
名称 |
可否为NULL |
备注 |
CREATE_TIME |
N |
创建时间 |
LAST_MODIFIED_TIME |
N |
最后修改时间 |
IS_REMOVED |
N |
是否被删除 |
IS_DIRECTORY |
N |
是否是目录 |
T_IME_STAMP |
N |
文件版本号 |
PARENT_ID |
Y |
父节点ID |
Master上存储的文件元数据
文件ID在整个分布式文件服务器上是唯一的,系统内部使用ID对文件和文件夹进行操作。在元数据中添加是否为目录的标志位来区分目录和文件,是否被删除的标志位用来支持元数据的恢复操作,是否传输完成表示文件的传输状态,父节点的ID用来记录该文件或目录在虚拟文件系统中的目录层次,文件大小、文件版本号、创建时间、最后修改时间和描述属性值都是虚拟文件系统中文件的一些基本信息。
1.2虚拟文件系统的实现
在Master上保存着所有文件的元数据,通过这些元数据,能得到文件的相关信息,能得到每个目录的子目录,子目录的下一及目录,由此构建出虚拟文件系统。在虚拟文件系统中,每个文件有唯一的虚拟路径,虚拟文件系统实现了从文件实际存储位置到中虚拟路径的映射关系并维护与虚拟文件系统相关的文件元数据。
从图1可见,文件元数据在Master和Slave上都要保存,Slave负责维护本节点上文件的存储和元数据的维护,这样每个Slave都是独立的,通过本地的元数据就可以构建出一个独立的虚拟文件系统,并不需要其他节点和Master的参与。Master负责维护所有参与节点的元数据和同步全局的信息,整个系统中的命名空间信息也是保存在Master上的。每个文件有父目录的ID,形成了一个树形结构的虚拟文件系统。
虚拟文件系统上的元数据对应着文件的信息,因此Master上的元数据不能随意删除,在命名空间中删除一个名字,并不能完全移除元数据信息,必须通过一定的机制保证处在各个Slave上的文件都被删除时才可以删除Master上的元数据。由于系统中节点的变化,删除文件的操作不一定立刻在文件系统中实现。
虚拟文件系统同时提供了授权认证和日志的功能,对文件元数据的访问需要先通过权限的认证,保护了文件的安全性。日志功能记录了命名空间对文件元数据的各项操作,在发生系统崩溃时,可以通过日志文件快速恢复元数据的一致性。虚拟文件系统还包含了元数据的Cache,一些最近访问的路径名字和元数据的映射关系缓存在这里。
1.3命名空间的实现
命名空间服务是虚拟文件系统模块中最关键的一个部分,负责着文件名字的一致性检查并且解决了大规模用户并发访问时的问题。
1.3.1锁的具体实现
锁的类型可以分为文件锁,递归锁,多重锁。文件锁是对一个文件的虚拟路径名称加的锁,递归锁是对文件夹及其文件夹下所有的路径名称加的锁,修改文件夹的元数据需要加上递归锁。多重锁用来一次获得多个文件锁或递归锁,在修改一个名字的时候,要同时获得修改前和修改后名字的锁,这个时候要使用多重锁。
在本专利中,创建了一个全局锁池,它提供锁的获得,锁的释放和检测虚拟路径名字是否被锁这些基本的操作,锁池为整个命名服务维护一个唯一的锁的列表,对于锁的列表的操作必须是同步的操作,即每一时刻只能有一个线程对它进行访问。加锁是针对虚拟路径实现的,当对某个文件进行访问时,把他的虚拟路径放在锁池里,当其他线程访问此文件时,发现这个文件的路径已经在锁池里了,即这个文件已经被加锁了,就不能对这个文件进行修改。若一个目录被放在锁池里,则他的所有子文件也被进行了加锁。
1.3.2命名空间服务的一致性
元数据服务器Master并不存储文件,它的任务是维护系统全局命名空间的一致性,既保证同一目录下,两个不同的文件不能有相同的名字。因此元数据服务器Master上的信息将保持最新。
分布式文件服务器的命名空间具有以下几个基本操作:
(1)判断一个名字是否被占用
在命名空间中查找该名字对应的元数据,检查是否处于可用状态。
(2)添加一个名字
在添加名字前,通过命名空间检查,当该名字对应的元数据不存在并且祖先名字存在时,创建该名字的元数据,在命名空间中建立对应关系。
(3)删除一个名字
递归删除所有的子名字,命名空间中相应元数据设置为不可用状态。
(4)更改一个名字
在更改名字前,通过命名空间检查,当该名字对应的元数据被占用并且新名字没有被占用时,更新相应的文件元数据。
1.3.3命名空间服务的原子性
在对分布式文件服务器并发的集中式访问时,需要保证命名空间基本操作的原子性。所谓操作的原子性是指此操作或者成功或者失败,当操作失败时是文件的信息保持原来的状态,不能有改动,不允许出现一部分信息修改成功而另一部分修改不成功的情况。
在修改一个虚拟路径的元数据时,要保证没有其他进程对这个路径上的元数据进行修改。为了保证命名空间服务并发操作的原子性,这里使用锁来实现并发控制。当文件被某个进程加锁后,其余进程不能对文件的信息进行修改,直到这个锁被释放。其中所分为锁和递归锁,普通的锁指对文件加锁,递归锁指对文件夹以及文件夹的所有子文件都加锁。
1.在命名空间中添加一个名字时,先要获得这个路径名字的锁,其他线程由于得不到锁,便不能完成添加操作,这样就保证同时只有一个线程在进行添加操作。加锁前要检查这个命名是否已经存在,名字没有被占用才可以添加。添加名字完成后,释放这个命名锁。
2.在命名空间中对一个文件路径名字的删除和修改操作只需要获得这个文件路径名字的锁,对于文件夹路径名字的操作将要获得一个递归锁,对于这个名字和它所有的子孙对应的文件和文件夹名字都加上锁。
1.3.4文件操作的实现
文件操作分为上传文件,下载文件和修改文件信息如重命名,删除等的操作。
1.如图3,客户端在进行修改文件操作时,先向Master发送请求,Master根据虚拟文件系统中的命名空间服务找到文件对应的一个元数据信息,获得文件名锁,然后进行命名空间一致性检查,若通过检查,则启动事务修改本地元数据,这个修改首先在Master上完成,之后同步到具有这个名字信息的Slave上。若同步成功则关事务,若不成功执行回滚操作,最后释放锁,由此保证了文件操作的原子性,解决了大规模用户并发访问的问题。
2.客户端在下载文件时,也要先连接到Master上,根据虚拟文件系统中的命名空间服务找到文件对应的一个元数据信息,通过这个元数据信息在Slave上查找到文件的实际存储位置,客户端和Slave之间完成文件数据的传输。由于多个Slave的存在,可以将文件的副本保存在多个Slave上,客户端可以同时从多个Slave进行文件下载。
3.客户端要进行文件上传时,通过Master上的负载平衡算法找到一个最优的Slave,先在Master和Slave上的命名空间中添加这个文件的名字,创建好文件元数据,之后再处理文件的数据传输,这个文件名字就同时出现在了Master和Slave的命名空间中。要修改一个名字时,通过Master的全局命名空间可以查找到多个Slave上的这个文件的名字,这个修改首先在Master上完成,之后同步到具有这个名字信息的Slave上。
上述实施例用来解释说明本发明,而不是对本发明进行限制,在本发明的精神和权利要求的保护范围内,对本发明作出的任何修改和改变,都落入本发明的保护范围。