掌桥专利:专业的专利平台
掌桥专利
首页

云存储分布式文件系统

文献发布时间:2023-06-19 09:33:52


云存储分布式文件系统

技术领域

本文公开的主题总体涉及用于在云存储系统中执行分布式事务的方法、系统和程序。

背景技术

云存储是数据存储的模型,其中数字数据被存储在由云存储提供商托管的物理存储设备中体现的逻辑存储池中。云存储系统可以包括联网的计算资源的集合(包括存储设备、服务器、路由器等),计算资源是可配置、可共享的,提供数据安全性,并且在因特网上向用户设备提供对云存储的访问。云存储系统使用户能够针对基本上任何持续时间存储大量的数据。云存储系统客户可以随时随地访问他们的数据,并且为他们使用和存储的内容付费。可以使用本地和地理复制两者来持久存储云存储中存储的数据,以有助于灾难恢复。

一些存储系统提供了平面存储结构,其中简单的对象被存储在容器中。这些对象有时被称为团块(blob,最初从二进制大对象(Binary Large Object)派生),团块是指被存储在数据库中的数据块,并且团块可以包括图像、视频的帧、视频、可读文档等。为了访问这些对象,用户提供账户、容器的名称和团块标识符。但是,对于希望基于其应用来组织其对象的一些用户,这种简单的结构可能没有用。

用户可以创建自己的组织方案,诸如通过按照团块的名称来组织团块,然后基于名称来执行过滤。但是,这种方案对于文件系统工作负载来说通常是不够的,并且简单的操作(诸如,重命名对象)可能需要数千甚至上百万以上的操作来重命名操作。

传统的大数据和分析应用已经迫使客户针对其数据的不同用例和协议用法创建了许多数据仓,这不仅需要管理大量数据仓,而且还需要在它们之间复制数据以及管理所有这些副本,这大大增加了客户实现的成本和复杂性。

附图说明

附图中的各个附图仅图示了本公开的示例实施例,并且不能被认为限制其范围。

图1是根据一些示例实施例的用于多协议云存储系统的架构的图。

图2是根据示例实施例的包括命名空间服务的存储系统的框图,命名空间服务用于将文件系统命令从分层命名空间映射到平面命名空间。

图3图示了根据一些示例实施例的用于存储流的结构。

图4图示了根据一些示例实施例的用于平面存储系统和分层存储系统的不同分层。

图5图示了根据一些示例实施例的前端组件栈。

图6图示了根据一些示例实施例的存储系统对请求的处理。

图7示出了根据一些示例实施例的分层目录结构中的路径和文件的示例。

图8示出了根据一些示例实施例的与分层目录结构相对应的分层命名空间拓扑。

图9示出了根据一些示例实施例的覆盖有路径和文件名称的分层命名空间拓扑。

图10示出了根据一些示例实施例的用于实现分层命名空间服务的示例架构。

图11示出了根据一些示例实施例的示例主目录块表。

图12示出了根据一些示例实施例的包括物理节点和虚拟节点的分层命名空间服务的框图。

图13示出了根据一些示例实施例的虚拟节点的框图。

图14示出了根据一些示例实施例的分层命名空间服务的框图,其中虚拟节点将命令转发给管理在该命令中标识的实体块的虚拟节点。

图15图示了根据一些示例实施例的存储器表中的条目的状态

图16图示了根据一些示例实施例的快照读取操作。

图17图示了根据一些示例实施例的只读的局部阶段操作。

图18图示了根据一些示例实施例的在阶段1期间准备行的操作。

图19图示了根据一些示例实施例的快照写入操作。

图20图示了根据一些示例实施例的用于提交事务记录的阶段2。

图21图示了根据一些示例实施例的提交通知。

图22示出了根据一些示例实施例的用于团块FS(文件系统)API的文件系统操作。

图23示出了根据一些示例实施例的用于团块FS API的文件和目录操作。

图24示出了根据一些示例实施例的样本团块存储命令。

图25示出了根据一些示例实施例的样本团块FS命令。

图26是根据一些示例实施例的用于在具有分层命名空间的云存储系统中执行分布式事务的方法的流程图。

图27是根据一些示例实施例的用于提供对云存储系统的多协议访问的方法的流程图。

图28是根据一些示例实施例的用于基于团块存储在云存储系统上提供文件系统功能的系统。

图29是图示机器的示例的框图,在该机器上或通过该机器可以实现或控制本文描述的一个或多个示例过程实施例。

具体实施方式

示例方法、系统和计算机程序涉及在具有分层命名空间的云存储系统中执行分布式事务。示例仅代表可能的变化。除非另有明确说明,否则组件和功能是可选的并且可以被组合或细分,并且操作可以在顺序上变化或被组合或被细分。在以下描述中,出于解释的目的,阐述了许多具体细节以提供对示例实施例的透彻理解。然而,对于本领域的技术人员将明显的是,可以在没有这些具体细节的情况下实践本主题。

一些云存储系统将文件系统对象存储在平面全局命名空间中。但是,许多大数据和数据分析应用被设计成将数据存储在分层命名空间中。例如,许多大数据和数据分析应用被配置成与Apache

为了实现在使用平面命名空间的云存储系统中使用分层目录结构,本文公开的实施例提供了分层命名空间服务,以提供用于分层结构和用于平面对象存储结构的文件系统操作,同时针对两种类型的服务使用相同的基础对象存储层。这实现了多模云存储服务,多模云存储服务可以在不同接口下被访问,但是多个接口访问相同的基础数据。

平面命名空间(FN)和分层命名空间(HN)两者都有用。在一些场景中,FN具有成本和性能优势,而HN具有功能、语义和不同性能的优势。提供FN和HN两者向客户提供了灵活性,以便为其工作负载和应用选择最佳解决方案。

本文提出的实施例实现了云存储系统的分层命名空间特征,其在本文中被称为“团块FS”。团块FS与在本文中被称为“团块SS”的团块存储系统共存。团块SS和团块FS两者访问相同的基础团块对象。分层命名空间添加了单节点分区事务支持和多节点分区分布式事务支持两者,并且分布式事务完全灵活,以将任何类型的命名空间操作组合在一起。

与一些类型的云存储(例如,团块存储)不同,传统上,分层命名空间不水平扩展,例如,它们只向上扩展至特定限制。传统上,这是由于必须将命名空间数据结构保留在存储器中,并且无法扩展命名空间的计算和事务方面。通常的文件系统确实如此。

团块FS被设计成进行水平扩展,以用于文件系统解决方案,就像用户习惯了团块存储系统一样。单节点分区事务用于基本操作。为了使单个存储账户或甚至存储账户内的单个目录能够水平扩展,使操作(例如“重命名目录”、“删除目录”等)能够以分布式方式跨节点和分区操作。高度一致的分布式事务用于支持这些类型的文件系统操作,同时提供真正的水平可扩展性。

实施例在相同数据集上提供团块SS和团块FS接口,从而消除了复制数据和创建数据仓的需求。鉴于文件系统和对象存储是在云存储上进行大数据和分析的常用接口中的两个常用接口,因此同时支持这两个接口使得大多数场景都能够利用这种灵活性的优势。

在一个实施例中,提供了一种方法。该方法包括从用户设备接收请求,该请求包括将由云存储系统执行的操作,该请求用于操作的原子执行。方法还包括标识用于执行操作的节点。每个节点具有相应的时钟,控制至少一个操作的执行的状态,并且具有用于控制对云存储系统中的实体(实体是文件或目录之一)的更新的存储器表的至少一部分。方法还包括由节点中的每个节点处理相应的操作。处理一个操作还包括:如果该节点是处理中的第一节点,则将提交时间戳(CS)设置为该节点中的时钟的值;以及如果该节点不是第一节点,并且该节点中的时钟的值小于CS的当前值,则等待该节点中的时钟的值达到CS的当前值;以及基于该节点中的时钟的值来更新CS的当前值。方法还包括:基于CS的当前值来更新存储器表;利用CS的最终值来在云存储系统中提交请求的原子执行;以及将请求的状态返回给用户设备。

在另一个实施例中,系统包括具有指令的存储器和一个或多个计算机处理器。指令在由一个或多个计算机处理器执行时,使得一个或多个计算机处理器执行多个行动,行动包括:从用户设备接收请求,该请求包括将由云存储系统执行的操作,该请求用于操作的原子执行;标识用于执行操作的节点,每个节点具有相应的时钟,每个节点控制至少一个操作的执行的状态,并且每个节点具有用于控制对云存储系统中的实体的更新的存储器表的至少一部分,实体是文件或目录之一;由节点中的每个节点处理相应的操作,其中处理一个操作还包括:如果该节点是处理中的第一节点,则将提交时间戳(CS)设置为该节点中的时钟的值;以及如果该节点不是第一节点,并且该节点中的时钟的值小于CS的当前值,则等待该节点中的时钟的值达到CS的当前值;以及基于该节点中的时钟的值来更新CS的当前值;基于CS的当前值来更新存储器表;以及利用CS的最终值来在云存储系统中提交请求的原子执行;以及将请求的状态返回给用户设备。

在又一个实施例中,机器可读存储介质(例如,非暂态存储介质)包括指令,当该指令由机器执行时,使得该机器执行以下操作:从用户设备接收请求,该请求包括将由云存储系统执行的操作,该请求用于操作的原子执行;标识用于执行操作的节点,每个节点具有相应的时钟,每个节点控制至少一个操作的执行的状态,并且每个节点具有用于控制对云存储系统中的实体的更新的存储器表的至少一部分,实体是文件或目录之一;由节点中的每个节点处理相应的操作,其中处理一个操作还包括:如果该节点是处理中的第一节点,则将提交时间戳(CS)设置为该节点中的时钟的值;以及如果该节点不是第一节点,并且该节点中的时钟的值小于CS的当前值,则等待该节点中的时钟的值达到CS的当前值;以及基于该节点中的时钟的值来更新CS的当前值;基于CS的当前值来更新存储器表;以及利用CS的最终值来在云存储系统中提交请求的原子执行;以及将请求的状态返回给用户设备。

在另一个实施例中,提供了一种方法。方法包括由云存储系统提供第一应用编程接口(API),该云存储系统将数据存储在被组织在容器内的团块中。此外,方法包括由云存储系统提供第二API,第一API和第二API提供用于平面命名空间和用于分层命名空间的操作以用于访问数据,平面命名空间用于基于账户、容器和团块标识符来访问数据,分层命名空间用于基于账户、目录和文件来访问数据,其中目录被配置成包括文件和其他目录。第一API默认利用平面命名空间,第二API默认利用分层命名空间。方法还包括从用户设备接收命令。当接收到用于平面命名空间的命令时,利用命令中包括的容器和团块标识符执行命令。当经由分层命名空间接收命令时,访问分层命名空间服务以将命令中包括的目录和文件转换为一个或多个团块标识符,并且利用转换产生的一个或多个团块标识符执行命令。此外,在执行命令之后,响应被发送到用户设备。

在另一个实施例中,云存储系统包括存储集群。每个存储集群包括:多个存储节点;分层命名空间服务,用于对被存储在团块中的数据实现文件系统功能;以及前端层,用于处理访问和管理被存储在团块中的数据的用户请求。每个存储节点包括将数据存储在容器内组织的团块中的分区层,并且包括用于流化团块数据的流层。文件系统功能包括目录功能和文件功能,每个目录被配置成包括文件和经由文件系统功能请求的其他目录,每个文件被存储在一个团块中。前端层访问分区层,以基于团块的地址访问团块,并且前端层访问分层命名空间服务以标识团块。

图1是根据一些示例实施例的用于多协议云存储系统的架构的图。在一些示例实施例中,存储系统包括团块存储系统(“团块SS”)106和团块文件存储系统102(“团块FS”)。不同的端用户应用112、备份应用114、分析应用116等可以经由团块SS 106或团块FS 102访问存储系统。

团块存储层108可以由这两个存储系统访问,并且团块存储层108包括多个团块110。团块SS 106和团块FS执行对团块存储层108的直接访问,或者它们可以利用分层命名空间服务104访问团块。

根据示例实施例,分层命名空间服务104用于将分层命名空间中的文件系统对象路径映射到平面命名空间中的文件系统对象标识符。分层命名空间服务104被配置成将用于分层文件系统的命令映射到平面文件系统命令,以用于访问团块110。换句话说,即使文件系统对象被存储在平面文件系统中,命令也可以为文件系统对象定义分层路径名称。分层命名空间服务104被配置成将用于团块系统对象(例如,文件)的分层路径映射到与对应于团块存储108的团块110标识符。

如本文中所使用的,平面文件系统是在容器中存储对象(例如,团块)的存储系统,并且访问平面文件系统中的对象需要指定针对容器的标识符和容器内的团块的标识符。在一些示例实施例中,分层命名空间服务104维持分层命名空间标识符(或路径)与被存储在平面命名空间存储系统106中的文件系统对象的平面命名空间标识符之间的映射。在一个示例实施例中,该映射被维持在命名空间表中。通过维持这种映射,分层命名空间服务104可以在平面命名空间存储系统中执行诸如“移动文件”或“移动目录”的文件系统命令,而不必物理地移动文件或移动文件夹(及其所有内容,其可能是数十、数百、数千、数百万、数十亿甚至更多的文件)。相反,在每种情况下,可以修改一个或多个映射条目,而不是物理地移动文件系统对象(这意味着将执行昂贵的文件系统操作)。通过改变映射条目而不是执行昂贵的文件系统对象操作,实施例实现了处理器操作和负载的显著减少。

团块FS在内部处理团块对象,但是团块FS从客户抽象出了团块和团块类型概念。此外,团块FS优化了团块类型的使用,以在大数据和分析工作负载中获得更好的性能和更低的成本。数据块的内部格式和团块元数据在团块SS和团块FS之间被共享,因此它们完全可互操作。确保这种兼容性和共享是本文提出的实现方式所面临的挑战和技术进步之一,因为针对这两种接口提供了支持,同时允许每个接口针对其自己的用例进行优化。

在一些示例实施例中,存在三种类型的团块:块团块、追加团块和页面团块。块团块存储文本和二进制数据,并且由可以被个体地管理的数据的块组成。追加团块由类似于块团块的块组成,但针对追加操作进行了优化。追加团块在一些场景中是理想的,诸如记录数据。此外,页面团块存储随机存取文件。

团块FS利用基础的团块SS实用程序,诸如压缩和加密。由于内部使用了相同的内部团块,因此许多团块特征,诸如“软删除”、“改变通知”、“改变供给”等是被共享的。由于团块SS和团块FS可互操作,因此与团块FS一起使用的所有大数据和Analytics可以自动利用整个生态系统。

当用户想要经由启用HN的团块FS来从文件读取时,分层命名空间服务104被用来标识数据驻留的位置(例如,所请求的团块),然后团块FS可以直接从团块访问数据。

图2是根据示例实施例的包括命名空间服务的存储系统的框图,命名空间服务用于将文件系统命令从分层命名空间映射到平面命名空间。存储系统202存储用于用户设备(诸如用户设备218)的文件系统对象,其数目可以为数十、数百、数千、数百万甚至更多数目的用户设备。在一些示例实施例中,存储系统202包括位置服务204、域名系统(DNS)206、第一存储集群208A和第二存储集群208B。

第一存储集群208A包括前端层210A、分区层212A、分层命名空间服务104A、分区层212A和流层214A。第二存储集群208B包括前端层210B、分层命名空间服务104B、分区层212B和流层214B。存储系统202可以包括与第一和第二存储集群208A和208B类似地实现的任意数目的存储集群,包括数十、数百、数千、数百万甚至更多数目的存储集群。

存储集群206A和206B具有物理存储服务器的机架,其中每个机架都被建造为具有冗余网络和电源的独立故障域。存储集群206A和206B中的每个可以包括任意数目的机架,每个机架具有任意数目的存储节点。

位置服务204可以被实现在一个或多个服务器中,并且被配置成管理存储集群206A和206B。位置服务204还负责跨所有存储集群管理账户命名空间元数据。位置服务204将账户分配给存储集群206A和206B,并且跨存储集群206A和206B管理账户以用于灾难恢复和负载平衡。

在一些示例实施例中,存储系统202包括在多个地理区域(例如,北美、欧洲、亚洲等)中的多个位置中的存储。每个位置可以包括包含多个存储集群的数据中心。为了提供附加的容量,位置服务204可以添加新区域、将新位置添加到区域、或将新存储集群添加到位置。

位置服务204跨所有位置跟踪由每个存储集群(包括存储集群206A和206B)使用的资源。在一些示例实施例中,当应用请求新账户以用于存储数据时,应用指定针对该存储的位置近邻(例如,美国北部地区)。位置服务204基于跨所有存储集群的负载信息(考虑存储集群的完整性以及其他指标,诸如网络和事务利用率),使用启发法,将该位置内的存储集群选择为用于该账户的主存储集群。此外,位置服务204将账户元数据信息存储在所选择的存储集群中,这告诉存储集群开始处理针对所分配的账户的流量。位置服务204更新DNS206,以允许请求从URI路由到该存储集群的虚拟IP(VIP)地址(该存储集群针对外部流量公开的IP地址)。

前端(FE)层210A和210B均包括一组无状态服务器,这些服务器从诸如用户设备218的用户设备中的应用接收传入的请求。在接收到请求时,对应的FE 210查找账户名称、解析请求、认证和授权请求,然后基于分区键将请求路由到对应分区层212中的分区服务器。分区层212维持分区图,针对该存储集群,分区图跟踪分区键范围以及哪个分区服务器正在为哪个分区键服务。在本文中分区键也被称为分区名称。FE服务器将分区图存于缓存,并且使用分区图来确定将每个请求转发到哪个分区服务器。FE服务器还直接从对应的流层214流化大对象,并且为了效率将被频繁访问的数据存于缓存。分层命名空间服务104A和104B分别被定位在前端层210A与分区层212A之间以及前端层210B和分区层212B之间。分层命名空间服务104A和104B均是图1的分层命名空间服务104的示例,并且被配置成:将利用分层命名空间标识符来指代文件系统对象的请求,变换为指向存储集群208A和208B的平面命名空间中的文件系统对象的请求。

分区层212A和212B均被配置成:管理和理解更高级别的数据抽象(例如,团块、表、队列),为对象提供事务排序和强一致性,将对象数据存储在对应的流层之上,以及将对象数据存于缓存以减少磁盘输入/输出(I/O)。

此外,分区层212A和212B均通过在对应的存储集群208内对数据对象进行分区来实现可扩展性。如前所述,数据对象具有分区键。数据对象可以基于分区键值被分解为不相连的范围,并且由不同的分区服务器服务。分区层212A和212B均管理哪个分区服务器正在为数据对象(例如,团块、表和队列)的什么分区键范围服务。另外,分区层212跨分区服务器提供分区键的自动负载平衡,以满足数据对象的流量需求。

流层214将数据存储在物理存储(例如,硬盘、固态存储等)上,并且负责分发和复制跨许多服务器的数据,以使数据在对应的存储集群内持久。流层214均可以被认为是存储集群内的分布式文件系统层。流层处理文件(文件被称为“流”,它们是称为“区间(extent)”的大型存储块的有序列表),如何存储它们,如何复制它们等,但流层不处理更高级别的对象构造或它们的语义。数据被存储在流层214中,并且可从分区层212和前端层210访问。在一些情况下,前端层210从分区层212获取数据指针,并且前端层210读取直接来自流层214的数据。

注意,数据可以以任何形式被存储,包括文件系统对象,诸如文件和文件夹、团块110(例如,用户文件)、表(结构化存储)和队列(消息递送)。流层214以访问被称为流的大文件的形式的数据,并且使得对应的分区层能够打开、关闭、删除、重命名、读取、追加、联接流,等等。

在传统的Hadoop实施方式中,数据大小存在不太高的拍字节(petabyte)或几亿个文件的限制。在此之外,命名服务无法再扩展,因为命名服务必须被保留在存储器中,这类似于传统的操作系统和大数据文件系统。通过实现分布式分层命名空间服务104,团块SS和团块FS能够水平地扩展,而没有单个机器或少量机器的存储器约束。

图3图示了根据一些示例实施例的用于存储流302的结构。在一些示例实施例中,流是区间指针304的有序列表,其中区间304是追加块306的序列。例如,流“//foo”302可以包含指向数个区间(例如,E1、E2、E3和E4)的指针304。每个区间304包含之前已追加的块的集合306。在一个示例中,E1、E2和E3可以是封闭区间,这意味着它们不能再被追加,并且E4未被封闭,这意味着新块可以被追加到该区间。如果应用从头到尾读取流“//foo”的数据,则应用按照E1、E2、E3和E4的顺序接收区间的块内容。

块是用于写入和读取的数据的单位。在一个实施例中,一个块可以多达N个字节(例如4MB-100MB)。数据作为一个或多个联接块被写入(例如,追加)到区间,其中块不必具有相同的大小。可以根据块和每个块的大小来指定追加项。读取给出流或区间偏移,并且流层在该偏移处读取所需数目的块,以满足读取的长度。在执行读取时,块的全部内容都被读取。例如,对应的流层可以在块级别存储其校验和验证,每个块有一个校验和。整个块被读取以执行校验和验证,并且可以针对每次块读取都进行检查。可以针对它们的校验和来定期验证所有块,以检查数据完整性问题。

区间是流层中的复制的单位,并且一个示例的默认复制策略是在存储集群内针对区间维持三个副本。分区层使用的目标区间大小例如可以是1GB,但其他值也是可能的。为了存储小对象,分区层将其中许多小对象追加到相同的区间,并且甚至可能追加在相同的块中。为了存储大对象(例如,太字节(terabyte)大小的对象,其可以包括若干个团块),分区层可以将对象分解到许多区间。分区层跟踪对象被存储在区间中的哪些流、区间和偏移,它们作为对象的索引的一部分被存储。

每一个流在流层中具有名称,并且该流对于分区层来说表现为大文件。流可以被追加,并且可以被随机读取。当区间联接在一起时,区间表示完整的连续地址空间,其中可以按区间被添加到流中的顺序来读取流。可以通过联接来自现有流中的区间来构造新的流,这是一种快速操作,因为指针的列表可以被更新。只有流中的最后一个的区间可以被追加,并且流中的所有之前的区间都不可变。

图4图示了根据一些示例实施例的用于平面存储系统和分层存储系统的不同对象分层。存储系统202提供了全局命名空间,全局命名空间允许客户端在存储中寻址并且允许客户端随时间扩展至任意数量的所需存储。

在一些示例实施例中,存储系统202包括两种不同类型的分层:团块分层106和团块FS分层102。这两个分层可以共存在存储系统202内,并且允许用户以两种不同的方式访问存储:利用平面命名空间或利用分层命名空间。可以经由HTTP或HTTPS从任何地方访问团块存储中的对象,并且可以将它们作为团块或文件进行寻址。

团块SS分层106包括账户106,账户106包括团块容器402,并且团块容器402包括团块110。团块FS分层102包括账户404,账户404包括文件系统406,文件系统406包括目录408,目录408包括文件410。

文件410和目录408与团块110可互操作。在一些示例实施例中,当使用FN时,目录408使用空团块作为占位符,因为HN在目录块存储中具有第一类的目录条目。文件410利用团块来进行存储。在一些示例实施例中,用于团块SS的账户106和用于团块FS的账户是的相同账户404。

团块容器402与团块FS兼容,团块FS将团块容器402视为具有默认设置的文件系统。此外,通过团块FS创建的团块文件系统406与团块SS一起工作,团块SS将团块文件系统406视为团块容器402,并且忽略附加的元数据。由团块FS使用的服务元数据与用户元数据保持分离。

团块容器402组织了一组团块110,并且所有团块110都驻留在相应的团块容器402内。在一些示例实施例中,存储账户可以包含不限数目的团块容器402,并且容器可以存储不限数目的团块110。此外,FS可以包含不限数目的目录,并且目录可以包含不限数目的目录和文件。

关于经由团块FS来访问文件,数据I/O操作使用偏移和长度参数。此外,团块FS使用追加命令来添加数据,并且使用冲刷(flush)命令将数据提交到磁盘。追加文件操作用于实际写入数据,追加操作将数据写入磁盘;数据被保留,但尚不可由读取文件操作读取。冲刷文件操作将最新追加的所请求的未冲刷的长度提交,以便它可由读取文件操作读取;这不是数据写入,只是索引写入操作。此外,团块FS支持并行读取和写入相同的文件。附加地,团块SS操作与利用团块FS作为文件创建的团块兼容。此外,冲刷命令被优化以允许在冲刷同时的并发数据追加,这大大改进了按顺序写入数据的应用(诸如事务日志)的性能。

在团块存储系统106中,以三个部分定义存储命名空间:账户名称、容器名称和对象名称。结果,可以经由以下形式的URI在存储系统20中访问数据:

http://sAccountName/ContainerName/团块Name

其中janeaccount.团块.core.windows.net是账户名称,mycontainer是容器名称,files/my团块.txt是对象名称的一个示例如下:

账户名称被分配给客户用于访问存储,并且由DNS主机名称来管理。DNS 206执行针对账户名称的DNS转换,以定位存储集群208和其中存储数据的数据中心。应用可以使用多个账户名称来跨不同位置存储数据。一旦请求到达存储集群,分区键就定位数据。分区键被用于基于流量需求,跨存储节点地扩展对数据访问。当分区键保持许多对象时,对象名称标识该分区内的各个对象。存储系统202支持跨具有相同分区键值的对象的原子事务。原子事务包括要由云存储系统执行的多个操作,使得所有操作成功,或者没有操作被执行并且原子事务被终止。这种命名方法使存储系统能够灵活地支持多种数据抽象。例如,对于团块,完整的团块名称是分区键。团块可以具有快照。此外,行键(其标识分区键内的对象)是AccountName;ContainerName;ObjectName;SnapshotVersion,因此系统可以对相同文件/对象的快照进行事务操作。

对象名称可以是可选的,因为对于一些类型的数据,分区键唯一地标识账户内的对象。该命名方法使存储系统202能够灵活地支持多种数据抽象。例如,对于团块,完整的团块名称是分区键,其格式为account;container;团块。在上述示例中,分区键是janeaccount;mycontainer;files/my团块.txt。

用于HS操作的分区键的格式为account;filesystem;directory;file。可以经由以下格式的URI在存储系统202中访问数据:

http(s)://Accountname/FileSystem/Directory/File

例如,其中janeaccount.dfs.core.windows.net是账户名称,myfs是文件系统,files是目录,并且my团块.txt是文件名称的一个示例如下:

在一些示例实施例中,团块FS 102提供用于访问数据的API,诸如REST API。团块FS 102被构建在团块110之上;因此,团块FS 102提供了用户习惯于团块SS的特征,这意味着不会因为团块FS的实施而损失任何利益。

此外,当使用团块FS 102时,通过提供对文件的访问对用户隐藏团块抽象。用户不需要针对不同类型的团块(诸如,块团块、追加团块和页面团块)的使用而配置访问权限。利用团块FS,用户不必配置或选择团块类型。

团块SS和团块FS共享内部数据格式、压缩和加密机制,并且两者可以写入不同的、独特的元数据,但也可以针对相同account/container/团块的共享元数据。此外,两个接口使用内部团块抽象模型,内部团块抽象模型通过由分区层维持的内部表来实现。

通过使用团块服务构建团块FS,团块SS和团块FS可以共享特征,诸如加密、对象级别分层、软删除、改变通知、虚拟网络、地理复制、对象版本控制、档案存储、生命周期策略管理、区域冗余存储等。

图5图示了根据一些示例实施例的前端组件栈。该存储系统支持多种协议和可扩展的元数据支持。团块SS API和团块FS REST API可互操作,并且数据和元数据被存储在相同对象中。

团块FS前端具有支持多种协议的可扩展架构。团块SS和团块FS在存储中具有单独的端点,并且针对每个存储账户,端点由不同的DNS记录寻址。团块SS端点由.团块.core.windows.net寻址,并且团块FS由.dfs.core.windows.net寻址。

对于每个存储集群,存在针对每个端点的VIP,因此团块SS和团块FS针对该集群具有不同的VIP。因此,当接收到请求时,就知道哪个前端(团块SS或团块FS)接收了该请求,而不必执行任何解析。

网络负载平衡层504选择哪个FE实例对应于FE类型的VIP,并且选择哪个实例/服务器将服务该请求。在集群级别上,跨针对集群中的该端点的所有前端执行端点负载平衡。

此外,集群中前端的每个实例包括层506、508、510和512。网络协议层506是请求的传输,并且认证和授权层执行对请求的解析和认证。

对应的REST API 510处理该请求,然后内部服务API 512将命令转换为由存储系统执行的内部操作,并且充当到分区层的网关。

在一些示例实施例中,在存储账户级别,用户默认具有FN,但是在其他实施例中,HN可以是默认值。当存储账户被创建时,用户可以选择启用HN。如果存储账户使用FN,则团块SS和团块FS两者使用FN。如果存储账户使用HN,则团块SS和团块FS两者使用HN。用于团块SS和团块FS的前端了解FN和HN。如果前端正在服务针对具有FN的存储账户的请求,则前端直接与团块内部服务对话。如果前端正在服务针对具有HN的存储账户的请求,则前端首先与分层命名空间对话,分层命名空间遍历该命名空间以访问文件,并且最终在“团块internal service”中返回指向团块的指针,然后前端将访问该团块。

虽然团块SS和团块FS API支持FN和HN两者,但是团块SS和团块FS API不提供完全相同的功能。团块和文件系统功能不同,并且提供不同的功能。团块SS提供对团块的纯键值存储样式访问,没有目录或文件系统功能。团块FS提供具有目录的文件系统功能,并且提供诸如重命名目录、删除目录等操作。此外,利用团块FS API,HN可以启用或改进某些功能,诸如原子目录操作、目录操作、以特定目录效率进行列表等。

图6图示了根据一些示例实施例的存储系统对请求的处理。传统上,云存储提供了通用的对象存储特征,但是这些系统没有提供如下的实用程序,该实用程序在单个机器、少量机器上托管的传统文件系统中或在传统分布式大数据文件系统(诸如,第一类目录支持)中可用,包括可靠、高效和一致的目录操作。例如,为了重命名团块,一些云对象存储系统会利用新名称创建新的团块,以某种方式复制数据(深层或浅层复制),并且删除旧的团块。如果用户使用团块的名称来组织数据(例如,用相同的名称前缀来模拟目录或分类),则要重命名该模拟目录,云存储将必须复制所有团块(可能数以百万计或更高)。

一些云存储系统使用简单的编程模型,针对跨计算机的集群的大型数据集的分布式处理,利用Apache Hadoop软件库。Apache Hadoop被设计成可以从单个服务器扩展到数千个机器或更多,每个机器提供本地计算和存储。

大多数用户希望或期望它们的云对象存储提供与他们在单个设备中使用的文件系统相同的功能。另外,用户希望云存储系统可以实际扩展到无限的存储量,并且不受云存储特定实施方式的限制。团块FS能够提供这些服务,并且能够提供无限制扩展的能力。

另外,云存储提供的服务必须提供一致性和鲁棒性。团块FS为高度一致的原子操作提供支持。例如,如果目录被重命名,则用户希望立即查看该目录中的所有文件。如果系统仅使用团块名称来模拟目录,则重命名目录需要重命名数百万个团块。

一些操作必须是原子的,因为,例如,这些操作用于实现集群中进程之间的互斥访问。这些操作至少包括创建文件、删除文件、重命名文件、重命名目录、创建目录以及删除目录。

图6图示了对用户请求的处理(例如,读取文件)。存储系统202提供团块SS API508和团块FS API 510,它们包括利用平面命名空间和分层命名空间来访问文件的一组操作。

因此,团块SS API 508提供了一种用于读取给定容器内的给定团块的特征,而团块FS API 510提供了一种读取被提供了包括一个或多个目录的路径的给定文件的特征。

在所图示示例中,计算设备218中的应用112经由网络602向存储系统发送请求604。如果该请求是针对团块SS,则团块SS API 508解析612该请求。如果该请求是针对团块FS,则团块FS API 510解析614该请求。

在解析之后,该请求被发送到前端层210。如上所述,前端层210与分区和流层618交互,以访问来自团块存储108的数据(例如,读取所请求的团块110)。

如果请求是用于访问文件,则前端层210与分层命名空间服务104交互,以确定请求中所涉及的团块地址(例如,存储该读取请求的文件的团块的地址)。分层命名空间服务器104确保对请求的原子执行,以确保该请求要么成功,要么不成功,并且始终维持存储系统202的一致性。

在分层命名空间服务104将地址提供给前端层210之后,前端层210可以访问分区和流层618来满足请求(例如,从文件中读取数据)。在满足请求之后,存储系统202向应用112发送响应606。

注意,团块SS API 508和团块FS API 510两者能够同时访问相同的基础团块存储108。通过利用现有团块存储108,实现新团块FS API 510利用了现有基础结构来访问团块,同时向接口添加了新特征(诸如,目录的使用)。存储系统202被视为是多协议的,因为存储系统202能够同时支持一个以上的访问协议。例如,如果团块具有已经经由团块SS API 508定义的某些性质,则团块FS API 510能够读取这些性质。

在之前的实施方式中,多协议支持需要具有数据的不同副本,每个副本针对不同的接口被结构化。但是,这需要具有多个副本(这意味着需要附加的存储),并且必须同步副本(这意味着增加计算资源并且意味着潜在的同步问题)。另一方面,由于多个协议访问相同的基础数据,所以存储系统202提供的多协议支持不需要数据的多个副本。

另外,团块FS API 510隐藏了必须要选择团块类型(例如,块、页面、追加)的复杂性。在一些示例实施例中,团块FS监控用户如何写入和读取数据,并且基于这些监控,团块FS选择团块的类型来存储文件。例如,如果用户通常顺序地写入数据(例如,日志文件),则团块FS选择追加团块。如果用户通常以在不同位置进行读取和写入来访问文件,则团块FS将选择页面团块。

图7示出了根据一些示例实施例的分层目录结构700中的路径和文件的示例。分层目录结构700可以包括目录和目录内的文件。

在该示例中,分层命名空间可以包括根“/”,根下面的目录/path1和/path2,目录/path2中的文件file1和file2,目录/path2中的目录path3和目录/path2/path3中的文件file3。

分层命名空间用于利用基础团块存储来提供具有目录和路径的抽象。例如,为了重命名目录,团块FS会改变将目录映射到目录名称的表,而不必重命名目录中的所有团块。分层命名空间服务的目标之一是提供对目录的快速和原子操作。分层命名空间服务提供了原子事务,该事务允许对团块的多个操作原子地执行:所有操作都成功执行,或者都不执行。

图8示出了根据一些示例实施例的与分层目录结构700相对应的分层命名空间拓扑800。拓扑上,分层命名空间拓扑800是树,其中树由节点和节点之间的关系形成。节点可以是目录或文件(例如,对象)。除根之外,每一个节点具有父节点,并且每个节点具有一组属性,属性中的一个属性是节点的名称。节点的名称对于具有相同父节点的节点是唯一的。

名称可以改变而对拓扑没有影响,并且拓扑的改变不影响名称或性质。在分层命名空间拓扑800中,为每个节点指派了唯一地标识该节点的非易失性全局唯一标识符(GUID)。因此,每个文件和目录在分层命名空间中都具有唯一的GUID。在本文中,唯一的非易失性标识符经常被称为GUID,尽管该引用仅用于说明目的。实施例适于使用任何类型的唯一非易失性标识符(诸如,GUID、多个GUID、GUID加时间戳、或不改变并且在存储系统的相关范围内唯一的任何其他类型的标识符)来诸如标识文件和文件夹等的文件系统对象。

在所图示的示例中,GUID1-GUID4是对应于/,/path1,/path2和/path3的唯一标识符。GUID1是根目录的标识符,GUID2是根目录下的/path1目录的标识符,GUID3是根目录下的/path2目录的标识符,GUID4是/path2目录下的/path3目录的标识符。

图9示出了根据一些示例实施例的覆盖有路径和文件名称的分层命名空间拓扑900。因此,通过将图8的分层命名空间拓扑800与分层命名空间拓扑900进行比较,可以观察到GUID1是根的GUID,GUID2是/path1的GUID,等等。

图10示出了根据一些示例实施例的用于实现分层命名空间服务的示例架构。在一些示例实施例中,命名空间管理架构1000被配置成呈现存储系统命名空间,包括将分层文件系统命令映射到平面文件系统。命名空间管理架构1000包括分区层1002、分层命名空间服务104、物理节点1004、虚拟节点1006、目录块1008、实体块1010、一个或多个文件版本1012以及一个或多个目录版本1014。

分区层1002被配置成管理数据结构,该数据结构管理存储服务的各个方面,诸如是数据对象(例如,团块、文件、目录等)、队列等。例如,数据结构可以具有表的形式,并且可以追踪存储中的对象,诸如通过包括用于对象的标识符、指示(例如,由分区键指示)对象被存储的位置(例如分区)、对象的存储时间戳等。在一些示例实施例中,表的每个行可以具有模式(schema),并且可以由被称为行的主键的分区键和行键来访问。分区层1002维持命名空间表(在本文也被称为“主目录块映射”),作为命名空间状态和存储集群的受管理分区的持久性存储。主目录块映射可以维持文件系统对象的分层命名空间标识符(例如,路径名称)和这些文件系统对象的平面命名空间标识符(例如,GUID)之间的映射,以及在文件系统对象之间的父子关系的指示。

如上所述,分层命名空间服务104是一种接收使用分层命名空间标识符来引用文件系统对象的文件系统命令的服务命名空间,将分层命名空间标识符映射到平面命名空间标识符,然后使用平面命名空间标识符将针对的文件系统对象的命令应用于平面命名空间中。在一个实施例中,分层命名空间服务104包含并且管理物理节点1004,物理节点100管理执行命名空间映射的虚拟节点1006。

在一些示例实施例中,物理节点1004的每个物理节点可以被实现为物理机器。例如,物理节点可以被实现为物理服务器。物理服务器可以执行和/或实现一个或多个虚拟节点1006,例如通过执行呈现虚拟操作平台的管理程序,并且虚拟节点可以以虚拟机的形式在物理节点上运行。存储集群中可能存在许多物理节点,诸如一千个或其他数目的节点。

由物理节点1004管理的虚拟节点1006的数目可以是可扩展的,或者可以是预定义的静态数目。虚拟节点1006可以在物理节点1004之间移动。例如,如果第一虚拟节点太忙(例如,在处理器利用率水平阈值之上操作)并且第二虚拟节点也忙,并且它们都由相同物理节点管理(例如,在其上运行),则其中一个虚拟节点可以被转移到可用并且具有足够资源的另一个物理节点。如此,可以通过在物理节点和虚拟节点之间移动资源来执行负载平衡。虚拟节点1006均可以在持久存储中维持其状态,以便在任何时候,虚拟节点都可以在不同的物理节点1004上移动和/或重启。在一个实施例中,不同的标识符(例如,数字标识符(ID)))与虚拟节点1006中的每个虚拟节点相关联,并且在任何给定时间,具有给定标识符的虚拟节点的仅一个实例运行。

目录块1008对应于分层命名空间目录。通常,单个目录块对应于单个目录。当目录被创建时,GUID被生成并且被指派给该目录,以成为该目录的永久名称。在一个实施例中,对GUID执行哈希函数以生成哈希结果。哈希结果被用于确定针对该目录的目录块的永久位置。特别地,在一些示例实施例中,目录被指派给具有与哈希结果匹配的数字ID的虚拟节点,并且除非发生负载平衡,否则该指派不改变。该目录由该虚拟节点经由GUID永久管理。

目录块1008由相应的虚拟节点1006管理,其中每个目录块对应于分层命名空间中的目录(根目录或子目录)或目录的一部分。在目录块1008内部有实体块1010,每个实体块是目录内部的文件或文件夹。注意,可以由分层命名空间服务104可以管理任意数目的目录块1008和实体块1010,包括数十亿或更高的数目。

每个实体块1010可以具有多个版本,每个版本与不同的时间段相关联。文件实体块具有被指示为文件版本1012的一个或多个版本,并且目录实体块具有被指示为目录版本1014的一个或多个版本。目录块1008和实体块1010可以存在任意数目的版本,包括成百上千甚至更多数目的版本。实体块的版本被包含在特定名称之后。例如,如果被命名为“foo”的文件的属性被改变,则会生成“foo”的新版本,并且“foo”的所有版本使用相同的名称。实体块版本使得能够使用多版本并发控制(MVCC)。根据MVCC,命名空间不仅可以在当前时刻为实体块执行事务,而且还可以通过针对实体块的早期版本(接收到事务的时的当前时间(例如,如通过比较时间戳进行验证))执行事务,来针对过去的时间点的实体块执行事务。

图11示出了根据一些示例实施例的示例主目录块表。如上所述,分区层1002可以管理数据结构,该数据结构将分层命名空间中的文件系统对象(诸如文件夹和文件)映射到平面命名空间中的文件系统对象标识符,并且指示文件系统对象之间的父子关系。用于映射的这种数据结构可以具有任何形式,诸如表的形式。例如,图11示出了根据一个示例实施例的示例主目录块表1100。

主目录块表1100是数据结构的一个示例,其可以用于将文件系统对象的分层命名空间标识符映射到平面命名空间标识符,并且可以用于标识文件系统对象之间的父子关系。主目录块表1100标识每个目录中包含的对象。主目录块表1100包括目录块标识符(DBID)列1102、名称列1104、提交时间(CT)列1106和实体块标识符(EBID)列1108,并且可以可选地包括另外的列,诸如被删除指示列(“删除标志”)、文件指示列以及可能需要的任何其他附加列。

主目录块表1100可以由图6的分区层1002管理,而分层命名空间服务104可以管理分布在许多位置上的主目录块表1100的版本。例如,每个虚拟节点可以维持和管理主目录块表1100的对应部分,这被称为目录块映射。例如,主目录块表1100被示为被分成四个部分1110A-1110D。四个部分1110A-1110D对应于以一个或多个行的形式存储的一个或多个目录块和实体块的特定集合。此外,四个部分1110A-1110D中的每个部分可以由对应的虚拟节点管理,但是,一个虚拟节点也可以管理几个部分。例如,第一虚拟节点可以维持第一部分1110A,第二虚拟节点可以维持第二部分1110B,第三虚拟节点可以维持第三部分1110C,第四虚拟节点可以维持第四部分1110D。通过该方式来维持跨虚拟节点分布主目录块表1100,改进了分层命名空间服务104的性能,并且由于可以随着存储需求增长而添加附加的节点,因此增长主表的能力不受限制。

目录块标识符(DBID)列1102存储具有DBID的形式的用于每个目录块(例如,每个目录)的标识符。DBID是唯一的标识符,其对于特定的目录块永不改变。在一个实施例中,DBID是针对每一个新目录块生成的128位值。

实体块标识符(EBID)列1108存储具有EBID的形式的用于每个实体的标识符。当实体是目录时,目录的EBID也是目录的DBID。当实体是文件时,EBID是该文件的GUID,EBID对于该文件永不改变。如果实体块具有多个版本,则在目录块映射的对应行中列出这些版本。不同的版本表示在不同的时间间隔的实体块文件或目录的不同状态。

在图11的示例中,在行条目6、7和8中列出了相同实体GUID-FILE4(用于file1)的三个版本。行6、7和8列出了相同的DBID和EBID,但是在提交时间(CT)列1106中具有不同的值,该值指示实体块的相应版本被提交到存储的时间。如此,只有当指向实体块的命令的事务读取时间戳(RT)具有介于该版本的提交时间和该实体块的下一个较新版本的提交时间之间的值时,实体块的该版本才是读取有效的,除非该版本对应于最新提交时间,在这种情况下,最新版本对于在最新提交时间之后的所有RT都是有效。以该方式,命令可以作用于在命令被发出时有效的实体块的版本,而不是作用于实体块的最新版本。

因此,在主目录块表1100中,每个行表示实体块的版本。用于主目录块表1100的主键(PK)是DBID。行键(RK)是针对实体块的名称(在名称列1104中)和提交时间。下面的表1示出了主目录块表1100中可能存在的各种列的示例类型和描述,包括图11中所示的列。

表1

要注意的是,表中变量的类型可以具有不同大小的变量。在一个实施例中,使主目录块表1100中的数据不可变。当目录被删除时,添加新行,并且将Del标志的值设置为“是”。此外,当文件被删除时,Del标志的值被设置为“是”,并且在文件删除操作的CT之后的任何时间该文件将不可见。

为了重命名文件或目录,删除表中的当前条目(Del标志设置为“是”),并且添加具有新名称的新条目。创建、更新和删除命令在表中添加新的行。垃圾回收(GC)可以被实现为以预定间隔或以其他方式的配置从表中删除旧行。

当客户端(例如,图2的应用112)改变文件或目录性质时,在文件或目录的父目录的目录块中指示该改变。例如,改变文件的访问属性的结果是在主目录块表1100中插入一行,该行具有父目录的DBID、文件的名称1104,与文件的GUID相等的EBID,以及属性的新值。

但是,存在客户端可以间接改变的目录性质。例如,当客户端在目录中创建新文件时,针对该目录的最后写入时间戳会改变。在这些情况下,每个目录可以具有被称为“点文件”的特殊文件(例如,具有内部名称“.”),在点文件中,维持可能改变的目录属性(诸如内部维持的性质和客户设置的性质)。以预定义的间隔,来自点文件的一些性质被复制到父目录的目录块中的性质中,客户端可以在其中查看这些性质。例如,NTFS的上次读取时间可以每小时被传播到客户端部分一次。可以按照更复杂的时间表执行传播。例如,当目录时间戳改变时,经更新的时间将被立即传播到父目录,然后在预定义的时间段后被传播。

如上所述,目录块映射是主目录块表1100的与虚拟节点相关联的分布式部分。每个虚拟节点将主目录块表1100的对应部分维持为目录块映射。在一些示例实施例中,目录块映射被维持在主存储器中,并且目录块映射可以以哈希表和条目的形式维持诸如目录块和实体块标识符的数据。存储器表示被优化,以用于支持实时事务并且保留一小部分热数据。

对于在虚拟节点的目录块映射中列出的每一个实体块,将维持最后几个版本的行,该行具有关于事务状态和标志的信息,该标志表示在主目录块表1100中是否存在更早(较旧)的版本。实体块的版本是实体块的列表,并且该列表从头开始增长。如果列表中的条目太多,则可以丢弃最旧的条目,并且可以在列表的末尾做出指示:更多的版本被存储在主目录块表1100和/或一个或多个名称解析缓存中。在存储器中,目录块提供对客户端指定(名称列1104)的名称和EBID(列1008)之间的映射的快速访问。

在一个实施例中,提供附加数据结构作为主目录块表1100的另一种分布式形式。该附加数据结构被称为名称解析缓存,并且形成分布式缓存服务。每个虚拟节点可以具有相关联的名称解析缓存。名称解析缓存由被配置成执行名称解析功能的虚拟节点使用,名称解析功能将分层命名空间目录名称(或路径)映射到DBID。这种名称解析节点可以从其他虚拟节点(在本文中被称为存储节点)获得必要的名称至DBID映射,但是随后,将这些名称至DBID映射存储在本地名称解析缓存中,以便后续的名称解析操作可以被更有效地执行。每个虚拟节点可以具有关联的名称解析缓存。由名称解析缓存提供的服务的性质是键值存储。键是字节的序列。名称解析缓存支持将稀疏流作为值。

例如,值可以具有3个版本:v1、v2和v3。在偏移时间戳1(TS1)到偏移时间戳2(TS2),可以写入v1,在偏移TS2到偏移时间戳3(TS3),可以写入值v2,并且从偏移TS3直到名称解析缓存的末尾(例如,偏移2^64),可以写入值v3。随后,可以在流的任何偏移处读取名称解析缓存,并且名称解析缓存将返回正确的值。

虚拟节点可以将实体块和目录块缓存在名称解析缓存中。关于实体块,名称解析缓存键为DBID+EBID。可以将流写入到在引入数据的提交事务的偏移与下一个版本的提交事务的偏移之间的实体块版本中。实体块的读取由特定时间戳执行,该时间戳被用作流中的偏移。名称解析缓存返回偏移所落入的范围内存储的数据。当存储较新的值时,之前存储的值被重写。对于目录块,名称解析缓存键为DBID+EBID。之前请求的时间戳被写入到EBID的流列表中。

在读取操作时,如果名称解析缓存返回数据,则该数据被认为是正确的,直到某个时间点为止。该时间点可以是当前时间或过去的时间。命名空间数据不可变,因此不存在可能导致读取无效数据的问题,但是可能存在较新版本的数据,名称解析缓存中尚未上传该较新版本的数据。在该情况下,来自本地存储器(目录块映射)和名称解析缓存的结果将被组合。因为名称解析缓存在每次写入主目录块表1100时被更新,所以如果在目录块映射中不存在较新的版本,则名称解析缓存版本是最新的。

因此,在多个级别(包括主目录块表1100、在虚拟节点处的目录块映射(分布式),以及在虚拟节点处的名称解析缓存(分布式)),分层命名空间服务的实施例实现了用于在文件系统对象的命名空间标识符和这些文件系统对象的平面命名空间标识符之间进行映射的映射,从而提供冗余、更高的效率(例如,请求映射信息中的流量减少)和更快的操作(例如,经由对附近映射信息的更快速的访问,存储标识符的哈希值以用于更快速的比较,等)。

图12图示了根据一些示例实施例的包括物理节点和虚拟节点的分层命名空间服务的框图。分层命名空间服务1200可以以各种方式在物理节点和虚拟节点中被实现,以使用映射信息来处理文件系统事务请求。分层命名空间服务1200包括多个物理节点(PN)1202A-1202E和多个虚拟节点(VN)1208(被表示为位于虚线圆上)。

虚拟节点1208包括第一虚拟节点集1204A,第二虚拟节点集1204B和第三虚拟节点集1204E。第一虚拟节点集1204A包括第一虚拟节点1208A和可选的一个或多个另外的虚拟节点。第二虚拟节点集1204包括第二虚拟节点1208B和可选的一个或多个另外的虚拟节点。第三虚拟节点集1204E包括第三虚拟节点1208E和可选的另外的虚拟节点。

在一个实施例中,物理节点1202A-1202E在一个或多个服务器中作为物理机器(未示出)执行。可以存在任意数目的物理节点,包括数十个、数百个、数千个甚至更大数目的物理节点。每个物理节点是独立的,并且与其他物理节点和虚拟节点通信。

可以存在任意数目的虚拟节点,包括数万或数十万甚至更多数目的虚拟节点。虚拟节点可以以各种方式被实现,包括作为在物理节点上运行的虚拟机。

每个虚拟节点集由对应的物理节点管理(例如,托管/运行)。例如,物理节点1208A管理第一虚拟节点集1204A,物理节点1202B管理第二虚拟节点集1204B,并且物理节点1202E管理第三虚拟节点集1204E。

每个虚拟节点管理相应的目录块集,其中每个目录块是存储命名空间的相应分区。命名空间表维持文件系统对象的分层命名空间标识符(例如,路径名称)和这些文件系统对象的平面命名空间标识符(例如,GUID)之间的映射,以及文件系统对象之间的父子关系的指示。在一个实施例中,虚拟节点集1204A、1204B和1204E中的每个虚拟节点可以管理相应的一个或多个目录块集,但是在特定时间一些虚拟节点可以管理零个目录块。

因此,分层命名空间服务1200提供对用于寻址存储中文件系统对象的命名空间的管理,并且可以以物理节点和虚拟节点的形式被实现。

在一些示例实施例中,每个虚拟节点具有预写(write-ahead)日志,并且在虚拟节点中发生的更新首先进入预写日志。预写日志被存储在持久性存储中,因此,如果虚拟节点发生故障,则虚拟节点可以在相同或不同的物理节点上重新启动,并且通过检查预写日志,继续在虚拟节点崩溃时挂起的操作。

图13图示了根据一些示例实施例的虚拟节点1208的框图。虚拟节点1208包括命令转发器1304、路径解析器1306和映射管理器1308。命令转发器1304包括哈希生成器1310。此外,虚拟节点1208维持目录块映射1310、名称解析缓存1312,和名称解析节点注册表1314。

虚拟节点1208的命令转发器1304被配置成接收包含文件系统操作的命令,该文件系统操作针对被存储在由分层命名空间服务管理的存储集群中的实体块。当客户端发送针对文件系统实体块的命令时,客户端使用文件或目录的名称(例如,文件系统对象的分层命名空间标识符),其中包括到该文件或目录的路径名称。在一个实施例中,当虚拟节点1208不是管理所标识的文件或目录的虚拟节点时,虚拟节点1208用作“查询节点”,以转发所接收的命令以用于处理。在这种情况下,命令转发器1304确定另一个虚拟节点(被称为“名称解析节点”)来处理标识另一个虚拟节点(在本文中被称为“存储节点”),该另一个虚拟节点管理该文件或目录,并且因此被配置成执行命令。在一个实施例中,命令转发器1304的哈希生成器1310可以对路径名称执行哈希函数(诸如,CRC64算法或其他合适的哈希函数),以生成哈希结果。该哈希结果标识名称解析节点。命令转发器1304将所接收的命令转发到所标识的名称解析节点。

虚拟节点1208的路径解析器1306被配置成从查询节点接收命令,将这些命令中包括的目录名称(或路径)解析为平面命名空间标识符,并且使用平面命名空间标识符来标识用于管理命令所针对的目录或文件的存储节点的虚拟节点。特别地,对于给定命令,路径解析器1306将命令中包括的目录名称或路径解析为DBID。名称解析被高效并且以与关于所有事务严格一致的方式被执行。注意,路径名称和DBID之间的映射可以改变(诸如在重命名目录时),并且这可能影响针对被重命名的目录的所有子级(包括目录的间接子级)的名称解析缓存。在一些情况下,虚拟节点1208的名称解析缓存1312可以在命令中存储路径名称到文件或目录的DBID的映射。在这种情况下,路径解析器1306可以将命令转发到该DBID的存储节点。否则,路径解析器1306通过处理路径名称来解析存储节点。

特别地,路径解析器1306可以在根处开始处理命令中的路径名称,并且逐路径部分地进行处理,以确定用于执行命令的相关存储节点。特别地,对于路径名称/path1/path2/,路径解析器1306可以与管理根分区的虚拟节点通信以确定用于路径名称中的第一目录(例如,/path1)的DBID。管理根分区的虚拟节点在其目录块映射1310中找到第一目录,并且将DBID提供回路径解析器1306。然后,路径解析器1306可以与管理用于该DBID的目录块的虚拟节点进行通信,以确定针对路径名称(例如,/path2)中第二目录的DBID。管理/path1的虚拟节点在其目录块映射1310中找到第二目录,并且将DBID提供回路径解析器1306。可以对任何另外的路径名称部分重复该过程。最终,路径解析器1306确定包含命令所针对的实体块的目录块的DBID,并且将该命令传送到管理该目录块的存储节点。

利用路径解析器1306,任何虚拟节点都可以在特定的RT(读取时间戳)找到并且返回用于路径的DBID。在查找映射的过程中,路径解析器虚拟节点1208在一段时间内(诸如1小时)在其对应的名称解析节点注册表1314中,向路径的所有DBID所有者注册,以用于通知。在时间到期之前,如果路径名称中的任何一处发生改变,则该路径名称部分的对应管理器向所注册的每一个虚拟节点通知发生改变的该路径名称,并且在针对所注册的虚拟节点的名称解析缓存1312中的针对该路径名称的条目无效。

注意,在存储节点处的注册可以具有预先确定的到期时间(租约),诸如1分钟。如果在下一个时间段(例如45秒),名称解析节点接收到关于相同实体块的新请求,则名称解析节点使用其名称解析缓存1312解析名称,而无需向DBID所有者发送新的注册消息。此后,如果名称解析节点接收到新请求,则名称解析节点将再次向DBID所有者注册。

虚拟节点1208的映射管理器1308被配置成处理从名称解析节点接收的用于存储节点的命令。例如,映射管理器1308可以将所接收的命令中的名称和时间戳作为键应用于虚拟节点1208的目录块映射1310,以确定该命令所针对的实体块。然后,命令可以由虚拟节点1208执行。

图14示出了根据一些示例实施例的分层命名空间服务的框图,其中虚拟节点将命令转发给管理该命令中标识的实体块的虚拟节点。虚拟节点1208彼此通信。当第一虚拟节点想要与第二虚拟节点通信时,第一虚拟节点要求托管第一虚拟节点的第一物理节点连接托管第二虚拟节点的第二物理节点,以发送消息。每一个虚拟节点都能够接收来自客户端的请求。

在所图示的示例中,分层命名空间服务包括虚拟节点1208A、1208B、1208E和1208R。针对虚拟节点1208B示出了目录块映射1310B和名称解析节点注册表1314B,针对虚拟节点1208E示出了名称解析缓存1312C,并且针对虚拟节点1208R示出了目录块映射1310R。为了便于说明,其他物理节点、虚拟节点、目录块映射、名称解析节点注册表和名称解析缓存未在图14中被示出。注意,以箭头形式示出的通信被示为发生在虚拟节点之间,但是实际上是由托管物理节点在虚拟节点之间进行通信。

在所图示的示例中,虚拟节点1208接收针对第一文件系统对象的命令1222(例如,创建/path1/file),该命令指示路径(例如,/path1/file)或与第一文件系统对象相关联的分层命名空间中的目录名称。命令1222可以包括针对实体块的文件系统操作,该实体块被存储在具有由分层命名空间服务1200管理的命名空间映射的存储集群中。如此,命令1222可能已经被转发到分层命名空间服务1200。

命令1222涉及目标实体、到该实体的分层路径名称以及要对该目标实体执行的操作,并且还可以包括指示接收时间的相关联的时间戳。

对路径或目录名称执行哈希函数,以生成用于虚拟节点的名称解析节点的第一节点标识符。在一个实施例中,命令转发器1304的哈希生成器1310可以对命令1222的路径名称或目录名称执行哈希函数(诸如,CRC64算法或其他合适的哈希函数),以生成哈希结果。哈希结果标识名称解析节点。这样做的动机是将用于解析相同路径名称的所有请求发送到相同的虚拟节点。如果相同虚拟节点将路径名称解析为DBID,则更少的虚拟节点将注册以用于通知。此外,该方法改进了名称解析缓存的效率,因为它增加了缓存命中的可能性。

命令被转发1424到名称解析节点(在该示例中为虚拟节点1208E),以确定用于处理该命令的存储节点。虚拟节点1208A中的命令转发器1304被配置成:将所接收的命令1222转发到所标识的名称解析节点。在该示例中,虚拟节点1208A将命令1222转发1424到虚拟节点1208E。基于哈希结果,虚拟节点1208A将虚拟节点1208E标识为名称解析节点。

在一个实施例中,虚拟节点1208A选择分层命名空间服务1200中的另一个虚拟节点来处理针对命令1222的名称解析。可以以任何方式来选择虚拟节点,包括:通过选择虚拟节点的序列中的下一个虚拟节点来进行选择(例如,通过虚拟节点标识符),通过随机选择下一个虚拟节点,或以另一种方式选择下一个虚拟节点。

命令被转发到下一个虚拟节点,以确定存储节点。命令转发器1304被配置成将所接收的命令1222转发给下一个标识的名称解析节点,作为转发命令1424。以该方式,名称解析请求可以跨多个虚拟节点被分发。例如,这允许跨多个虚拟节点分配负载,并且处理繁忙虚拟节点管理存储了数十亿个文件的目录时的情况。

注意,在一个实施例中,查询节点的命令转发器1304可以被实现为客户端库。当客户端库将命令发送到名称解析节点时,对命令的响应可以直接从执行命令的存储节点被返回到查询节点。这可以使来回发送的消息数目最小化。查询节点可以与存储集群的其余虚拟节点时钟同步,也可以不与其同步。如此,客户端库被配置成管理事务,但不执行命令。

此外,确定对应于路径的存储节点。在一个实施例中,虚拟节点1208E的路径解析器1306可以确定与管理转发命令1424中的路径名称相对应的DBID的虚拟节点1208R。在选择序列中的下一个虚拟节点的一个实施例中,这可以通过将预定义的数字(例如,1)添加到之前选择的虚拟节点的标识符,以获得下一个选择的虚拟节点的标识符来被实施。始终选择相同的下一个虚拟节点的方法将通过增加缓存命中的可能性来改进名称解析缓存的益处。

虚拟节点1208E可以经由节点解析通信1106与管理根目录的虚拟节点1208R进行通信1436。虚拟节点1208R访问其目录块映射1310R,目录块映射1310R将命令1222的路径名称中的路径部分映射为GUID,并且将GUID返回到虚拟节点1208E。虚拟节点1208E处的路径解析器1306继续逐部分地处理路径名称,与管理每个路径部分的虚拟节点进行通信,以确定对应的DBID,直到遍历整个路径名称并且确定存储节点为止。在一个实施例中,路径解析器1306与管理虚拟节点1208的物理节点通信,以确定拥有根目录和每个确定的GUID的虚拟节点。物理节点可以访问主目录块表1100,主目录块表1100包括所有路径部分到GUID(包括根)的映射,并且因此可以基于从之前虚拟节点确定的GUID,来找到路径解析器1306需要与之通信的每个虚拟节点。

命令被转发1432到所确定的存储节点(虚拟节点1208B),该存储节点具有目录块映射,该目录块映射包含将第一文件系统对象映射到平面命名空间中的实体块标识符的条目。路径解析器1306被配置成将命令转发到存储节点。由于拥有命令路径名称的DBID,因此虚拟节点1208B被虚拟节点1208E标识为存储节点。

实体块标识符和时间戳被注册在与该虚拟节点相关联的缓存中。在一个实施例中,路径解析器1306被配置成:将针对命令确定的实体块标识符与时间戳和命令的路径名称一起存储在名称解析缓存1312中的条目中。以该方式,当接收到包括路径名称的未来命令时,路径解析器1306可以仅通过参考名称解析缓存1312中的条目来确定存储节点。在一个实施例中,路径解析器1306可以从通知消息中的存储节点接收实体块标识符,并且作为响应,可以将条目存储在名称解析缓存1312中。

要注意的是,在从时间戳值起经过了预先确定的时间量(诸如,一分钟、一小时或其他时间段)之后,名称解析缓存1312中的条目可能超时并且因此变得无效。此外,路径解析器1306可以从存储节点接收名称解析缓存1312中的条目的无效缓存条目通知,并且作为响应,路径解析器1306可以将该条目指示为无效。类似地,当其他虚拟节点中的任一虚拟节点确定它们解析的路径部分已变得无效(例如,由于目录名称改变等)时,路径解析器1306可以从路径解析器1306与其通信以解析针对命令中的路径名称的路径部分的DBID的其他虚拟节点接收无效缓存条目通知。

在一个实施例中,如果事务读取序列(RS)编号Transaction.RS等于0,则名称解析节点可以将Transaction.RS确定为当前时间减去预先确定的增量值。此外,在本地名称解析缓存中执行搜索,以搜索针对该路径名称的DBID,诸如,如果文件路径为/path1/path2//name,则为/path1/path2/和Transaction.RS。如果/path1/path2/不在本地名称解析缓存中,则在名称解析缓存中检查路径名称的前导路径部分(例如,/path1等)的存在,这可以用于确定针对路径名称的至少前导部分的DBID。此外,当路径和DBID之间的映射不在本地名称解析缓存中时,路径解析请求被发送到管理路径的第一部分的虚拟节点(例如,根虚拟节点或管理针对路径前导部分所确定的DBID的虚拟节点)。路径解析节点返回针对Transaction.RS的DBID,该结果针对RS加上预先确定的时间量有效。当DBID的所有者虚拟节点改变了映射时,所有者虚拟节点通知在其名称解析路径中缓存了最新值并且缓存的值尚未过期的所有节点。此外,命令被发送到所确定的存储节点。

由虚拟节点1208B从名称解析节点1208E接收1432关于第一文件系统对象的命令,该命令指示与第一文件系统对象相关联的名称和目录块标识符。

根据该命令,在与虚拟节点相关联的目录块映射中,标识与名称和目录块标识符相对应的条目。在一些示例实施例中,映射管理器1308可以维持目录块映射1310(其可以是表或者可以具有其他形式),目录块映射1310具有与目录块相对应的条目(例如,行)。例如,目录块映射1310可以包括与主目录块表700的行类似配置的行。被转发的命令1432中的名称条目和目录块标识符(例如,由名称解析节点确定的针对最后路径部分的GUID)可以被映射管理器1308用作目录块映射1310的行键,以确定具有命令所针对的实体块标识符的行。

根据命令的类型,映射管理器1308可以以任何方式与该确定的实体块条目交互。例如,对于获取属性(get-attributes)命令,映射管理器1308可以确定该命令请求的条目中的一个或多个属性。对于命令(诸如,设置属性、创建文件、删除文件、创建目录和删除目录中的一个),映射管理器1308可以在目录块映射1310中创建针对实体块的新版本的新条目,该新条目具有从针对实体块标识符的之前条目复制的属性,但是具有新的提交时间,并且一些属性可能已被修改(例如,修改在设置性质命令中指定的任何属性,针对删除文件命令设置delete标志等)。

要注意的是,诸如移动文件和移动目录的一些命令可以作为多个命令被执行。例如,可以通过创建文件(creat-file)命令和删除文件(delete-file)命令来实现移动文件命令,其中创建文件命令创建针对用于新目录块的目录块映射1310(相同或不同虚拟节点,取决于移动目的地)中的实体块标识符的新条目,并且删除文件命令在目录块映射1310中(针对相同虚拟节点)创建设置有删除标志的、新的实体块标识符。在这种情况下,查询节点可以发布两个以上的命令以依次命名解析节点,以使一个或多个存储节点执行命令来执行整体命令。

此外,名称解析节点和命令中指示的路径名称被注册在与虚拟节点相关联的注册表中。如上所述,在一个实施例中,映射管理器1308被配置成:在名称解析节点注册表1314中创建条目,该条目将名称解析节点(其将命令转发至存储节点)与被转发的命令中的路径名称相关联。该条目还可以包括该条目的创建的时间戳。名称解析节点注册表1314中的该条目使得能够在路径名称改变的情况下通知名称解析节点,并且因此名称解析节点应当在其名称解析缓存1312C中将与该路径名称(完整路径名称或其任何部分)相关联的所有条目无效。

关于该命令,虚拟节点中的查询节点被响应。在一个实施例中,在存储节点1208B执行被转发的命令1432中的命令之后,存储节点向查询节点1208A提供命令完成的指示1430。通过直接响应查询节点,而不是通过名称解析节点响应查询节点,减少了通信链接的数目。参考图14的示例,虚拟节点1208B向虚拟节点1208A发送命令完成指示1430。

要注意的是,存储节点可以以各种方式确定要向其发送命令完成指示1430的查询节点。在一个实施例中,在将命令转发到名称解析节点时,命令转发器1304插入用于查询节点的标识符,并且名称解析节点将查询节点标识符转发到存储节点。在另一个实施例中,命令转发器1304以与该命令相关联的数据结构(诸如,存储器位置、文件、缓存等)发布用于查询节点的标识符。该数据结构可由存储节点访问,以确定与该命令相关联的查询节点。在其他实施例中,存储节点可以其他方式确定查询节点。

路径名称可以由于诸如移动目录、重命名目录等的操作而改变,这些操作改变了路径名称中的任何路径部分。这种路径名称改变会对针对该路径名称的名称解析缓存中的条目产生不利影响,使它们无效。如此,存储节点监控包含改变路径名称的操作的命令,这可以使映射管理器1308在其虚拟节点的目录块映射1310中修改关于路径名称的条目,以及通知针对该改变的该路径名称所注册的名称解析节点(在名称解析节点注册表1314中)。

因此,实施例提供了许多优点,包括使得能够通过操纵目录块映射中的数据来对实体块执行文件系统操作,而不是必须对所存储的文件系统对象本身进行操作。例如,如上所述,可以至少通过路径和名称来标识分层命名空间中的文件系统对象。可以针对分层命名空间中的文件系统对象来改变路径。在实施例中,路径改变引起对至少一个目录块映射中的条目的修改,其中该目录块映射用于与文件系统对象相对应的实体块的实体块标识符。目录块映射中的改变说明了路径改变,并且因此,该改变不会导致与实体块相对应的文件或文件夹在存储系统的存储中被移动。相比于在存储中实际移动文件和/或文件夹,改变目录块映射中的条目成本低得多的操作。当实体块是包含许多文件的文件夹时,尤其如此。如果文件夹被移动,这将导致针对所包含文件的许多移动文件操作(每个移动意味着删除文件和创建文件操作)。与此不同,实施例通过数据块映射的改变来避免移动存储的文件系统对象。

图15图示了根据一些示例实施例的存储器表中的条目的状态。存储器表中的每个行对应于EBID,并且该行包括针对EBID 1108的事务列表,其中具有相应状态和CT。每个事务具有唯一的事务标识符。

在一些示例实施例中,事务的状态可以是“活动”、“已提交”或“终止”之一。活动状态意指事务仍在进行中并且尚未完成。已提交状态意指事务已成功。终止状态意指事务由于一些原因(诸如,与另一个事务冲突或超时)而无法达到已提交状态。客户端可以设置事务的最大执行时间。如果事务无法在该时间内完成,则事务被自动终止。

客户端可以选择终止事务之前的重试次数。存储服务将在不同的时间点多次重试事务,直到成功或它耗尽了重试次数。

在一些示例实施例中,存在跨虚拟节点分布的存储器表(由分区层服务)。此外,存储器表具有其自己的分区和负载平衡。

图16图示了根据一些示例实施例的快照读取操作。存储器表1600保存关于目录的内容的信息,并且存储器表1600的结构允许有效执行读取和写入事务。存储器表1600在逻辑上被组织为每个实体一行,并且每个行包含按照当前时间戳CS组织的条目的链表,其中较新的条目在列表的头部。

在图16中图示的示例中,存储器表1600包括针对三个实体X、A和Y的数据。对于实体X,存在头条目1602和较旧的条目1612。对于实体A,存在三个链接的条目,从较新的条目1604开始,然后是条目1608,然后是条目1610。条目1604具有已提交状态和时间戳100。条目1608具有已提交状态和时间戳50,并且条目1610具有已提交状态和时间戳10。实体Y具有头条目1606,其跟随有另外两个条目。

为了执行针对给定时间的快照读取操作1612,搜索存储器表以标识针对该给定时间(例如,最新的条目)提交的条目。搜索从头条目开始,一直进行到找到时间戳小于快照读取请求中的时间的条目为止。

在图16中图示的示例中,请求针对时间70的快照读取。由于头条目具有时间戳100,因此这意味着头条目在请求时间之后,并且因此,该头条目对于快照读取无效。下一个条目1608具有时间戳50,小于所请求的时间戳70;因此,选择条目1608作为具有正确信息的条目以满足针对时间70的读取请求。

在一些示例实施例中,可以基于条目的最大数目或某个时间阈值,从列表的尾部丢弃较旧的条目。

注意,如果事务是完全完成或完全不完成的,则该事务是原子的。无论事务影响单个行还是多个行,分区中的所有事务都是原子的。在一些示例实施例中,从事务请求存在三种可能的结果:成功、失败或超时。成功意指事务成功,失败意指事务失败,超时意指事务可能失败。

分区始终一致,并且一致性确保了分区所执行的任何事务会将分区从一种一致状态转到另一种一致状态。例如,写入事务完成后,任何后续的读取事务将观察到已完成的写入事务。

分区中的事务被隔离,因为每个事务表现得独立于所有其他并发事务而完成。隔离确保了:事务的并发执行产生在按顺序执行事务的情况下会获得的分区状态。此外,读取具有事务时间戳,并且无法查看在其时间戳之后提交的更新或未提交的更新。写入可以看到其自己的更新,并且利用锁定来确保一次仅执行一次写入。在一些示例实施例中,利用更高级的锁定技术,应用特殊逻辑来允许并行进行某些类型的写入。可以针对多个实体并行执行多个写入,但是对于特定实体,一次执行一个写入。

快照隔离允许读取事务执行而无需等待写入事务。每一次更新会引入数据的更新版本,并且每一个版本具有定义的开始时间戳和结束时间戳(对于最新条目而言,其可以是无穷大)。

图17图示了根据一些示例实施例的只读的局部阶段操作。事务协调器是一个虚拟节点,它协调需要多个虚拟节点的操作的分布式事务。在一些示例实施例中,接收事务请求的第一节点是事务协调器。

事务协调器执行多个操作,诸如通过在存储器表中插入一行来启动事务,在正确的节点中逐个地执行命令,向所有节点发送准备消息,将事务的结果写入存储器表,以及向所有节点通知事务的结果。

在说明性示例中,事务协调器已经接收到包括多个事务的命令1702。命令1702包括以下事务:

因此,命令1702包括将要一起执行的两个读取事务和两个写入事务。第一读取事务被发送1706到虚拟节点1704A,虚拟节点1704A是包含A的节点。第一读取事务不包括读取序列RS(例如,时间戳)。

虚拟节点1704A执行快照读取,如上面参考图16所述,其包括操作1714、1716和1718。在操作1714处,由于第一读取请求不包括RS,因此RS被指派了本地时钟的值。

在操作1716处,利用RS作为快照读取的时间来执行快照读取操作。在操作1718处,与被指派的RS一起,返回A的读取值。虚拟节点1704A向事务协调器返回1708的A和RS的值。

第二读取请求被发送1710到虚拟节点1704B,虚拟节点1704B是包含B的节点。第二读取请求包括时间戳RS,并且虚拟节点1704B利用给定的RS执行快照读取。虚拟节点1704B将B的值返回1712到事务协调器。

在一些示例实施例中,虚拟节点具有宽松同步的时钟,这意味着虚拟节点中的时钟可以具有一定程度的变化。例如,虚拟节点中的时钟可能在1/10秒、1秒或几秒的范围内变化。虚拟节点之间的操作的协调不要求虚拟节点中的时钟被同步。注意,可以使用任何类型的方法来实现时钟功能。例如,时钟可以是逻辑时钟、物理时钟、严格同步的时钟、宽松同步的时钟等,并且本文提出的实施例可以用任何类型的时钟来实现。

通过使能宽松同步的时钟,事务协调器不必与涉及的所有虚拟节点进行通信来确保时钟同步,并且不需要时钟协调器来监督所有虚拟节点来确保它们的时钟同步。

在一些示例实施例中,时间同步信标经由包含当前时间的UDP包向虚拟节点发送周期性时间更新。周期性时间更新可以被周期性地发送,其中该周期可以在从50ms到10秒或更长的范围内。这样,时钟保持宽松同步,但是不要求所有虚拟节点中的时钟完全相同。

在一些示例实施例中,当第一虚拟节点向第二虚拟节点发送消息(例如,请求)时,该消息包括第一虚拟节点的时间。如果第二虚拟节点中的时间在从第一虚拟节点接收的时间之后,则第二虚拟节点等待,直到第二虚拟节点中的本地时间达到从第一虚拟节点接收的时间为止。在等待之后,第二虚拟节点处理请求。另一方面,如果从第一虚拟节点接收的时间在第二虚拟节点处的时间之后,则第二虚拟节点不等待并且继续处理请求。

在一些示例实施例中,事务协调器通过选择参与事务的所有节点的最大时间来选择事务的提交时间。

在一些示例实施例中,可以使用增量值,并且在操作1714中分配的RS被设置为本地时间减去增量值。增量值可以具有值0,然后分配的RS等于本地时钟时间。

图18图示了根据一些示例实施例的用于在阶段1期间准备行的操作。为了准备写入操作,事务协调器向虚拟节点1704D发送1806准备C请求(prepare-C请求),prepare-C请求包括之前获得的RS。然后,虚拟节点1704执行操作1814至1819。

在操作1814处,只要本地时钟的当前值大于RS,虚拟节点1704D就将本地时钟的当前值分配给乐观并发时间戳1(OCS1)。如果不大于,则虚拟节点1704D等待直到本地时钟到达RS,然后将本地时钟的当前值分配给OCS1。

在操作1815处,虚拟节点1704D检查与其他正在进行的事务的任何冲突。假设不存在冲突,则方法继续至操作1816,否则事务被终止。如果事务被终止,则事务协调器将终止通知发送到过程中涉及的虚拟节点。

在操作1816处,新条目被插入到存储器表1600中的针对实体C的行的头部。插入新条目,新条目具有状态“活动”和时间戳OCS1。

在操作1817处,服务器将当前时钟的值指派给OCS2。此外,在操作1818处,来自存储器表的针对实体C的行被写入到预写日志。在操作1819处,虚拟节点1704D返回1808新条目已经被初始化的状态,并且还返回OCS2的值。

类似地,顺序或并行地,事务协调器向虚拟节点1704E发送1810准备实体D的请求,其中该请求包括RS的值。虚拟节点1704E执行与虚拟节点1704D相同的操作,但针对实体D。虚拟节点1704E然后返回1812针对D的新条目已经被初始化的状态,并且返回从读取本地时钟获得的OCS3值。在一些示例实施例中,在prepare-C操作之后执行prepare-D操作,并且OCS1而不是RS被发送到虚拟节点1704E。

图19图示了根据一些示例实施例的来自图8的快照写入操作1816。在存储器表中添加新条目1902。虚拟节点遍历不同的行,直到找到针对实体C的行,其中头部在条目1908处。添加指向条目1908的新条目1902,并且新条目1902成为对应于实体C的行的列表的头部。如上所述,创建新条目1902,新条目具有“活动”状态和等于OCS1的时间戳。

图20图示了根据一些示例实施例的用于提交事务记录的阶段2。为了执行提交事务记录,事务协调器向2006向虚拟节点1704C发送提交新行的请求,虚拟节点1704C是管理事务记录分区的虚拟节点。该请求包括OCS2和OCS3的值。

虚拟节点1704C执行操作2014-2017。在操作2014处,针对事务1702,虚拟节点1704C分配CS作为OCS2、OCS3的最大值,并且分配在虚拟节点1704C处的当前时钟的值,这意味着选择CS作为三个时间中的最新时间。如果时钟的当前值大于OCS2和OCS3中的任何一个,则虚拟节点1704C等待,直到当前时钟的值等于OCS2和OCS3的最大值。

这意味着选择CS作为在事务中涉及的虚拟节点处获得的不同时间的最大值。通过选择不同时钟值的最大值,虚拟节点能够独立操作,而不必依赖跨所有虚拟节点的精确时钟同步。由于虚拟节点的独立时钟操作,这允许存储系统容易扩展。这可以减少执行期间可能使系统变慢的瓶颈。

如果时钟恰好彼此接近,则执行将很快。如果存在任何轻微的时钟差异,则事务仍然可以成功,但是延迟可能会增加,并且系统可能会稍微降低速度(仍然快,但比完全时钟同步的理想情况略慢)。但是,即使时钟可能缺乏完全同步,也永远不会存在错误的执行。

在操作2015处,虚拟节点1704C将提交记录写入到更新日志,并且,在操作2016处,事务记录分区中的角色被更新为已提交状态和所计算的CS的时间戳。在操作2017处,虚拟节点1704C返回2008具有分配的CS的完成状态。

图21图示了根据一些示例实施例的提交通知。在事务记录已经被提交之后,向虚拟节点1704D和1704E通知该提交,并且请求虚拟节点1704D和1704E以时间CS提交相应的写入。

在操作2114中处,虚拟节点1704D写入提交记录,以更新预写日志。在操作2116处,虚拟节点1704D将存储器表中的针对实体C的条目1090的状态改变为“提交”,并且将时间戳改变为所计算出的CS。类似地,虚拟节点1704E将针对实体D的条目改变为具有CS的“已提交”。

图22示出了根据一些示例实施例的用于团块FS API的文件系统操作。团块FS API利用已经针对团块SS实现的机制,诸如事务管理、索引编制和持久存储,这些机制提供了强一致性,并且可以在无需客户或操作员交互的情况下自动进行水平扩展。

此外,团块FS API支持诸如“复制文件”和“联接”(例如,“Concat”)的操作,这些操作是与元数据和索引相关联的操作,不需要像传统云对象存储中那样复制数据,该操作由在相同存储账户内已经支持有效复制团块操作的团块SS的能力来实现。

表2200示出了团块FS API的文件系统操作中的一些文件系统操作。这些操作包括创建文件系统、删除文件系统、获取文件系统的性质、设置文件系统的性质以及列出路径。

创建文件系统操作的格式是命令“Put”和文件系统的名称。此外,提供了API的版本。除命令为“Delete”之外,删除文件系统操作的格式相同。

下面是用于创建文件系统的操作的语法的一个示例:

图23示出了根据一些示例实施例的针对团块FS API的文件和目录操作。表2300示出了一些文件和目录操作,包括:创建文件或目录、删除文件或目录、重命名文件或目录、追加数据、冲刷数据、读取数据、获取路径的租约(包括持续时间)、续订租约、以及解除租约。

因此,团块FS API提供了用于添加、删除和重命名文件或目录的命令。此外,可以设置和读取文件和目录的性质。

例如,删除路径命令具有以下请求格式:

DELETE{filesystem}/{path}?resource={file|directory}&

recursive={true|false}&contiuation={token}

x-ms-lease-id:{id}

If-Match:{eTag}

If-None-Match:{eTag}

If-Modified-Since:{date}

If-Ummodified-Since:{date}

AdditionalHeaders

Resource是必需值,其指示类型:文件或目录。recursive是可选参数,如果研究的是目录,则它是必需的并且有效。如果recursive为真,则目录下的所有路径将被删除。如果recursive为假并且目录为空,则目录将被删除,否则返回错误。

continuation是可选参数。当删除目录时,每次调用删除的路径数目被限制。如果要删除的路径的数目超过该限制,则在响应首部x-ms-continuation中返回继续令牌。当在响应中返回继续令牌时,在删除操作的后续调用中必须指定该继续令牌才能继续删除目录。注意,对于f或重命名目录和删除目录操作,在对FN的响应中返回continuation参数;基于目录中文件的数目,FN可能需要继续。对于HN,它始终是单个原子操作,并且将不会有继续参数。

对删除路径命令的响应的格式为:

HTTP/1.1 200 OK

Content-Length:0

x-ms-contimuation:token

AdditionalHeaders

\r\n\r\n

重命名路径命令在其实现中类似于删除路径命令,例如,重命名路径命令在目录为空时删除目录。重命名路径命令将覆盖目标(如果存在),但是如果现有团块的资源类型(文件或目录)与源团块不匹配,则将失败。此外,重命名路径命令还支持对源的条件约束和租约约束。

重命名路径命令具有以下请求格式:

PUT{filesystem}/{path}?resource={file|directory}&continuation={token}

x-ms-lease-id:{id}

If-Match:{eTag}

If-None-Match:{e Tag}

If-Modified-Since:{date}

If-Unmodified-Since:{date}

x-ms-rename-source:{source Uri}

x-ms-source-lease-id:{id}

x-ms-source-lease-action:{acquire}

x-ms-source-if-match:{e Tag}

x-ms-source-if-none-match:{eTag}

x-ms-source-if-modified-since:{date}

x-ms-source-if-unmodified-sice:{date}

AdditionalHeaders

这里,resource是必需值,其可以是文件或目录以指示资源类型。continuation是可选参数。当重命名目录时,每次调用重命名的路径数目被限制。如果要重命名的路径的数目超过该限制,则在响应首部x-ms-continuation中返回继续令牌。当在响应中返回继续令牌时,必须在重命名操作的随后调用中指定继续令牌才能继续重命名目录。

对重命名路径命令的响应的格式为:

HTTP/1.1201 Created

Content-Length:0

x-ms-continuation:token

AdditionalHeaders

\r\n\r\n

当列出路径命令无法在单个调用中完成时,列出路径命令将使用继续。列出路径命令具有以下请求格式:

GET{filesystem}?resource=filesystem&recursive={true|false}&

directory={path}&contimuation={token}

Headers

这里,resource是指示文件系统的必需参数。recursive是必需参数,并且如果该值为“真”,则列出所有路径;如果该值为“假”,则仅列出在文件系统的根处的路径。如果指定了目录,则返回列表仅包括在目录内的路径以及目录本身。directory是可选参数,用于过滤指定目录内的路径的结果。如果目录不存在,则出现错误。

此外,continuation是可选参数。如果要返回的路径的数目超过限制,则在响应首部x-ms-continuation中返回继续令牌。当在响应中返回继续令牌时,必须在列出操作的后续调用中指定继续令牌才能继续列出路径。

对列出路径命令的响应格式为:

注意,本文提供的API细节是示例,并且API可以包括附加的命令和参数。此外,对API进行了版本控制,并且利用新API版本来完成行为改变,因此新版本向后兼容。这允许存储系统既兼容又可扩展。

图24示出了根据一些示例实施例的样本团块存储命令。样本命令2402如下:

Create Account janeaccount

Create Container janeaccount;mycontainer

PUT

Partition Key=janeaccount;mycontainer:files/myblob.txt

Put Block(10MB,B2)

Put Block List(B1,B2)

Get Blob(2MB-4MB)

List Blobs delimeter“/”,prefix“files/”

前两个命令创建账户janeaccount和在janeaccount内的容器mycontainer。PUT操作指示针对团块files/my团块.txt的URI,其中URI为:

此外,分区键(账户名称、容器名称和团块名称的组合)用于访问团块,并且唯一地标识该团块。在该示例中,分区键为janeaccount;mycontainer;files/my团块.txt。分区键是所示命令的一部分,并且为了简化描述已经被省略。

注意,对于FN,团块的名称包括“/”字符,但是该字符并不意指在团块存储中存在目录结构。用户使用该定界符作为模拟目录的指示。因此,用户可以请求以files/开头的团块列表,并且系统将基于团块的名称而不是基于在给定目录中的搜索来返回团块。

list团块s操作返回具有以files/开头的名称的团块。如上所述,这可能是模拟目录的简化方式,但是目录特征未在团块SS中被实现。例如,用户通过使该百万个图像文件具有相同的名称开头(例如“securityvideo/”)来创建百万个图像文件并且模拟目录。如果用户希望利用FN重命名所模拟的目录,则系统必须重命名一百万个团块。

图25示出了根据一些示例实施例的样本团块FS命令。示例命令包括以下内容:

Create Account janeaccount

Create File System janeaccount;myfs

Create Directory janeaccount;myfs;files

Create File

Append File(10MB)

AppendFile(10MB)

Flush File(20MB)

团块FS命令包括账户janeaccount和文件系统janeaccount;myfs的创建。此外,团块FS命令包括在上述目录、账户和文件系统中创建目录janeaccount;myfs;files以及创建文件my团块.txt。针对该文件的URI为:

团块FS API提供了用于创建目录的命令,这与团块SS API不同,在团块SS API中,创建目录命令不可用。在一些示例实施例中,因为两个接口利用不同的接入点,所以针对团块FS的DNS域与针对团块SS的DNS域不同。

为了将数据添加到文件,使用两个追加命令来追加数据。此外,冲刷命令被实施成将数据冲刷到磁盘。注意,追加是实际的数据I/O,而冲刷是索引更新,以使追加操作可由读取文件操作读取。

图26是根据一些示例实施例的用于在具有分层命名空间的云存储系统中执行分布式事务的方法2600的流程图。尽管顺序地呈现和描述了该流程图中的各种操作,但是本领域技术人员将理解,一些或所有操作可以以不同的顺序执行,被组合或省略,或者被并行执行。

操作2602用于从用户设备接收包括将由云存储系统执行的多个操作的请求,该请求用于多个操作的原子操作。

从操作2602,方法进行到操作2604,以用于标识用于执行多个操作的多个节点。每个节点具有相应的时钟,并且控制至少一个操作的执行状态。此外,每个节点具有存储器表的至少一部分,以用于控制对云存储系统中的实体的更新。实体是文件或目录之一。

从操作2604,方法进行到操作2606,以用于由多个节点中的每个节点处理相应的操作。处理一个操作包括执行方法操作2612-2617。

在操作2612处,进行检查以确定该节点是否是处理中的第一节点。如果该节点是第一个节点,则该方法进行到操作2613,并且如果节点不是第一个节点,则该方法进行到操作2614。注意,如果接收请求[0251]的节点不是处理中的第一个节点,则第一个节点充当协调器,以协调各个操作的执行。

在操作2613处,将提交时间戳(CS)设置为节点中的时钟的值。对于读取事务,如果用户尚未提供读取的时间戳,则事务管理器设置读取时间戳。对于写入事务,事务管理器选择从多个节点返回的提交CS的最大值。在操作2614处,进行检查以确定节点中的时钟的值是否小于CS的当前值,并且如果检查为肯定,则方法进行到操作2615,否则进行到操作2616。

操作2615用于等待节点中的时钟的值达到CS的当前值。此外,操作2616用于基于节点中的时钟的值来更新CS的当前值。

从操作2616,方法进行到操作2617,以用于基于CS的当前值来更新存储器表。

在操作2608处,利用CS的最终值在云存储系统中提交请求的原子执行。从操作2608,方法进行到操作2610,在此将请求的状态返回给用户设备。

在一个示例中,存储器表包括针对每个实体的条目的链表,每个条目对应于写入操作并且具有状态和CS。

在一个示例中,状态是活动、已提交或终止中的一种,其中活动指示事务仍在进行中,提交指示事务成功。

在一个示例中,每个时钟是宽松同步时钟、严格同步时钟、逻辑时钟或物理时钟之一。

在一个示例中,来自多个操作中的第一操作是读取操作,其中处理读取操作还包括基于CS的当前值执行快照读取,并且来自多个操作的第二操作是写入操作,其中处理写入操作还包括在存储器表中针对与写入操作相关联的实体添加条目,该条目包括CS的当前值。

在一个示例中,提交请求的原子执行还包括将在处理期间在节点的存储器表中创建的条目的状态从活动改变为以CS的最终值提交。

在一个示例中,节点是在云存储系统的存储层中的多个物理节点上执行的虚拟节点。

在一个示例中,原子执行包括执行所有多个操作,使得所有操作成功,或者没有操作被执行并且原子执行终止。

在一个示例中,云存储系统包括将实体映射到存储层中的团块的分层命名空间服务。

在一个示例中,提交请求的原子执行还包括向多个节点通知CS的最终值。

图27是根据一些示例实施例的用于提供对云存储系统的多协议访问的方法2700的流程图。尽管顺序地呈现和描述了该流程图中的各种操作,但是本领域技术人员将理解,一些或所有操作可以以不同的顺序被执行,被组合或省略,或者被并行执行。

操作2702用于通过云存储系统提供第一API,云存储系统将数据存储在容器内组织的团块中。

从操作2702,方法进行到操作2704,以用于由云存储系统提供第二API,第一API和第二API提供用于平面命名空间和分层命名空间的操作,以用于访问数据。平面命名空间是用于基于账户、容器和团块标识符来访问数据,并且分层命名空间用于基于账户、目录和文件来访问数据。目录被配置成包括文件和其他目录,其中第一API默认利用平面命名空间,并且第二API默认利用分层命名空间。

从操作2704,方法进行到操作2708,在操作2708中,由云存储系统接收来自用户设备的命令。

在操作2710处,进行检查以确定是经由平面命名空间还是分层命名空间接收到命令。如果经由平面命名空间接收命令,则方法进行到操作2712,并且如果经由分层命名空间接收命令,则方法进行到操作2714。

在操作2716处,利用命令中包括的容器和团块标识符来执行命令。此外,在操作2714处,分层命名空间服务被访问以将命令中包括的目录和文件转换为一个或多个团块标识符。

从操作2714,方法进行到操作2716,以利用由转换产生的一个或多个团块标识符来执行命令。在操作2718处,在执行命令之后将响应发送给用户设备。

在一个示例中,分层命名空间服务向每个文件和每个目录指派唯一标识符,该唯一标识符与文件或目录的名称不同。

在一个示例中,分层命名空间服务包括主目录块,以用于标识每个目录中包含的文件或目录。

在一个示例中,第二API包括以下命令:创建文件系统、删除文件系统、列出文件系统的路径、创建目录、重命名目录、删除目录、追加文件、冲刷文件和读取文件。

在一个示例中,重命名目录不需要重命名任何团块。

在一个示例中,经由第一API,利用具有用户的账户名称、容器标识符和团块标识符的地址来访问数据。

在一个示例中,经由第二API,利用具有用户的账户名称、文件系统标识符、目录标识符和文件标识符的地址来访问数据。

在一个示例中,文件被存储在团块中。

在一个示例中,分层命名空间服务指派空团块来保持目录的信息。

在一个示例中,云存储系统支持至少三种团块类型:块团块、追加团块和页面团块。

图28是根据一些示例实施例的用于在基于团块存储的云存储系统上提供文件系统功能的系统2800。系统2800包括云存储系统内的多个存储集群208。每个存储集群包括:多个存储节点2802、分层命名空间服务104和前端层210。每个存储节点2802包括将数据存储在容器2804内的团块110中的分区层,并且包括用于流化团块数据的流层214。

分层命名空间服务104用于对被存储在团块110中的数据实现文件系统功能,文件系统功能包括目录功能和文件功能,每个目录被配置成包括经由文件系统功能请求的文件和其他目录,每个文件被存储在一个团块中。前端层210用于处理访问和管理被存储在团块110上的数据的用户请求,前端层210访问分区层212以基于团块110的地址访问团块110,前端层210访问分层命名空间服务104来标识团块110。

在一个示例中,分区层被配置成标识用于平面命名空间操作的分区键,该分区键包括账户名称、容器名称和团块名称。

在一个示例中,分区层被配置成标识用于分层命名空间操作的分区键,该分区键包括账户名称、文件系统名称、目录名称和文件名称。

在一个示例中,分层命名空间服务包含一个或多个物理节点,物理节点具有用于执行命名空间映射的多个虚拟节点。

在一个示例中,分层命名空间服务包括多个目录块,其中全局唯一标识符响应于目录创建被指派给目录,并且其中响应于重命名目录,不改变全局唯一标识符。

在一个示例中,分层命名空间服务包括针对文件系统中每个实体的实体块,实体是目录或文件之一,其中针对实体的实体块在云存储系统中可以具有多个同时的版本。

在一个示例中,分层命名空间服务包括主目录表,主目录表标识每个目录内的文件和目录,其中执行目录或文件的移动不需要移动或复制团块。

在一个示例中,分层命名空间服务被配置为:用于将分层命名空间中的文件系统路径映射到平面命名空间中的团块标识符。

在一个示例中,云存储还包括位置服务,以用于管理跨多个存储集群的账户命名空间元数据。

在一个示例中,分层命名空间服务支持文件系统操作,包括:创建文件系统、删除文件系统、列出文件系统的路径、创建目录、重命名目录、删除目录、追加文件、冲刷文件和读取文件。

图29是图示机器2900的示例的框图,在其上或通过其可以实现或控制本文描述的一个或多个示例过程实施例。在备选实施例中,机器2900可以作为独立设备操作,或者可以连接(例如联网)到其他机器。在网络部署中,机器2900可以在服务器-客户端网络环境中以服务器机器、客户端机器或两者的能力操作。在一个示例中,机器2900可以在点对点(P2P)(或其他分布式)网络环境中充当对等机器。此外,虽然仅图示了单个机器2900,但是术语“机器”也应当被理解为包括机器的任何集合,这些机器单独地或共同地执行一组(或多组)指令以执行本文讨论的任何一个或多个方法,诸如经由云计算、软件即服务(SaaS)或其他计算机集群配置来执行。

如本文所述,示例可以包括逻辑、多个组件或机构或由其操作。电路装置是在包括硬件(例如,简单电路、门、逻辑等)的有形实体中实现的电路的集合。电路装置成员可能随时间推移以及潜在的硬件可变性而变得灵活。电路装置包括在操作时可以单独或组合执行指定操作的成员。在一个示例中,电路装置的硬件可以被不变地设计为实施特定的操作(例如,硬连线)。在一个示例中,电路装置的硬件可以包括可变地连接的物理组件(例如,执行单元、晶体管、简单电路等),其包括被物理地修改(例如,磁性地、电气地、通过不变质量粒子的可移动放置等)的计算机可读介质,来编码特定操作的指令。在连接物理组件时,硬件构件的基础电性能被改变(例如,从绝缘体到导体,反之亦然)。指令使嵌入式硬件(例如,执行单元或加载机构)能够经由可变连接在硬件中创建电路装置的成员,以在操作时实施特定操作的部分。因此,当设备操作时,计算机可读介质通信地耦合到电路装置的其他组件。在一个示例中,任何的物理组件可以被用在一个以上电路装置的一个以上的构件中。例如,在操作下,执行单元可以在一个时间点在第一电路装置的第一电路中使用,并且可以在不同的时间被第一电路装置中的第二电路或第二电路装置中的第三电路重新使用。

机器(例如,计算机系统)2900可以包括硬件处理器2902(例如,中央处理单元(CPU、FPGA)、硬件处理器核或其任意组合)、图形处理单元(GPU)2903、主存储器2904(例如,RAM、NVRAM)和静态存储器2906,它们中的一些或全部可以经由互连(例如,总线)2908彼此通信。机器2900还可以包括显示设备2910、字母数字输入设备2912(例如键盘)和用户界面(UI)导航设备2914(例如鼠标)。在一个示例中,显示设备2910、字母数字输入设备2912和UI导航设备2914可以是触摸屏显示器。机器2900可以附加地包括大容量存储设备(例如,驱动单元、SSD驱动器)2916、信号发生设备2918(例如,扬声器)、网络接口设备2920以及一个或多个传感器2921(诸如,全球定位系统(GPS)传感器、指南针、加速度计或其他传感器)。机器2900可以包括输出控制器2928,例如串行(例如,通用串行总线(USB))、并行或其他有线或无线(例如,红外(IR)、近场通信(NFC)等)连接,以与一个或多个外围设备(例如打印机、读卡器等)通信或对其进行控制。

大容量存储设备2916可以包括机器可读介质2922,在其上存储由本文描述的任何一种或多种技术或功能实施或利用的一组或多组数据结构或指令2924(例如,软件)。指令2924还可以在由机器2900执行它们期间,全部或至少部分地驻留在主存储器2904内、静态存储器2906内、硬件处理器2902内或GPU 2903内。硬件处理器2902、GPU 2903、主存储器2904、静态存储器2906或大容量存储设备2916中的一个的任何组合可以构成机器可读介质。

虽然将机器可读介质2922说明为单个介质,但是术语“机器可读介质”可以包括单个介质或多个介质(例如,集中式或分布式数据库和/或相关联的高速缓存和服务器),其被配置成存储一个或多个指令2924。

术语“机器可读介质”可以包括任何介质,该介质能够存储、编码或携带由机器2900执行的指令2924并且使得机器2900执行本公开的任何一种或多种技术,或者可以存储、编码或携带由这种指令2924使用或与之相关联的数据结构。非限制性机器可读介质示例可以包括固态存储器以及光学和磁性介质。在一个示例中,大容量机器可读介质包括机器可读介质2922,机器可读介质2922具有具有不变(例如,静止)质量的多个粒子。因此,在当地法律不允许要求保护信号的范围内,大容量机器可读介质不是暂态传播的信号。大容量机器可读介质的特定示例可以包括非易失性存储器,诸如半导体存储器设备(例如,电可编程只读存储器(EPROM)、电擦除可编程只读存储器(EEPROM)和闪存设备、磁盘(诸如,内部硬盘和可移动磁盘)、磁光盘,以及CD-ROM和DVD-ROM磁盘。

指令2924还可以经由网络接口设备2920,使用传输介质在通信网络2926上传送或接收。

贯穿本说明书,多个实例可以实现被描述为单个实例的组件、操作或结构。尽管将一个或多个方法的各个操作图示和描述为单独的操作,但是可以并发地执行各个操作中的一个或多个操作,并且不需要按所示顺序执行操作。在示例配置中呈现为单独组件的结构和功能可以被实现为组合结构或组件。类似地,被呈现为单个组件的结构和功能可以实现为单独的组件。这些和其他变型、修改、添加和改进落入本文主题的范围内。

本文说明的实施例被充分详细地描述,以使本领域技术人员能够实践所公开的教导。可以使用其他实施例并且从中得出其他实施例,使得可以在不脱离本公开的范围的情况下进行结构和逻辑上的替换和改变。因此,不应当以限制意义理解具体实施方式,并且各种实施例的范围仅由所附权利要求以及赋予这些权利要求的等同物的全部范围来限定。

如本文所使用的,术语“或”可以以包含或排除的含义来解释。此外,可以为本文中描述为单个实例的资源、操作或结构提供多个实例。另外,各种资源、操作、模块、引擎和数据存储之间的边界在某种程度上是任意的,并且在特定说明性配置的上下文中示出了特定操作。功能的其他分配可以被预期,并且可以落在本公开的各种实施例的范围内。通常,在示例配置中呈现为单独资源的结构和功能可以被实现为组合结构或资源。类似地,被呈现为单个资源的结构和功能可以被实现为单独的资源。这些和其他变型、修改、添加和改进落入如由所附权利要求表示的本公开的实施例的范围内。因此,说明书和附图应当被认为是说明性而不是限制性的。

相关技术
  • 云存储分布式文件系统
  • 一种基于分布式文件系统的移动云存储安全访问控制方法
技术分类

06120112210906