用于存储编码三元组的数据库控制器、方法及系统与流程

文档序号:12702089阅读:281来源:国知局
用于存储编码三元组的数据库控制器、方法及系统与流程
本发明涉及数据存储领域。具体地,本发明的实施例涉及用于描述图形数据的三元组在分布式存储环境内的存储。

背景技术:
关系数据库按照行与列来存储数据。行与列组成了需要在存储数据之前被限定的表。对这些表以及对包含在这些表上的数据之间的关系的限定被称为模式。关系数据库使用固定的模式。通过以节点和弧的形式存储数据,图形数据库表现出对关系数据库的显著扩展,其中节点表示实体或实例,弧表示任意两个节点之间的某种类型的关系。在无向图中,认为从节点A至节点B的弧与从节点B至节点A的弧相同。而在有向图中,这两个方向被处理为不同的弧。图形数据库用于各种不同的应用,这些应用一般可以分为两种主要类型。第一种类型由具有较大的类描述集的复杂的基于知识的系统组成(称为“基于知识的应用”),如智能决策支持及自学习。第二种类型包括涉及对交易数据进行图形搜索的应用(称为“交易数据应用”),如社交数据及商业智能。很多应用可以同时表现出这两个类型。但是,大多数应用可以主要地表征为基于知识的应用或交易数据应用。图形数据库可以用于维护能够将大量的结构化或非结构化数据存储在各种字段中的大型“语义网络”。语义网络以知识表示的形式被使用,并且是由表示概念的节点和表示这些概念之间的语义关系的弧组成的有向图。有多种类型的图形表示。图形数据可以作为多维数组或作为链接至其他符号的符号来存储在存储器中。另一种形式的图形表示是“元组”的使用,“元组”是由每个都具有特定类型的对象组成的有限序列或有序列表。已知包含n个对象的元组为“n元组”,其中n可以是大于0的任意非负整数。通常将长度为2的元组(2-元组)称为对(pair),将3-元组称为三元组,将4-元组称为四元组等等。资源描述框架(RDF)是作为语义网络标准的用于概念描述或信息建模的一般方法。当今可用的RDF数据量在不断地增长并且已经不可能将其存储在单个服务器中。为了能够存储和搜索大量的数据,必须在多个服务器中对数据进行维护。必须使用针对分布式系统专门定制的算法和数据结构以协同的方式来完成数据的添加、删除和查询。期望以使得能够进行计算效率高的数据查询、维护和操作的方式来存储图形数据。如同所有的计算硬件一样,也总是存在存储数据的存储节点(如服务器)会出现故障的某种风险。因此,已知在本领域中提供存储数据拷贝的“冗余”存储节点以防存储节点出现故障。但是,从基础设施的提供、维护及运行成本的方面来讲,提供这样的冗余存储节点会很昂贵。随着存储节点的可靠性的增加,从单次使用成本方面来讲,单纯为了在另一个节点出现故障时能够进行数据恢复而提供冗余存储节点的价值在不断减小。

技术实现要素:
本发明的实施例提供了用于存储被编码为三元组的图形数据的数据库的数据库控制器,每个三元组包括主语、谓语和宾语,并且每个三元组存储在数据项集合中的数据项内,所述数据项集合是根据存储在数据项内的三元组来排序的。每个数据项存储在分布于网络中的多个存储节点中的存储节点中。该数据库控制器包括:存储请求接收器,其被配置成接收在该数据库中存储三元组的请求;以及数据项生成模块,其被配置成生成两个或更多个数据项,每个数据项具有三元组的以下不同版本:第一版本,其中在数据项中主语在谓语和宾语之前;第二版本,其中在数据项中谓语在主语和宾语之前;以及第三版本,其中在数据项中宾语在主语和谓语之前。数据库控制器还包括:指令分配器,其被配置成针对所述两个或更多个数据项中的每一个数据项,从所述多个存储节点中选择存储节点以指示存储该数据项,该选择是依靠该数据项在所述经排序的集合中的位置做出的。所述指令分配器包括冗余模块,所述冗余模块被配置成确保指示所述多个存储节点中的至少两个不同存储节点存储包括三元组的版本的数据项。有利地,本发明的实施例提供了容错分布式存储系统,其利用排序来存储和查询被存储为三元组的图形数据。实施例提供或实现了以下用于存储数据的技术:所述技术使得在对所存储的数据的范围查询的执行上以及当存储节点出现故障时对所存储的数据的恢复上都具有很高的效率。为了执行有效的范围查询(rangequery),按照至少两种(例如,三种)不同的顺序,例如,SPO、POS和OSP(其中贯穿本文献,可以用P表示谓语,用S表示主语,以及用O表示宾语)中的两种(或三种),来存储三元组。同一三元组的两个或更多个版本中的首项元素的变化是头等重要的。虽然不是必需的,但也期望剩余两个元素的位置的变化。所述冗余模块或等同的功能确保出于有效的范围查询目的而提供的三元组的至少两个不同版本还可以充当副本,以便当存储节点出现故障时提供容错性。总之,本发明的实施例提供了以下数据库,该数据库将图形数据存储为按两个或更多个版本复制的编码三元组,其中每个版本(以其被存储的形式)将该三元组的不同元素作为首项元素以提供有效的范围查询;并且该数据库还使用那些复制的版本来提供数据冗余以进行丢失数据的再生。在本发明的实施例中,每个三元组(如RDF三元组)被存储为数据项或数据项的一部分,例如存储为简单的字符串对象,并且在图形G中是唯一的。所以关于G的所有信息都保存在数据项中。三元组作为数据项(按照数据项来编码)被存储在有序数据集合中,该有序数据集合分布在分布式网络环境(如对等网络环境)中的网络存储节点中的处理中。运行在每个存储节点上的处理有利于存储数据项的有序子集。该处理和运行该处理的网络存储节点在本文献中或多或少可互换地被引用,从上下文中可以清楚地看出何时专门地意指前者或后者。本发明的实施例使得能够对数据运行有效的查询过程。例如,对dmin与dmax(当按次序放置时)之间的数据项范围进行检索的过程执行以下步骤:客户端应用程序向处理之一A发送请求;A执行映射功能,获取该处理的包含所请求的数据范围的一个子集的各个存储节点ID(或标记)(在示例性情况下,数据项均匀地分布并且每个处理负责存储大量的数据项)。例如,考虑客户端应用程序请求的数据项存储在处理A和处理B中;A向自身和向B广播对所请求的数据项的每个子集进行检索的请求;每个处理以所请求的数据项来回复A;A收集结果(保持它们的顺序)并且回复客户端应用程序。从上面的示例可以看出,本发明的实施例能够更有效地查询数据。此外,如在使用常规技术的情况下一样,不需要按请求中的每个数据项来重复步骤。本发明的实施例中的图形数据可以是有向图形数据,所以从第一图形节点至第二图形节点的弧不被认为是与从第二图形节点至第一图形节点的弧相同。语义网络形成为知识或信息的表示,其中图形节点表示概念如实体或实例,而弧表示概念之间的语义关系。在本发明的实施例中,将图形数据编码为三元组,所述三元组是三个对象的有限序列或有序列表,每个对象都具有特定类型。可选地,三元组可以是资源描述框架(RDF)三元组。贯穿本文献,应当理解,在引用“RDF三元组”的地方,它是三元组的示例性形式,遵守RDF标准。此外,对“三元组”的引用包括正在讨论的三元组是RDF三元组的可能性。类似地,在本文献其他地方所讨论的RDF处理器是用于API包装器与所存储的数据项之间的交互的处理器的示例。资源描述框架(RDF)是作为语义网络的标准的用于概念描述或信息建模的一般方法。对语义网络中的信息建模进行的标准化允许运行在共用语义网络上的应用程序之间的互操作性。RDF通过提供作为用于描述RDF中的词汇表的语言的RDF模式(RDFS),来维护具有明确的正式语义的词汇表。可选地,三元组的元素中的一个或更多个元素中的每一个元素(元素是谓语、宾语或主语)是统一资源标识符(URI)。RDF和其他三元组格式是以以下概念为前提的:使用如URI等网络标识符来标识事物(即,对象、资源或实例),并且从简单的属性和属性值方面来描述那些所标识的“事物”。从三元组方面来讲,主语可以是用于标识用于描述实体的网络资源的URI,谓语可以是用于标识属性的类型(例如颜色)的URI,并且宾语可以是用于指示具有特定类型属性的具体实例的URI,所述特定类型属性在其网络资源具体化方面归属于所述实体。URI的使用使得三元组能够将关于资源的简单语句表示为由表示资源以及它们各自的属性和值的节点和弧组成的图形。可以使用SPARQL协议和RDF查询语言(SPARQL)来查询RDF图形。这由万维网联盟的RDF数据存取工作组(DAWG)标准化,并且被认为是一种关键的语义网络技术。SPARQL允许由三元组模式、与运算、或运算和可选模式组成的查询。三元组通过将图形数据表征为多个主谓宾表达式来进行图形数据的编码。在该情况下,主语和宾语是图形数据的图形节点,如实体、对象、实例或概念,并且谓语是主语与宾语之间的关系的表示。谓语通过提供与宾语的特定类型的联系来断言与主语有关的事情。例如,主语可以指示网络资源(例如,通过URI),谓语指示资源的特定特性、特征或方面,宾语指定该特性、特征或方面的实例。换言之,三元组语句的集合固有地表示有向图形数据。RDF标准提供这样的三元组的正式化结构。存储节点的分布式网络包括由彼此进行通信的不止一个不同存储单元组成的系统。示例性通信范例是对等型(P2P),因此存储节点的分布式网络可以是存储节点的对等网络。P2P是在对等体(peer)之间划分任务或工作量的分布式结构。对等体(各个存储节点或处理)是应用中等同地被特许的同等参与者。每个对等体被配置成使得其资源(如处理能力、磁盘存储器或网络带宽)的一部分直接可用于其他网络参与者,而不需要服务器或稳定主机的中心协调。相比服务器提供以及客户端消耗的传统的客户端-服务器模型,对等体可以认为是资源的提供者和消耗者两者。有利地,P2P系统能够以对数通信成本来维护交换消息的大批存储节点。在实施例中,例如在三元组的宾语很复杂的那些实施例中,存储在有序数据项中的宾语可以是针对该宾语生成的通用唯一ID(UUID)。该选项在用于以下实现场景中的实施例中是很有用的,在所述实现场景中宾语很大,因此它们的大小降低了范围查询过程的效率。在本发明的实施例中,三元组存储在有序数据项中,所以返回数据项的查询使得三元组的表示能够被检索。如果同一三元组的不同版本存储在不止一个不同存储节点上,则出于有效的范围查询目的对上述不同版本进行的存储还可以有益于数据恢复。因此,本发明的实施例中冗余模块的提供消除了以下需要:复制每个数据项以提供数据冗余,使得能够当存储节点出现故障时进行恢复。可选地,数据项生成模块被配置成生成三个数据项,每个数据项具有三元组的第一版本、第二版本和第三版本中的不同版本。有利地,使数据项具有三元组的三个不同版本使得能够通过三元组的三个元素中的任一元素来进行有效的范围查询。也就是说,可以指定主语、宾语或谓语的范围,并且以有效的方式返回存储包括在该范围内的三元组的数据项。可以将冗余模块配置成确保指示至少两个不同存储节点中的每一个节点存储包括该三元组的不同版本的数据项。例如,在所述多个存储节点中有三个或更多个存储节点的实施例中,可以将冗余模块配置成确保指示所述多个存储节点中的三个不同存储节点中的每一个存储节点存储包括该三元组的不同版本的数据项。在该特定的实现中,存储三元组的三个不同版本的数据项自身分布在网络中的三个不同的存储节点上(每存储节点分布一个数据项)。这是有利的,这是因为应用三元组的三个不同版本的优点,另外,如果存储那些版本中的任何一个的存储节点出现故障,则有两个其他存储节点还存储着该三元组的版本,所以存储在故障存储节点上的版本可以以有效的方式重新生成。可替代地,可以将冗余模块配置成确保三个不同存储节点中的每个存储节点都存储三元组的版本,但是它们不必是不同的版本。例如,如果指令分配器所执行的映射过程导致同一三元组的两个不同版本在一个存储节点上而另一个不同版本在另一个节点上,则冗余模块可以简单地生成该三元组的特定版本(例如,SPO)的副本以存储在第三个存储节点上,而不管在所述一个存储节点和所述另一个存储节点中的每一个存储节点上存储的是该三元组的哪一个现有版本。在本发明的实施例中,可以按照表示三元组的元素的字符串对象的词典顺序来对数据项进行排序,字符串对象是数据项或包括在数据项中。例如,词典顺序可以是字母顺序。在本发明的实施例的实现中,可以期望通过选定数据项的主语、谓语或宾语(或宾语的UUID)来查询数据项的集合。为了有效地返回这样的查询的结果,在数据项中将三元组的两个或更多个元素存储为第一元素是有利的。排序的数据项使得能够做出数据项之间的比较并且执行范围查询。D1与D2(其中D1<D2)之间的范围查询是以下查询:该查询根据数据项的某种预定排序标准来返回包含在大于D1而小于D2的数据项的经排序的集合中的数据项。当然,该数据项集合被划分到节点的分布式网络的节点(其中节点是如服务器或运行在那些服务器上的处理等资源)中。在示例性实施例中,由如代表应用程序的RDF处理器等处理器通过向节点之一发送查询来发起范围查询。节点被配置成例如通过对D1和D2应用数据项的逻辑表示并且对这些节点执行子范围查询来计算哪些其他节点具有查询所寻找的数据项。节点则被配置成收集结果(保持数据项的顺序)并且将结果返回给发起该查询的处理器。从三元组在数据项内的存储形式来讲,每个数据项可以包括字符串对象,所述字符串对象包括对应三元组的主语、谓语和宾语。有利地,字符串对象是普遍可读的并且建立了用于其比较的例程,并且存在其他处理需求。数据库自身和访问数据库的应用程序可以具有良好建立了的例程以用于处理字符串对象。此外,字符串对象易于快速搜索和比较(顺序)。在这样的实施例中,可以根据字符串对象的字母顺序比较来对数据项进行排序。有利地,如搜索、测距和其他比较功能等数据库功能是可用的,这些数据库功能在比较字符串数据对象的字母顺序内容的计算效率方面被优化。因此,以此方式对数据项进行排序的实施例在计算效率方面特别有效。在这样的实施例中,可以根据数据项的字符串对象的字母顺序来对数据项进行排序。数据项可以仅仅是字符串对象,或它们可以包括其他对象或数据。字符串是字母数字符号的序列。可选地,可以将指令分配器配置成通过使用有序哈希表来从所述多个存储节点中选择存储节点以指示存储数据项。有利地,哈希表提供了将数据项映射(其中映射从含义上等同于从所述多个存储节点中选择存储节点以指示存储数据项)至节点的计算效率高的方法。有序哈希表使用哈希函数来基于数据项的内容将数据项分配至节点。在键值系统中,哈希表或哈希图是使用哈希函数将标识已知为键的值映射至它们相关联的值的数据结构。因此,可以说哈希表实现了关联数组。哈希函数用于将键变换成其中对应的值要被寻找的数组元素(存储位置,也称为缝或槽)的索引(哈希)。可选地,有序哈希表可以使用一致性哈希函数。一致性哈希处理规定了需要响应于存储数据项的存储节点的数量变化来重新映射的有序数据项的数量。例如,考虑D个数据项分布在对等系统中的n-1个“对等体”中的系统。如果新的对等体加入到该系统中,则仅需要重新映射D/n个键。在一致性哈希处理中,如果有新的对等体添加至该系统中,则该对等体从其他对等体取得所存储数据项的近似相等的份额,并且当移除对等体时,其数据项在剩余的对等体之间分配。由指令分配器用来选择存储节点以指示存储具体数据项的技术,无论是哈希函数还是其他技术,该技术都应该是确定性的。也就是说,从多个存储节点中选择存储节点以指示存储数据项是确定性选择。因此,该选择的结果可以由网络中的另一个数据库控制器或在后后续操作中由同一数据库控制器来确定。在具有不止一个数据库控制器的实施例中,每个数据库控制器使用相同的确定性选择过程由,所以在给出相同的输入变量的情况下,会产生相同的结果。关于KVS布置的值中的附加信息或是关于以三元组存储在数据项中的数据,在本发明的实施例中,存储同一三元组的不同版本的两个或更多个数据项中的每一个数据项还可以包括用于标识存有该三元组的不同版本的其他数据项中的每一个数据项所存储于的存储节点的数据。有利地,包括标识存有同一三元组的不同版本的其他数据项中的每一个数据项所存储于的存储节点的数据使得存储在还没有出现故障的节点上的数据项能够用于识别存储在故障节点上的数据项,因此需要被恢复或重新生成。存储节点可由ID来标识,并且可以对ID进行重新排序,以使得当数据项分布在存储节点的网络中并且被存储时,数据项的经排序的集合的顺序被保持。例如,可以通过对存储节点在该网络中的地址应用哈希函数来获得ID。用于实施本发明的数据库控制器还可以包括故障检测器,该故障检测器被配置成检测存储节点的分布式网络中的存储节点何时出现了故障并且识别存储在故障存储节点上的数据项项内的三元组,其中数据库控制器被配置成针对每个所识别的三元组在数据项生成模块处执行生成处理以及在指令分配器处执行选择处理,其中故障节点被从在其中选择存储节点的多个存储节点中排除。所述指令分配器被配置成指示所选择的存储节点存储具有所识别的三元组的版本的数据项,并且被配置成指示将现在没有被选择的存储节点在故障之前存储的具有所识别的三元组的版本的任何数据项移除。有利地,故障检测器和数据库控制器的关联功能在存储节点故障的情况下提供有效的数据恢复处理,同时最小化与单纯出于数据恢复目的而存储拷贝有关的系统成本。可选地,在实施本发明的数据库控制器中,冗余模块可以被配置成:在针对所述两个或更多个数据项而进行存储节点选择之后,获得所选的用于存储所述两个或更多个数据项的存储节点中的不同存储节点的数量的计数,并且如果该计数小于冗余模块被配置成确保其被指示存储包括该三元组的版本的数据项的不同存储节点的数量,则将冗余模块配置成指示所述多个存储节点中的特定数量的附加存储节点存储包括该三元组的版本的数据项,该特定数量等于所述计数与冗余模块被配置成确保其被指示存储包括该三元组的版本的数据项的不同存储节点的数量之间的差。在指令分配器所使用的选择过程是确定性的情况下,这样的冗余模块是特别有用的,因为它使得能够在不扰乱数据项与存储数据项的存储节点之间的关系的确定性属性的情况下存储数据项的副本以进行数据恢复。冗余模块被配置成确保其被指示存储包括三元组的版本的数据项的不同存储节点的数量为两个或更多个并且是特定于实现的,但是在优选的实施例中是3个。因此,被指示存储包括三元组的版本的不同存储节点的数量是3减去该计数。包括三元组的特定版本(例如,SPO)的数据项的副本可以被做出并且可以存储在附加存储节点上。此外,附加存储节点所存储的数据项可以存储在数据项的经排序的集合之外。有利地,这确保数据项的经排序的集合的顺序被保持,并且数据项与存储数据项的存储节点之间的关系的确定性属性也被保持。在替代实施例中,冗余模块被引入至指令分配器所使用的哈希算法中以从所述多个存储节点中选择待存储数据项的存储节点。本发明的实施例还包括计算设备如服务器,该计算设备用作实施本发明的数据库控制器。例如,所述计算设备可以是分布式网络中的存储节点之一。此外,所述计算设备可以是多个这样的计算设备之一,以使得在存储节点的分布式网络中,所述多个存储节点中的不止一个(例如,全部)存储节点具有实施本发明的数据库控制器的功能。本发明的实施例包括计算机程序或存储计算程序的非瞬态存储介质,当由计算设备执行该计算机程序时,该计算机程序使得该计算设备用作实施本发明的数据库控制器。本发明还可以由用于将编码为三元组的图形数据存储在数据库中的方法来实施,每个三元组包括主语、谓语和宾语,并且每个三元组存储在数据项集合中的数据项内,该数据项集合是根据存储在数据项内的三元组来排序的,其中每个数据项存储在分布于网络中的多个存储节点中的存储节点上。所述方法包括:接收在数据库中存储三元组的请求;生成具有三元组的以下版本中的不同版本的两个或更多个数据项:第一版本,其中在数据项中主语在谓语和宾语之前;第二版本,其中在数据项中谓语在主语和宾语之前;以及第三版本,其中在数据项中宾语在主语和谓语之前。这样的方法还包括:针对所述两个或更多个数据项中的每一个数据项,从所述多个数据节点中选择存储节点以指示存储数据项,所述选择是依靠该数据项在所述经排序的集合内的位置来做出的;以及,确保指示所述多个存储节点的至少两个不同存储节点来存储包括该三元组的版本的数据项。在本文献中所讨论的数据项可以是在表中按行或表项存储的独立的信息。但是,发明实施例包括其中每个数据项都是键值系统(KVS)内的键值对的键的实现。有利地,在键值系统的键内存储包括完整三元组的键使得能够对返回该完整三元组的键集合执行功能,而不是仅仅对可能发现三元组的地点的链接或标识执行功能。存储在键值对的键中包括将三元组的元素表示为自身是该键值对的键的字符串对象。键值系统(KVS)或键值存储是多个所存储的键和值,其中每个键具有关联值,通过逻辑函数或逻辑树例如哈希表或哈希图来将该键映射至该关联值。哈希表或哈希图是使用哈希函数将各个键(标识值)映射至它们的关联值的数据结构。在本发明的实施例中,可以使用哈希函数来将键变换为用于形成存储节点的分布式网络的所述多个存储节点中的存储节点(存储资源)的标识。可以提供以下实施例:在所述实施例中,所述多个键值对中的每一个键的值包括与该键内存储的三元组有关的附加信息。例如,关于三元组的元数据存储在该值中。在此上下文中,元数据是关于三元组中的信息项的描述性数据。该键存储三元组并且该值存储关于该三元组的信息。可选地,在这样的实施例中,附加信息是依靠其身份来访问数据库的应用程序可获得的数据。有利地,这样的实施例通过使能在数据库中读取和/或写入数据的依赖于应用程序的方面来扩展数据库的功能。该数据是依赖于应用程序的数据,并且可以作为模糊对象在KVS中被查看和处理。值容器还可以包括设置和检索依赖于应用程序的数据的API。可选地,在上述KVS实现中,附加信息包括被注册用于当对存储在键值对内的RDF三元组进行读和/或写访问时接收通知的应用程序列表。此外,该附加信息可以包括用于由存储该容器的节点执行的软件代码。例如,可以响应于特定事件来存储和调用该软件代码,该软件代码的变元也存储在该容器中。例如,值可以将软件代码块存储为更新函数。当更新所关联的三元组时,调用更新函数,其中将其他三元组的列表以及它们的位置作为变元。该其他三元组的列表可以由客户端应用程序通过将三元组添加至与特定事件相关联的容器中的列表来产生。有利地,在对三元组数据进行读或写访问时通知应用程序增强了数据库与使用存储在该数据库中的数据的应用程序之间的交互水平。对注册为接收通知的应用程序列表的维护提供了能够管理通知的机制。附图说明仅作为示例,现在将参考附图来描述本发明的优选特征,其中:图1是实施本发明的数据库控制器的示意图;图2是实施本发明的系统的示意图;以及图3示出了图1的数据库控制器的组件与图2的软件层对应的示例。具体实施方式图1示意性地示出了实施本发明的数据库控制器。数据库控制器10包括多个组件:存储请求接收器12、数据项生成模块14和自身包括冗余模块18的指令分配器16。这些组件本身可以由专用硬件例如处理器、内存、存储器以及网络接口来实现,在适当的情况下,所有这些硬件被配置成以下述方式来工作。可替代地,数据库控制器可以是由运行在计算设备上的计算程序(或由协作地运行在不止一个计算设备上的一组计算机程序)提供的功能,所述计算设备比如是自身可以是节点20的分布式网络中的存储节点的服务器。在这样的实施例中,上述组件是功能单元或模块,这些功能单元或模块中的每一个利用作为计算设备自身的一部分的硬件来实现其所述功能。数据库控制器10可以实现为单个存储节点上的集中控制器,由协作的多个存储节点实现的集中控制器,或者实现为其中每个都位于相应的存储节点上的多个等同控制器中的控制器。例如,可以由运行在由节点组成的分布式网络中的存储节点上的程序来提供数据控制器10,并且一个或更多个其他存储节点也可以运行等同的程序以使得能够通过多个数据库控制器10来访问数据库。数据库控制器10被示出为连接至由存储节点20组成的分布式网络。始于指令分配器16并且止于存储节点的箭头被示出为具有方向性以表示存储正在分发的数据项的指令。但是,数据库控制器与分布式存储节点的网络之间的数据连接可以是双向的。实际上,在本发明的实施例中,每个存储节点和数据库控制器可以通过网络来彼此进行通信,而不管该网络是有线的、无线的或两者的组合。节点20的分布式网络中的每个存储节点可以具有如数据库控制器10的数据库控制器。存储请求接收器12被配置成接收在数据库中存储三元组的请求。该请求可以来自例如运行希望向数据库添加新的三元组的应用程序的客户端设备。存储请求接收器12可以例如是RDF层或RDF层的一部分,并且处理以下请求:向数据库添加三元组的请求,还可能从数据库移除三元组的请求,以及读取或查询数据库的请求。希望访问数据库的应用程序与数据库自身之间的交互是通过存储请求接收器12来实现的,并且可以是以由应用程序编程接口(API)指定的形式,应用程序编程接口由数据库控制器10和/或节点20的分布式网络中的一个或更多个存储节点输出。存储请求接收器12可以被配置成执行以下处理:解释来自应用程序的请求并且基于该请求来生成针对数据库控制器10的其他组件的指令。例如,存储请求接收器12可以提取表示形成三元组存储请求的基础的三元组的字符串,并且将所提取的字符串(或三元组的其他数据表示)传递至数据项生成模块14。数据项生成模块14被配置成生成两个或更多个数据项,其中每个数据项具有三元组的以下不同版本:第一版本,其中在数据项中主语在谓语和宾语之前;第二版本,其中在数据项中谓语在主语和宾语之前;以及第三版本,其中在数据项中宾语在主语和谓语之前。还可以预先确定三元组的剩余元素在每个版本中出现的顺序。数据项生成模块14可以被配置成生成三个数据项,其中每个数据项具有上面列出的三个版本中的不同版本。数据项生成模块14可以是RDF层、RDF层的一部分、或RDF层的一部分和存储层的一部分的组合。数据项生成模块14被配置成执行从存储请求接收器12接收三元组或表示三元组的数据所需要的处理,以及产生所需的三元组的不同版本,并且还可能将三元组的那些不同版本封装到具有或不具有附加数据的特定格式的数据项中。数据项生成模块14被配置成将所生成的数据项传递至指令分配器16。指令分配器16被配置成:针对上述两个或更多个数据项中的每一个,从多个存储节点20中选择存储节点以指示存储数据项,该选择是依靠该数据项在经排序的集合内的位置做出的。包括冗余模块18的指令分配器16被配置成确保多个存储节点20中的至少两个不同存储节点被指示为存储包括该三元组的版本的数据项。指令分配器16可以是存储层的一部分,并且被配置成执行指示存储节点存储特定数据项所需要的处理,例如,将包括数据项的请求经由网络发送至存储节点,或促使发送这样的请求。例如,指令分配器16(通过冗余模块18)可以配置成以确定性方式以及以确保没有同一三元组的两个版本存储在同一存储节点的方式来将数据项映射至存储节点。可替代地,指令分配器可以负责将数据项映射至存储节点(例如,使用确定性哈希函数),并且冗余模块被配置成对具有特定三元组的两个或更多个不同版本的数据项的映射进行检查,其中该映射不导致:多于一个的存储节点存储该三元组的一个版本,生成具有该三元组的数据项的副本,以及指示除了被指示存储所检查的数据项的存储节点以外的存储节点存储该附加的副本。节点20的分布式网络可以是例如分布式对等网络。这样的网络是可扩展的并且可以包括大量的服务器。实际上,数据项的有序集的分布水平越高,冗余模块就越容易确保需要数量的存储节点被指示为存储包括三元组的版本的数据项。图2示出了实施本发明的系统。在图2中,各个服务器1-N和应用程序30都在计算机中执行。所有的计算机通过网络来可通信地连接。不同模块之间的箭头表示网络通信,尽管这些箭头意在强调下文所讨论的通信,但是不对在这样的系统架构中的模块之间的可能的通信构成限制。应用程序30使用明确定义的API来与服务器之一进行交互,上述API由所有的服务器1-N输出。每个服务器具有由3个软件组件构成的数据库控制器:RDF层11,RDF层11处理来自应用程序的以下请求:添加和移除数据,或对现有数据进行高水平查询。所述应用程序请求被转换为低水平请求并且被转发至存储层。RDF层11负责将RDF数据转换成三元组的简单和统一表示。高水平查询还必须被转换成一组范围查询(rangequery)。RDF层11是存储请求接收器12的示例;存储层15,存储层15负责数据项的生成与分配,并且负责范围查询的执行。存储层15是数据项生成模块14、指令分配器16和冗余模块18的示例;故障检测器19,故障检测器19负责看门狗的执行,看门狗可以检测服务器故障并且向存储层15通知剩余(未出现故障)的服务器。存储层15和故障检测器19使用通信网络与位于不同服务器上的类似组件进行通信。本实施例的数据库是由存储系统提供的,该存储系统由通过网络进行通信的服务器(存储节点)20的分布式集合组成的。组成该系统的服务器20的该集合还实现分布式有序哈希映射。应用程序30(例如运行在可以通过网络连接至一个或更多个服务器20的客户端机器上的应用程序)通过连接至上述服务器之一来与该系统进行交互。客户端应用程序30具有例如通过添加新的三元组、移除三元组以及执行范围查询来实现的添加、移除和查询RDF数据的接口。服务器20通过网络彼此进行通信,并且通过每个服务器都运行作为它们各自数据库控制器10的组件的故障检测模块19来运行分布式故障检测器。当处理P出现故障时(其中处理P用于指代由服务器20的分布式集合中的服务器实现的存储处理),最终,其他处理会从指示P出现故障的故障检测器接收通知。该实施例的数据库中的数据被存储为三元组,例如RDF三元组。RDF三元组是[主语,谓语,宾语]或简单地为SPO形式的RDF数据。该数据以以下方式来存储:能够使用以不同的顺序如POS或OSP等存储同一三元组的副本来有效地执行范围查询。在本发明的实施例中,副本还用于数据恢复处理。根据每个数据项中的三元组数据来对存储在数据库中的数据集合进行排序。数据集合的范围被分成N段,其中N是将用作存储器的服务器的数量。每个服务器负责一个数据段。当将数据添加至系统时,生成每个三元组的至少两个(优选地为三个)版本并且将这些版本存储在至少两个(优选地为三个)不同的服务器中。由存储层15(指令分配器16)使用如一致性哈希算法等确定性技术来针对每个三元组版本计算段(及其对应的服务器地址或ID)。每个三元组版本自然可以存储在不同的服务器上,但是一致性哈希算法不能总是保证该属性。在各个三元组版本没有存储在不同服务器上(或上述版本没有分布在至少两个不同的服务器上)的情况下,将三元组的附加拷贝存储在不同服务器上的数据项中。可以使用确定性过程来本地地(例如,在每个数据库控制器10处)计算其中存储了具有特定三元组的数据项的所有服务器。由于范围查询是对已经存储在有序集合中的数据来执行的,所以发起范围查询的服务器还可以计算需要被本地查询的服务器的列表。以不同的版本存储的三元组的至少两个(优选地为三个)版本用于两个目的:有效地执行范围查询,而不管在范围查询中指定的前缀如何(即,可由主语、谓语或宾语来指定范围并且仍然可以有效地处理该范围);以及从故障中恢复数据。当包含SPO形式的三元组的服务器出现故障时,在系统中存在一个或更多个附加拷贝:POS和OSP。这些三元组包含完全相同的但是以不同的顺序来表示的数据。使用该信息,实施本发明的系统提供了从三元组的不同表示中检索丢失数据的机制。恢复丢失数据并且重新计算每个三元组的新位置。当有服务器(或处理)出现故障时,幸存服务器具有足够的信息去了解哪些三元组需要被恢复和改组。不仅期望该恢复处理保持确保容错性所需的副本的数量,而且还期望该恢复处理确保数据位于系统中的所有服务器可确定性地达到的服务器中。如前面所概述的,一致性哈希算法是将数据段映射至服务器的非常有效的方式,并且在本发明的实施例中可以由存储层15(指令分配器16)使用以选择指示哪个存储节点(服务器)来存储包括三元组的版本的数据项。这种哈希方法可以针对存储同一三元组的每个数据项选择不同的服务器,但是取决于数据项、服务器的相对数量和哈希算法(例如,其要求保持数据项之间的相对顺序),也不是必需是该情况。因此,本发明的实施例提供有以下机制:确保存储同一三元组的不同版本的数据项被存储在至少两个(优选地为三个)不同服务器中。更具体地,存储层15(指令分配器16)提供有以下功能(冗余模块18):处理三种不同的场景以确保系统总是在例如三个不同的服务器中具有三元组的至少一份拷贝:在第一场景中:三元组的三个版本(SPO、POS和OSP)自然地存储在不同的服务器中。例如,SPO存储在服务器1中,POS存储在服务器2中,以及OSP存储在服务器3中。在该情况下,不需要采取另外的动作。在第二场景中:三元组的两个版本存储在同一服务器中,并且一个版本存储在另一个服务器中。例如,SPO和POS存储在服务器1中,并且OSP存储在服务器2中。在该情况下,仅两个服务器会具有该三元组的版本,系统对于该特定数据项会有更低的容错性。为避免这种情况,数据库控制器10(例如,通过冗余模块18)执行为将额外的拷贝存储在第三服务器中所需要的处理。在第三场景中:三元组的所有三个版本SPO、POS和OSP存储在同一服务器中(例如,服务器1)。在该情况下,如果服务器1出现故障,则系统会丢失该数据项。为了确保相同水平的容错性,数据库控制器10(例如,通过冗余模块18)执行将额外拷贝存储在两个不同服务器(不同于已经存储现有三个版本的服务器,并且彼此不同)中所需要的处理。通过以上面提出的方式来处理以上三个场景,系统确保针对数据库中的每个三元组都有包括所存储的该三元组的版本的至少三个数据项。在存储该三元组的不同版本的数据项没有映射至三个不同服务器(场景2和场景3)的情况下,添加上述数据项之一的更多副本或添加具有该三元组的版本的新数据项。在场景2中,系统将不得不存储具有该三元组的版本的4个数据项。在场景3中,系统将不得不存储具有该三元组的版本的5个数据项。这是必需的,这是因为在该特定的实现中,原始数据项(或三元组)不能从其在数据项的有序集合中的位置被移走。相比场景1,场景和场景3的出现频率可能相对低,但是这取决于要存储的数据的量和可用服务器的量。尽管用于存储三元组的本方法可以用于任何网络配置,但是使用具有许多服务器的可扩展对等网络会增加场景1出现的概率,从而减小系统中三元组的版本的副本的数量。此外,该特定的系统包括故障检测器19。故障检测器的简易版本是被配置成使用超时和“ping”消息的检测器。每个服务器的故障检测器19被配置成周期性地发送“ping”消息至每个其他服务器。例如,如果服务器1在指定量的时间后没有从服务器2接收到“ping”消息(或其他类型的预定响应),服务器1会怀疑服务器2出现了故障,并且与剩余服务器一起执行协定过程以将服务器2从可用服务器列表中排除,并执行数据恢复处理。用于实现故障检测器的该特定方法已知为“最终完美故障检测器(eventuallyperfectfailuredetector)”,并且在网络消息未丢失并且消息延迟有(未知)上界的系统中尤其有用。可选地,可以将“ping”消息捎带在常规的服务器消息中以节省网络带宽。实现故障检测器的更多细节以及方法可以在论文“TusharDeepakChandraandSamToueg.1996.Unreliablefailuredetectorsforreliabledistributedsystems.J.ACM43,2(March1996),225-267.DOI=10.1145/226643.226647”中找到。在图2所示的系统中,每个服务器具有执行等同任务的其自己的数据库控制器。每个服务器运行具有以下数据结构的处理:存储表。每个处理存储由以下字段组成的表:triple_data:三元组triple_order:Enum{SOP,POS,OSP}spo_node_ID:整数pos_node_ID:整数osp_node_ID:整数在存储表中,表项按照第一个字段(triple_data)排序以使得能够对每个处理进行本地范围查询(例如,基于表示三元组的字符串的字母顺序排序)。triple_order是表示三元组的编码顺序的数字,因此,例如基于存储在“triple_order”中的数字,可导出该三元组的哪个元素是由例如第二元素表示的。在该特定的实现中,存储同一三元组的三个版本中的每一个版本的节点的ID也与该三元组一起存储在存储表中。在替选实现中,存储表和下面讨论的副本表可以利用有序搜索树(Trie)结合在一起,以使得能够具有两个有序三元组并且可搜索的索引可用于数据控制器。处理/服务器可以存储的附加数据结构包括以下数据结构:索引,该索引将node_ID映射至指向存储表上的行的指示符,例如,在特定服务器出现故障的情况下,可以确定该服务器的node_ID,并且该索引使得能够有效地识别故障服务器上的数据恢复所需的行;副本表,用于存储所生成的三元组版本的副本以满足以下要求:例如,三个不同的服务器中每一个服务器都存储同一三元组的版本。为了保持三元组的现有版本的排序,可以将这样的副本存储在主存储表之外,因而该副本表可以仅存储SPO形式的三元组并且可以由以下字段组成(其中replica1_ID是表示在其上可以找到该三元组的SPO版本的第一副本的节点的ID的整数,并且如果存在第二副本,则replica2_ID是表示在其上可以找到该三元组的SPO版本的第二副本的节点的ID的整数):triple_data:三元组spo_node_ID:整数pos_node_ID:整数osp_node_ID:整数replica1_ID:整数replica2_ID:整数索引,该索引将node_ID映射至指向副本表上的行的指示符,同样,这样的索引方便数据恢复目的。在本实施例中,每个三元组在分布式存储系统中被存储3次:按照SPO顺序,按照OSP顺序以及按照POS顺序。这确保了每个三元组的三个版本存储在数据项中并且确保了可以有效地执行范围查询,而不管搜索类型(按主语,按谓语或按宾语)如何。以下段落描述如何存储三元组以及当处理失败时如何恢复信息。数据是由通过线性数据空间排序的三元组集合来组成的。该数据空间按段划分。为了有效地检索特定数据项应该位于的段,可以使用如Trie(一种分类树)等机制,其中该Trie的每个叶子对应于一个段。在系统的每个存储节点中复制这样的数据结构并且将数据项映射至段ID。因为数据项总是被排序的,所以可以检索执行范围查询所需的段ID。范围查询检索t1与t2之间的所有数据,其中t1和t2是数据项(或三元组)。因此,需要查询的段(其中将段理解为存储在特定存储节点/服务器/机器上的数据的总集合中的一部分)是:t1所位于的段、t2所位于的段以及这两个段之间的所有段(当存储节点是根据每个存储节点存储的数据项的有序集合组成的段的顺序排序时,就存储节点的顺序而言的之间)。在检索段ID之后,使用如一致性哈希等机制作为工具将段映射至机器。利用该功能提供了本地地将数据项(三元组)映射至特定机器ID的函数/方法:机器IDgetMachineID(对象三元组)该方法使用Trie结构(或有序数据项至段ID的其他映射)将数据项映射至段ID,然后使用一致性哈希算法将段ID映射至机器ID(但是在该第二步骤中,将段ID映射至机器ID的任何机制都符合目的)。通过具有作为变元提供的三元组的表示的指令“getMachineID”来调用该方法。返回例如可以是整数的机器ID(MachineID)。存储层15(指令分配器16)可以使用该方法来选择存储三元组的每个版本的存储节点。机器ID标识特定的存储节点。例如可以通过对其地址进行哈希处理并根据其在数据的线性空间中的相对位置来确定存储节点(其中存储节点是机器或服务器)的ID。这些ID还可以以循环的方式来限定彼此之间的顺序。这意味着:例如如果在系统中具有3个机器,则将顺序关系“A<B”(A小于B)限定如下:机器1<机器2<机器3<机器1。在数据插入方法的描述中,运算“机器ID+1”对应于线性空间的下一个机器。例如:机器1+1与机器2相同机器3+1与机器1相同最终,由两个附加的方法:store(对象三元组,机器IDspoID,机器IDposID,机器IDospID)storeReplica(对象三元组,机器IDspoID,机器IDposID,机器IDospID,机器IDreplica1,机器IDreplica2)所有的存储服务器通过它们的数据库控制器来提供这些方法。例如,可以由指令分配器在向存储节点分发指令时调用这些方法。该“store()”方法指示三元组在特定服务器的存储表中的存储。从上可以看出,在该实施例中,当调用该方法时所包括的变元是该三元组自身、存储该三元组的存储节点的ID和存储该三元组的每个版本的存储节点的ID。该storeReplica()方法在三元组的版本例如由冗余模块18复制时在特定服务器的副本表中存储该三元组,以确保所需数量的存储节点具有特定三元组的版本。作为对发明实施例的核心功能的可选扩展,这些方法还存储三元组的其他版本的ID并且更新先前描述的索引。存储三元组的三个版本(以及如果需要还有副本)的机制(方法addTriple)按如下方式工作,以三元组的表示作为变元,并且是由接收到在数据库中存储三元组的请求的数据库控制器10执行的方法的示例:方法addTriple(三元组三元组):机器IDm1,m2,m3m1=getMachineID(triple.asSPO())m2=getMachineID(triple.asPOS())m3=getMachineID(triple.asPOS())在m1中store(triple.asSPO(),m1,m2,m3)在m2中store(triple.asPOS(),m1,m2,m3)在m3中store(triple.asOSP(),m1,m2,m3)这些过程确保三元组的每个版本SPO、POS和OSP被存储在系统中以使得能够使用三元组数据的子集的任意组合作为前缀来进行范围查询。针对作为SPO、POS和OSP的三元组在“getmachineID”中使用的哈希函数针对三元组的所有三个版本返回不同的机器ID,因此,所述三个版本将存储在不同的服务器中。在已经检查了这是否发生之后,确定所需的副本的数量并且生成副本并指示所述副本的存储。仅当这没有发生时,才存储一个或两个额外的副本。这些副本仅在恢复处理中使用而不用于执行范围查询。额外的拷贝仅是一个回退过程以确保系统总是具有每个过程的至少三份拷贝。在某些情况下,系统可以存储某些数据的4个或甚至5个版本,但是一致性哈希算法确保这仅发生在极少数的情况下,并且仅当出于数据冗余目的而请求时。在本发明的操作实现中,很有可能仅在非常小百分比的情况下才会需要副本。最后,以完全相同的方式进行删除操作,但是是通过在服务器中执行“delete()”和“deleteReplica()”方法,而不是分别执行“store()”和“storeReplica()”。这些方法删除每个表中与要删除的三元组对应的行。如果需要,“delete()”和“deleteReplica()”还更新各个索引。当服务器出现故障时,故障检测器最终会检测到该事件。例如,特定服务器的故障检测器可以通过与网络中的其他数据库控制器的故障检测器或故障检测模块进行协作来检测该事件。因此,可以考虑将故障检测器分布在网络中的每个服务器(数据库控制器)中。一旦检测到服务器故障,则会触发响应。例如,故障服务器的检测可以在幸存服务器上(例如,在它们的数据库控制器上)触发“故障(onFailed)”事件。一旦服务器例如通过接收“故障”事件通知而被通知另一个服务器出现故障,则服务器通过其数据库控制器执行恢复操作。假设FID是故障处理的ID,则数据恢复操作可以由每个非故障存储节点的数据库控制器的以下步骤组成:1.如果(在非故障存储节点上)存在从FID至表行的任何映射,则登记存储索引。2.对于该索引所标识的每个三元组:a.使用新成员配置来计算用于该三元组(即,用于存储该三元组的版本的每个数据项)的新机器ID,例如可以通过使用以具有三种配置SPO、POS、OSP中的每一种配置的三元组作为变元的getmachineID方法在存储层15(在指令分配器16中)执行这样的操作;b.如果有存储了三元组的版本并且不会以新的配置来存储的服务器,则从该机器移除该三元组,例如,该移除可以由存储层15(指令分配器16)使用“delete()”方法来指示;c.如果有将存储三元组但没有以先前的配置来存储的服务器,则向该服务器添加该三元组,例如,该添加可以由存储层15(指令分配器16)使用具有特定实现所需的变元的“store()”方法来指示,但是所述变元至少包括要存储的三元组的版本;d.如果有以先前配置存储了三元组并且继续以新配置来存储的服务器,则简单地更新该服务器的表上的三元组的ID,这样的更新可以通过向适当的服务器发布更新指令来执行。3.如果存在从FID至表行的任何映射,则登记副本索引,并且针对这些三元组重复步骤2。最终,为了避免该过程针对同一三元组被执行多次,本发明的实施例可以包括以下机制:确保包含三元组的副本(或版本)服务器中的仅仅一个服务器会执行数据恢复操作。例如,这可以通过计算存储三元组的版本(不管其是副本或是其他)的(非故障)服务器的最低机器ID来实现。如果使用存储同一三元组的版本或副本的其他节点的机器ID来存储三元组,则仅通过参考存储表和副本表来获得该值。否则,可以根据在通过指令分配器选择指示哪个节点存储三元组的版本时所使用的映射函数来确定存储同一三元组的版本或副本的其他存储节点的ID。如果正在执行恢复程序的服务器对于该三元组具有最低的ID,则该服务器会针对该三元组执行恢复程序。否则,这被简单地忽略,因为另一服务器会处理该三元组。图3示出了图2的“层”如何与图1的组件相联系的示例。即,RDF层11包括存储请求接收器12,存储层15包括数据项生成模块14、指令分配器16和冗余模块18。故障检测器19不属于任一层,而是可以根据需要与任一或两个层/组件交换数据并向所述任一或两个层/组件发布指令的部件。在上述方面中的任一方面中,各种特征可以用硬件实现或实现为运行在一个或更多个处理器上的软件模块。一个方面的特征可以应用至其他方面中的任何一个。本发明还提供了用于执行本文所述方法中的任意一种方法的计算机程序或计算机程序产品,以及在其上存储有用于执行本文所述方法中的任意一种方法的程序的计算机可读介质。实施本发明的计算机程序可以存储在计算机可读介质上,或者,所述计算机程序例如可以是以信号的形式如由互联网网站提供的可下载的数据信号,或者可以是以任何其他形式。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1