对分布式存储系统中的数据项进行访问的方法

文档序号:7926693阅读:245来源:国知局
专利名称:对分布式存储系统中的数据项进行访问的方法
技术领域
本发明涉及对分布式存储系统中的数据项进行访问的方法。
背景技术
据了解,分布式存储系统包括冗余地存储多个数据项的多个节点。这些系统被配置成即使在一个或多个节点内发生故障的情况下仍允许对存储的数据项进行访问,并且确保节点的故障不会导致跨越数据项的冗余备份的数据不一致。但是,据了解,建立既能提供跨越冗余地存储的数据项的一致性,又能提供高可用性,同时还能容纳系统的节点之间的临时的分区的分布式存储系统是不可能的,这是因为存在着这三个要求之间的权衡。Paxos分布式一致算法提供了通过在对数据项进行更新时在一簇节点之间要求一致以及通过使用一簇节点对读取进行处理来确保在分布式存储系统中的一致性的方法。由于连续的簇必须具有至少一名共同成员,所以该算法能够保证较高程度的一致性,但是,在进行读取时存在着较高的总开销。本发明旨在提供对分布式存储系统内的数据项进行访问的改进方法。

发明内容
根据本发明的一个方面,提供了根据所附权利要求的对包括经由数据通信网络来连接的多个存储节点的分布式存储系统中的数据项进行访问的方法。从属权利要求中陈述了该方法的优选特征。本文所描述的实施方式涉及提供对包括经由数据通信网络而连接的多个存储节点的分布式存储系统中的数据项进行访问的方法,每个所述被复制的数据项跨越多个所述存储节点进行复制,其中该方法包括通过在第一和第二读取模式之间进行选择来从所述分布式存储系统中读取数据项,所述第一读取模式包括尝试从包括多个所述存储节点在内的节点组中读取数据项以检查跨越所述节点组中的至少一簇的数据项一致性,所述第二读取模式包括从至少一个所述存储节点中读取数据项,该方法包括接收在给定节点中检索数据项的请求;根据分布式存储系统的系统状态的至少一个检出特性来选择在数据项的检索中使用第一和第二读取模式中的哪一种,其中所述选择包括当系统状态的至少一个检出特性指示较高可能性的数据项一致性时选择第二读取模式,以及当系统状态的至少一个检出特性指示较低可能性的数据项一致性时选择第一读取模式;使用所选定的读取模式从分布式存储系统中读取数据项;以及响应于检索数据项的所述请求,传输通过选定的读取模式读取的数据项。通过根据分布式存储系统的系统状态的至少一个检测出的系统特性选择将在分布式存储系统中的数据项的检索中使用第一和第二读取模式中的哪一种,本发明的实施方式能够利用分布式存储系统的系统状态的检出特性的优势,使得第二读取模式可以用于当检测到较高可能性的数据项一致性时从分布式存储系统中读取数据项,而第一读取模式可以用于当检测到较低可能性的数据项一致性时从分布式存储系统中读取数据项,从而提高了整个系统的性能。优选地,第一读取模式包括从第一数量的多个节点中读取数据项,而第二读取模式包括从第二数量的多个节点中读取数据项,其中第二数量小于所述第一数量。第一读取模式可以包括尝试从包括多个节点的节点组中读取数据项以检查跨越至少一簇节点组的数据项一致性。第二读取模式可以包括从多个节点中的仅任意一个节点中读取数据项。可以采用第二读取模式从中读取数据项的节点可以是目前负责对存储在节点组中的每个成员中的将以第一读取方法进行读取的数据项的更新进行控制的节点。通过这种方式,当检测到较高可能性的数据项一致性时可以使用一种更有效的读取模式(第二读取模式),当检测到较低可能性的数据项一致性时可以使用能够处理一些数据项不一致性的效率较低但更强大的读取模式(第一读取模式)。可对其进行检测以便允许选择读取模式的分布式存储系统的系统状态的特性可包括群首问题特性,该特性指示多个节点中的第一个节点是否认为它目前是群首节点 (Leader Node)并且因此负责对数据项的更新;同意问题特性,该特性指示针对数据项的更新(诸如最近要求的更新)是否已经在多个节点的节点组之间达成了一致;以及针对数据项的过时的特性,该特性指示第一个节点是否已经收到了可以指示本地存储在第一个节点中的数据项的副本可能过时的任何信息。根据本发明的另一个方面,提供了对包括经由数据通信网络而连接的多个存储节点的分布式存储系统中的一存储节点的数据项进行备份访问的方法,每个所述数据项跨越多个所述存储节点进行复制。其中,该方法包括检测所述存储节点已经与包括多个所述存储节点的节点组中的其它存储节点断开,数据项已经跨越多个所述存储节点进行了复制;查询所述一组存储节点的一个或多个成员以识别负责对所述一组存储节点的更新进行协调的当前群首节点;确定与所述存储节点可能已经错过了对所述节点组的更新相关的一个或多个数据项;以及响应于所述确定,查询所述节点组中的一个或多个节点以更新本地存储的数据项,以确保所述本地存储的数据项与所述节点组中的至少一簇的一致性。通过积极地查询以确定当前群首节点,然后确定与存储节点可能已经错过了更新相关的一个或多个数据项,可在故障(诸如存储节点与节点组中的其它存储节点断开)之后主动地对本地存储的数据项中的不一致进行纠正。可对不一致进行纠正,而无需消极地监视和等待与对在分布式存储系统中的节点之间进行传输的数据项进行更新相关的其它信息。通过这种方式,可以更可靠地维持极少对其进行更新的数据项的一致性。根据本发明的另一个方面,提供了对包括经由数据通信网络而连接的多个存储节点的分布式存储系统中的一存储节点中的数据项进行备份访问的方法,每个所述数据项跨越多个所述存储节点进行了复制。其中,该方法包括检测存储节点已经发生故障并且已经重新启动;查询所述一组存储节点的一个或多个成员以识别负责对所述一组存储节点的更新进行协调的当前群首节点;确定由所述当前群首节点进行协调的分布式存储系统动作的序列中的点的标识符,以及参与由所述群首节点所指示的超出所述序列中的所述点的读取和/或写入动作。通过积极地查询以确定当前群首节点,然后根据上文的方法确定从其至重新启动参与的点的标识符,从故障(诸如与节点组中的其它存储节点断开)中恢复的节点能够主动地确定它可以从哪个节点重启对所述群首节点指示的读取和/或写入动作进行参与,而无需等待在分布式存储系统中的节点之间进行传输的较旧的更新的稳定。根据本发明的优选实施方式的下面的描述,通过结合附图给出的实例,本发明的进一步的特点和优势将变得很明显。


图1示意性地示出了根据本发明的实施方式的分布式存储系统。图2示意性地示出了根据本发明的实施方式的图1中的分布式存储系统的节点的组件。图3示出了根据现有技术的分布式存储系统内的交互序列。图如和图4b示出了为了写入数据项而由根据本发明的实施方式的图1中的分布式存储系统的节点所执行的步骤。图5示出了为了读取数据项而由根据本发明的实施方式的图1中的分布式存储系统的节点所执行的步骤。图6示出了为了在故障之后重新使数据项同步而由根据本发明的实施方式的图1 中的分布式存储系统的节点所执行的步骤。图7示出了为了在故障之后确定其在何时已经重新与其它节点同步而由根据本发明的分布式存储系统的节点所执行的步骤。
具体实施例方式图1示意性地示出了根据本发明的实施方式的连接至多个客户端150、160的分布式存储系统的组件。分布式存储系统100包括了包括节点110、120、与130在内的多个节点。分布式存储系统100的每一个节点包括用于存储一个或多个数据项的存储装置(例如112、114、 116)。在本发明的优选实施方式中,相同的数据项是在分布式存储系统100的每个节点的存储器中被复制。例如,数据项1和数据项2被存储在节点110、120和130中的每一个节点中。分布式存储系统100的节点可通过一个或多个通信网络140进行通信。包括客户端150和160在内的多个客户端可通过一个或多个通信网络140请求对存储在分布式存储系统100内的数据(诸如数据项1和2)进行访问。如果必要,分布式存储系统100的节点可响应于这些要求来读取和/或写入数据(诸如数据项1和2),并将结果返回至客户端150 和 160。一个或多个通信网络140可包括内部通信网络,诸如用于连接分布式存储系统 100 一些节点和/或一些客户端的局域网。此外或可选地,分布式存储系统100的一些节点可通过位于分布式存储系统100之外的一个或多个通信网络进行连接,这种通信网络包括诸如英特网的通信网络。图2示意性地示出了属于根据本发明的实施方式的分布式存储系统100的多个节点中的任一节点的节点110的组件。节点110可以是计算机服务器、台式计算机等等。节点110包括处理器202,该处理器能够将控制消息传输至节点110内被连接至系统总线204 的组件、从节点110内被连接至系统总线204的组件接收状态信息、将数据传输至节点110 内被连接至系统总线204的组件、从节点110内被连接至系统总线204的组件传输数据,其中这些组件包括非易失性存储设备206、随机存取存储器208以及网络接口 210。节点110 内被连接至系统总线204的组件还可以包括用户输入接口 212和图形处理组件214。处理器202,其在本实施方式中是微型处理器,处理存储在随机存取存储器 (RAM) 208中的已经从非易失性存储设备206中下载的指令,非易失性存储设备206可能是 (例如)闪速存储器或硬盘驱动器。这些指令是以实现操作系统218和存储程序220的一个或多个程序的形式存在于计算机软件中的。RAM 208和非易失性存储器206形成节点110的存储装置112的至少一部分。存储装置112被在处理器202上运行的程序用作以电子信号的形式存储和访问数据的一种装置,其中在程序的执行期间使用数据。这种数据包括针对分布式存储系统100存储的数据项222以及与数据项相关的更新信息224,两项数据优选地保存在非易失性存储器206中。 这种数据还包括活节点清单226,活节点清单2 列出了目前节点110能够与之进行通信的那些节点,并且活节点清单2 优选地被存储在RAM208内。操作系统218是以程序或一组程序的形式存在的计算机软件,其指令是由处理器 202从非易失性存储器206中下载的并且是在节点110打开时执行的。操作系统218可以自动地启动(例如220的)其他程序。操作系统218使得在处理器202上运行的程序之间由处理器202提供的处理能力的共享成为可能。操作系统218可提供用于存储、修改和访问保存在非易失性存储器206中的文件的文件系统。该文件系统可以经由操作系统218所提供的可编程接口来访问在处理器202 上运行的其它程序。节点110还包括网络接口 210(或多个这样的接口),网络接口 210允许在处理器 202上运行的程序经由一个或多个通信网络140将数据传输至多个其它设备和系统以及从多个其它设备和系统接收数据。网络接口 210(或多个这样的接口)可包括与以因特网和 /或专用数据通信网络为例的相应的通信网络140 —起使用的调制解调器和/或以太网卡或接口。操作系统218可包括允许经由网络接口 210和一个或多个通信网络在运行于处理器210上的程序与外部设备之间进行通信的网络程序。通常地,节点110可被配置成在无需由服务器管理员对节点110的组件或程序进行直接控制的情况下运行,但是,节点110仍会包括用户输入接口 212和图形处理设备214 以允许在必要时对节点110进行控制。用户输入接口 212和图形处理组件可分别连接至一个或多个输入设备(未示出)以及显示设备216以允许对节点110进行管理。图形处理组件214能够根据由处理器202上所运行的程序发出的命令来提供图形,并且将这些图形输出至显示设备216,显示设备216可以是计算机监视器。在处理器202上运行的程序能够响应于从一个或多个(未示出)用户输入设备收到的用户输入来处理由用户输入接口 212获取的用户输入,一个或多个用户输入设备可以包括键盘、鼠标、和/或触摸屏接口。每个客户端(例如150、160)也可以是诸如计算机服务器、台式计算机、智能手机、 个人数字助理(PDA)、电子阅读器、平板计算机(诸如苹果平板电脑等)的计算设备。每个客户端可包括诸如均连接至系统总线的处理器、RAM、非易失性存储器、网络接口、用户输入接口和图形处理组件的组件。每个客户端可以连接至一个或多个通信网络140,并且每个客户端可以结合或连接至显示器和/或一个或更多的输入设备。客户端可被配置成执行包括分布式存储系统存取程序的一个或多个计算机程序,分布式存储系统存取程序能够使客户端请求对由分布式存储系统100存储的数据项进行访问。正如上文的总结,分布式存储系统100被设置成存储供多个客户端进行访问的多个数据项。即使其中一些节点发生故障或在一个或多个通信链路发生故障的情况下,分布式存储系统100的每个节点可以冗余地对每个数据项进行存储以便允许客户端(例如150) 对数据项进行访问。分布式存储系统100可以定义确定多个节点的排序的等级。分布式存储系统100的每个客户端(例如150、160)可被配置成将与数据项相关的读取和写入请求传输至该等级中的第一个节点。第一个节点通常是群首节点,正如下文将更为详细地描述的那样。该等级可能为客户端(例如150、160)所知或已经传递给客户端(例如150、160), 使得如果等级中的第一个节点(或第二或第三个节点等)发生故障或与其的通信丢失, 那么每个客户端将读取和写入请求传输至该等级中的第二个节点(或第三或第四个节点等),以便分布式存储系统100可以对这些请求进行处理。那么该等级中的第二个节点(或第三或第四个节点等)可以变成群首节点。分布式存储系统100实现了分布式存储方法,该方法确保即使分布式存储系统 100或通信网络140中出现故障,但是数据存储仍保持一致或最终变得一致。这种方法可以通过在分布式存储系统100的每个节点中运行的存储程序(例如220)来实现。为了实现这种方法,分布式存储系统100的节点的存储程序可以经由通信网络140使用多种消息来进行互相通信,正如下文将更为详细地描述的那样。在本发明的优选实施方式中,存储程序220可以结合用于实现容错分布式存储系统的Paxos算法的改进版本,正如下文将更为详细地描述的那样。特别地,Multi-Paxos算法的改进版本(也称为Paxos状态机)可以优选地结合进存储程序220中。例如,LeslieLamport 在 ACM SIGACT 2001 的 “Paxos made simple” 中描述的 Multi-Paxos算法,确保对存储在多个节点中的数据项的每次更新只有在多个那些节点之间存在一致的基础上才能接受。这允许节点实现Multi-Paxos算法以确保在分布式存储系统中维持一致性。概括地说,Multi-Paxos算法是通过允许多个节点选择控制对一个或多个数据项的访问的群首节点而运行的。群首节点确保对数据项的更新只有当大多数节点已经达到指示更新应该被接受的一致时才能为分布式存储系统所接受。同样地,群首通过节点就数据项的当前值而言在该值被传输到客户端之前达成一致来确保数据项读取一致的数据。图3示出了由根据Multi-Paxos算法来存储数据项的三个节点(节点A 300、节点 B 310和节点C 320)所组成的分布式存储系统内的交互序列。起初,节点A300尝试通过向每个其它节点传输准备消息来当选为分布式存储系统的群首节点(步骤330)。准备消息包括识别节点A 300的群首建议的群首循环数(leadership round number)L以及指示节点A 300认为尚未得到执行的接下来的 Multi-Paxos处理实例的一个或多个处理实例数的集合Ia。一个或多个处理实例数的集合 Ia可以(例如)指示节点A 300认为处理实例数N至无穷大尚未得到执行。响应于对准备消息的接收,节点B 310将检查它尚未收到包括大于L的群首循环数的准备消息,就好比它让发送那条准备消息的节点优先成为群首节点。如果节点B 310 尚未收到包括大于L的群首循环数的准备消息,那么它将通过向包括群首循环数L的节点A 300传输承诺消息来做出响应(步骤33 。根据节点B 300,承诺消息还包括尚未得到执行的和/或那些正在执行中的处理实例数的集合Ib(包括已经针对这些实例数接受的任何更新以及用于那些更新的相应于群首循环数)。此承诺消息指示节点B 310接受节点A300作为当前群首节点,并且节点B 310将不再接受与小于L的群首循环数相关的处理请求。反之,如果节点B 310已经接受了带有大于L的群首循环数的准备消息,那么它将通过对节点 A300拒绝的消息来作出响应。当分布式存储系统中一簇一半以上的节点已经承诺接受节点A 300作为当前群首节点时,节点A300可以开始处理传输至分布式处理系统的更新。因此当节点A300在上文的步骤332中从节点B 310收到承诺消息时,一簇节点(包括节点A 300)已经接受了节点A300作为当前群首节点。稍后,节点C 320可以通过与节点A 300类似的承诺消息作出响应(步骤334)。作为当前群首节点,节点A 300必须完成在节点A 300变成群首时任何已经在执行中的处理实例。节点A 300可以使用包括在从其它节点发送的承诺消息中的多组实例数 (例如Ib)来检测已经在执行中的处理实例。然后节点A 300可以传输接受消息和/或接收已经接受的消息,以便完成在节点A 300变成群首时被检测为已经在执行中的处理实例。群首节点A300也开始处理传输至分布式存储系统的新的请求。发送至分布式存储系统的每个请求可以涉及由系统存储的一个或多个数据项。节点A300可以从客户端接收请求以采用值V更新数据项,并且作为响应它将向每个其它节点传输接受消息(步骤 336)。接受消息包括群首循环数L、识别这种更新的处理实例数N、要被更新的数据项的指示、以及数据项将要采用其进行更新的值V。响应于对接受消息的接收,节点B 310将通过检查节点B 310尚未收到包括大于L 的群首循环数的任何准备消息来检查它认为节点A 300仍然是群首节点。如果节点B 310 尚未收到,那么它将通过向节点A300传输包括群首循环数L和处理实例数N的已接受消息来做出响应(步骤338)。此已接受消息指示节点B 310已作好准备接受处理实例N中的更新值V。当分布式存储系统中一簇一半以上的节点已经接受处理实例数N中推荐的更新值V时,节点A 300确定更新值V已经被接受为数据项的新值。因此当节点A300在上文的步骤336中从节点B 310接收已接受消息时,一簇节点(包括节点A 300)已经接受了处理实例数N中的推荐的更新值V,并且作为响应节点A 300永久地存储数据项的更新值V。然后群首节点必须将接受更新值V通知给其它节点,使得其它节点能够永久地存储数据项的已更新的值V。稍后,节点C 320可通过类似于由节点B 310发送的已接受消息来做出响应 (步骤340)。节点A300可以从客户端接收请求以读取据项,并且作为响应它将向每个其它节点传输读取消息(步骤342)。读取消息包括将要读取的数据项的指示。响应于对读取消息的接收,节点B 310将通过传输它最近接受的数据项的值来做出响应(步骤344)。如果分布式存储系统中一簇一半以上的节点通过针对数据项的相同的值Y对读取消息做出响应,那么节点A 300确定Y是数据项的当前值。因此,如果节点A300在上文的步骤344中从节点B 310接收数据项的值Y (步骤344),并且如果Y是节点A 300最近接受的数据的值,那么一簇节点(包括节点A 300)已经指示数据项的值是V,因此节点A 300 可以通过值Y对客户端的读取请求做出响应。稍后,节点C 320可以通过与节点A 300类似的响应来做出响应(步骤346)。然后节点A 300可以处理传输到分布式处理系统的进一步的读取和更新。每次节点A300处理新的更新时,它将像上文的步骤336 —样向其它节点传输接受消息。针对更新传输的每组接受消息将由节点A 300给予新的处理实例数,例如,一个更新在使用处理实例数N对其进行处理之后将被给予处理实例数N+1,其之后的更新将被给予处理实例数N+2寸。在实现Multi-Paxos算法的分布式存储系统中一旦已经选中了第一群首节点,则如果第一群首节点发生故障或如果与第一群首节点的通信丢失,那么其它节点可以尝试选择它们自身作为群首节点。例如,稍后节点B 300可以尝试通过向每个其它节点传输准备消息来选举它自己作为在节点A300中发生故障之后的群首节点(步骤348)。准备消息包括识别节点B 300的群首建议的群首循环数L+1以及指示节点B310认为尚未得到执行的接下来的Multi-Paxos 处理实例的一个或多个处理实例数的集合Ib+1。集合Ilrt可以指示节点B 310认为处理实例数N+2至无穷大尚未得到执行,因为在这个例子中节点A300在发生故障之前也已经通过处理实例数N+1执行了更新。响应于对选举消息的接收,节点C320和A 300将在响应之前通过向节点B 310传输承诺消息来检查它们尚未收到包括大于L+1的群首循环数的准备消息(步骤350和352)。在群首节点发生故障的情况下,二个或更多个节点尝试选举它们自己作为群首节点是可能的。在这种情况下,不同群首候选者将采用相同的处理实例数但递增的群首循环数来发送承诺消息,直到其中一个候选者收到一簇承诺消息为止。相反,当不存在群首冲突时,群首循环数不改变(因为一个节点仍然是群首节点),但是每个连续的接受消息组的处理实例数增加1。通过根据上文的步骤运行,假如系统的一簇一半以上的节点能够互相通信,那么基于Multi-Paxos的分布式存储系统即使在发生故障的情况下仍可以对来自客户端的请求提供服务。此外,由分布式存储系统存储的数据项将保持一致,因为至少一个节点将成为用于处理请求的每个连续的簇的共同节点。但是,如果一个或多个节点的组不能与一簇多个节点进行通信,那么那个组将不再能够对来自客户端的请求提供服务。本发明包括上文所总结的Multi-Paxos算法的改进版本。在本发明中,正如在 Multi-Paxos算法中一样对群首节点进行了选举,并且群首节点如在Multi-Paxos算法中一样来控制更新和读取。本发明还包括对Multi-Paxos算法的改进以便增加系统的读取处理能力,以及在分布式存储系统中的某些节点中发生故障的情况下提高系统的可用性。正如下面进一步详细地描述的那样,本发明允许节点即使在它不能与分布式存储系统100中的一簇多个节点进行通信的情况下仍对来自客户端的请求提供服务。本发明还允许在不从一簇多个节点中读取数据项的情况下,根据分布式存储系统的系统状态的至少一个检出特性,读取要服务的请求。本发明中对Multi-Paxos算法的改进包括用于读取和写入数据项的改进方法,以及用于在发生故障之后或失去与其它节点的通信之后使节点同步的方法,每种方法将在下面作出更为详细的描述。为了提供这些功能,每个节点(例如110)保持其目前能够与之进行通信的节点组成的活节点清单226。节点可以根据其向其它节点发送的信息是否被收到来对活节点清单2 进行更新。例如,如果第一个节点在消息被第一个节点发送至第二个节点之后未收到确认和/或响应,那么其结果是第一个节点可以确定它目前不能与第二个节点联系并且可以调整其活节点清单226。此外和/或可选地,节点可以向其它节点传输其活节点清单2 和/或更改其活节点清单226。活节点清单和/或对那些清单的更改可以使用基于闲谈(gossip)的算法和 /或通过向所有节点进行广播在节点之间传输。对活节点清单2 进行更新的另一种选择是让每个节点定期地向其它节点发送持活消息。如果第一个节点在足够长的时间之内未收到来自第二个节点的持活,那么可以假定第二个节点已经发生故障或存在阻止两个节点进行通信的网络故障。相比于Multi-Paxos算法,本发明允许不能与一簇多个节点进行通信的节点组来处理来自客户端的请求。正如下面将更为详细地描述的那样,这样的一群一个或多个节点可以从该组中的节点当中选举群首,并且那个群首可以为那组节点处理来自客户端的请求。这样的配置允许分布式存储系统在可能导致Multi-Paxos系统不能对任何请求提供服务的节点故障和/或通信故障的情况下维持可用性。但是,可能发生多个节点内的不能相互进行通信的二组或更多组节点针对同一数据项存储不同的更新的情况。本发明能够使用读取方法和下面进一步描述的重新同步方法从这样的数据不一致中恢复过来。图如和图4b示出了由根据本发明的实例的分布式存储系统100的节点(例如 110)为了响应于来自客户端(例如150)的请求写入数据项而进行的步骤。起初,节点110从客户端150接收请求以对数据项写入更新值U (步骤400)。发送至分布式存储系统100的每个请求涉及由系统存储的多个数据项中的一个,因此请求包括需要修改的数据项的指示。该指示可以是以文件名称或对分布式存储系统100的数据项进行识别的唯一标识符的形式。
节点110响应于对请求的接收,将检查它是否认为它目前是群首节点(步骤402)。 如果节点110已经将准备消息发送至多个节点中的其它节点,随后已经至少从其活节点清单2 中的所有节点收到承诺消息(因此至少变成活节点清单2 中的节点的群首),并且后来未从它节点收到指示另一个节点后来已经变成或尝试变成群首的任何群首配置信息, 那么节点110将认为它是当前群首。在节点110变成群首之后,可以指示另一个节点已经变成或尝试变成群首的群首配置信息包括由尝试变成群首的另一个节点传输的(例如在上文的步骤330中传输的)准备消息、或来自其它节点的110应该接受更新的请求(该请求将指示其它节点认为其是群首)、或来自其它节点的指示不为节点110所知的更新已经为其它节点所接受的消息。如果节点110在它不是当前群首节点时收到写入请求,那么它将尝试将写入请求传递至更高级别的节点,或在节点110不能传递写入请求的情况下它将接任群首。节点首先检查其活节点清单226以确定是否存在目前可联系的比节点110级别更高的另一个节点,如果这样节点110讲该请求传递至那个节点(那个节点要么很可能已经是群首节点,要么将响应于接收该请求而将接任为群首节点)。否则,如果不存在可以联系的更高级别的节点,那么节点110将尝试变成群首节点。节点110将根据上文概述的步骤330的方法尝试变成群首节点(如果必要的话), 除节点110从活节点清单2 中检测到它不能与一簇多个节点进行联系之外,一旦节点110 收到来自它的活节点清单中的每个节点的承诺消息,它就可以检测到它已经变成活节点清单226中节点的群首节点。一旦节点(例如110)已经收到来自客户端的请求(或从另一个节点传递的请求),并且那个节点认为它是群首节点,那么那个节点将响应于收到的请求,向多个节点中的其它节点传输接受消息和更新信息(步骤406)。对接受消息进行发送以便请求让其它节点存储由客户端请求的对数据项的写入。 像在上文概述的Multi-Paxos算法中一样,接受消息将包括涉及这种更新的新的处理实例数J,以及目前由群首节点110所使用的更新值U和群首循环数L。如上文所指示的,更新信息连同接受消息被传输至多个节点中的每个其它节点。 由群首节点110传输的更新信息至少部分地源自于群首节点110已经存储在其非易失性存储器206中的更新信息224。由群首节点110存储的更新信息2M包括已经被启动的更新的处理实例数的清单、已经被标记为群首节点110(或在群首节点110之前的其它群首节点) 所同意的更新的处理实例数的清单、以及针对多个节点中的每个其它节点群首节点110认为其它节点已经接受的更新的处理实例数的清单。除了传输接受消息之外,群首节点110还将修改已经在其更新信息2M中启动的更新的处理实例数的清单以指示处理实例数J已经启动。收到接受消息和相应的更新信息的每个节点,这些节点在下面叫做跟随者节点, 然后执行步骤408至414。在收到来自群首节点110的接受消息和相应的更新信息之后,跟随者节点(例如 120)将首先通过检查跟随者节点120未收到包括大于L的群首循环数的准备消息来检查它认为节点100仍旧是群首节点(步骤408)。如果从群首节点110接收接受消息的跟随者节点120认为节点110仍旧是群首节点,那么跟随者节点120将临时地将接受消息中已更新的值连同针对那个已更新的值的处理实例数J 一起写入到存储器122。然后跟随者节点120将处理从群首节点110收到的更新信息以便确定临时地保留在跟随者节点的存储器122中的已更新的值是否可以永久地置于其非易失性存储器中的数据项中(步骤412)。如果从群首节点110收到的更新信息指示临时地保存在跟随者节点120的存储器 122中的已更新的值已经被标记为为群首节点110所同意,并且跟随者节点120已经接受了已更新的值,那么跟随者节点120将永久地将那个已更新的值置于它的非易失性存储器中的相应的数据项中。必须通过由群首节点发送的更新信息来告诉跟随者节点它是否已经接受了已更新的值,这是因为在群首节点改变的情况下跟随者节点可以收到带有相同的处理实例数但不同的群首循环数和更新值的数条接受消息。在这种情况下,群首节点是能够判断跟随者节点什么时候已经接受了针对特殊处理实例数同意的更新值的唯一的节点。然后跟随者节点120将向群首节点110发送已接受消息,该已接受消息确认跟随者节点120已准备好接受针对处理实例数J的已更新的值。然后群首节点110从跟随者节点接收已接受消息(步骤416)。群首节点110将检查它是否已经收到来自一簇多个节点的与针对处理实例数J的更新相关的已接受消息。如果群首节点110检测到它已经从一簇多个节点收到与更新相关的已接受消息, 那么群首节点110将数据项的更新永久地存储在非易失性存储器206中,并且在其更新信息2M中将针对处理实例数J的更新标记为已同意,S卩,它在其已经被标记为已同意的更新的处理实例数清单中将更新标记为已同意(步骤422)。群首节点110还可以将消息传输至多个节点中的其它节点以指示更新已经被标记为已同意,以便向其它已经接受了更新的节点指示更新应该永久地存储在非易失性存储器中。如果群首节点110检测到它尚未从一簇多个节点收到与针对处理实例数J的更新相关的已接受消息,那么群首节点110将检查它是否已经收到至少来自群首节点的活节点清单226中的节点的与更新相关的已接受消息(步骤414)。如果群首节点110已经收到,那么它将执行步骤422,即,将数据项的更新永久地存储在非易失性存储器206中,并且在其更新信息224中将处理实例数J的更新标记为已同意。群首节点110还可以将消息传输至多个节点中的其它节点以指示更新已经被标记为已同意,以便向其它已经接受了更新的节点指示该更新应该永久地存储在非易失性存储器中。否则,群首节点110将不会将更新存储到数据项中,但将会在其更新信息2M中将处理实例J的更新标记为故障的,并且将故障信息传输至从其接收写入请求的客户端,故障信息指示节点不能处理写入请求。然后客户端响应于对故障信息进行接收,可尝试通过向分布式存储系统100中的不同的节点传输写入请求来处理写入。在可选设置中,群首节点110可以在写入请求发生故障之前再次尝试向活节点发送接受消息。通过一旦群首节点的活节点清单2 中的节点同意更新就允许接受更新(而不是一次性为一簇一半以上的多个节点所同意),本发明允许即使在一簇多个节点不能与那个群首节点联系的情况下群首节点仍处理来自客户端的写入请求。
图5示出了由根据本发明的实施方式的分布式存储系统100的节点(例如110) 为了响应于来自客户端的请求(例如150)写入数据项而执行的步骤。起初,节点110接收来自客户端150的请求以读取数据项(步骤500)。发送至分布式存储系统100的每个请求涉及由系统存储的多个数据项中的一个,因此请求包括需要读取的数据项的指示。该指示可以是文件名称或对分布式存储系统100的数据项进行识别的唯一标识符的形式。响应于对请求的接收,节点110将根据分布式存储系统100的系统状态的至少一个检出特性来选择在数据项的检索中使用第一和第二读取模式中的哪一种模式。节点110 可以执行步骤502至504以检测分布式存储系统100的系统状态的一个或多个特性,如果节点110从系统状态的那些特性中检测到存在较低的数据项一致性的可能性,那么节点 110将选择使用(步骤510至518中描述的)第一读取模式,或如果节点110从系统状态的那些特性中检测到存在较高的数据项一致性的可能性,那么节点110将选择使用(步骤 508中描述的)第二读取模式。节点110将首先检测到指示节点100是否认为它目前是群首节点的群首问题特性 (步骤50幻。节点110可以根据上文描述的关于这样做的同样的方法,即在步骤402中响应于对写入数据项的请求而执行的方法,来认为它是群首节点。如果节点110认为它仍旧是群首节点,那么它仍旧负责对它是群首节点的节点中的数据项的更新进行控制,(假如步骤503和504也得到满足)那么其结果是可以检测到较高的数据项一致性的可能性。如果节点110认为它是群首节点,那么群首节点100将检测指示针对数据项而处理的最近的更新是否已经得到同意的同意问题特性,即,针对那个更新的处理实例数在节点110的更新信息中是否已被标记为已同意。如果针对数据项而处理的最近的更新已经被标记为已同意,那么群首节点110知道不存在带有与已经由其它(例如,尝试变成群首的)节点推荐的以及会导致数据项的值中的冲突的最近的更新相同的处理实例数的未解决的更新。如果不存在这样的更新,(假定步骤504也得到满足)那么其结果是可以检测到较高的数据项一致性的可能性。如果针对数据项而处理的最近的更新已经被标为已同意,那么群首节点110将检测数据项的过时的特性(步骤504),该特性指示是否已经收到可以指示群首节点110存储在非易性存储器206中的数据项可能是过时的任何信息。群首节点110可以对指示它已经存储的数据项可能是过时的信息进行监控。受到监控的信息包括群首节点是否处于最近故障的状态,即,它是否已经发生故障并且随后已经恢复但尚未使其数据项与其它活的可联系的节点重新同步(使用下文描述的图6中的方法)、群首节点110是否已经不能与一个或多个节点进行联系以及后来已经重新获得与那些节点的连接、或群首节点110是否已经收到来自另一个节点的指示与数据项相关的更新已经意外地完成的消息,诸如指示不为群首节点110所知的更新已经为其它节点所同意的消息。如果群首节点110未检测到可指示它已经存储的数据项可能是过时的信息,(由于步骤502和503已经得到满足)那么检测到较高的数据项一致性的可能性。因此,群首节点110通过读取本地存储在其非易性存储器206中的数据项而使用第二读取模式来对读取请求提供服务(步骤508)。因为在大多数情况下本地存储的数据项将是最新的,所以群首节点110可以使用本地存储在其非易性存储器206中的数据项。当它已经存储的数据项并不是最新的时,群首节点110可以对来自其本地存储的读取请求提供服务的少数情况将在后文中做出详细的描述。如果在上文的步骤502、503或504的任何一个步骤中,节点110检测到它认为它不是当前群首节点(即,步骤50 、数据项尚未被标记为已同意(即,步骤50 、或它已经收到可以指示它存储在非易失性存储器206中的数据项可能是过时的信息(即步骤504), 那么检测到较低的数据项一致性的可能性,并且在步骤510至514中节点110将使用第一读取模式来读取数据项。在第一读取模式中,节点110将首先尝试通过从一簇多个节点中读取请求的数据项来对读取请求提供服务(步骤510)。正如在(上文的步骤342至346中概述的)Multi-Paxos算法中一样,为了从一簇多个节点中读取请求的数据项,节点110将传输读取消息至多个节点中的每一个其它节点,并且接收对那些读取消息的响应。然后节点110将确定响应于在步骤510中传输的读取请求而收到的一簇响应是否指示在数据项的值上达成一致(步骤512)。如果一簇多个节点在数据项的值上达成一致,那么节点110将使用该数据项的那个值来对读取请求提供服务,并且将该数据项的那个值作为数据项的当前值。如果本地存储的值与该簇多个节点的值不一致,那么节点110将采用该数据项的这个当前值来更新它本地存储在非易失性存储器206中的数据项(步骤518)。如果一簇多个节点在步骤512中未在数据项的值上达成一致,例如由于一簇多个节点目前不能与节点110取得联系、或因为存在尚未得到解决的对数据项的两个或更多个冲突更改,那么节点110将确定在它收到的响应中返回的值是否与数据项的值一致(步骤 514)。如果一簇多个节点在步骤512中的数据项的值上达成一致,那么节点110将使用该数据项的那个值来对读取请求提供服务,并且将该数据项的那个值作为数据项的当前值。如果本地存储的值不同意已同意的值,那么节点110将采用该数据项的这个当前值来更新它本地存储在非易失性存储器206中的数据项(步骤518)。如果在步骤514中节点110确定在它收到的响应中返回的值未在数据项的值上达成一致,那么节点110将尝试通过选择冲突值中的其中一个值作为需要使用的数据项的值来解决冲突值,以对读取请求提供服务并作为数据项的当前值(步骤516)。为了解决多个节点中数据项的值上的冲突,节点110还可以向多个节点中的其它节点发送接受消息,其中接受消息包括选定的冲突值。一旦节点110已经确定了用于在上文的步骤中对读取请求提供服务的数据项的值,该节点就将响应于读取请求,将该值传输到客户端(步骤520)。因此,本发明允许通过从群首节点的本地存储器中读取来对分布式存储系统中的几乎所有的读取提供服务,同时确保对分布式存储系统的读取保持有效。正如上文所描述的,节点故障和通信网络分区可能导致在它们的本地存储器中节点存储过时或不一致的数据项。图5中的读取方法可以通过解决针对数据项的冲突值(步骤516)以及采用来自簇读取的值更新节点(步骤518)来修复这些数据项中的一些,但是,如果仅使用该读取方法的修复功能,那么数次连续故障可能导致对频繁访问的数据项的更新的丢失。因此,本发明包括用于使故障之后节点中的数据项重新同步的方法,以及用于确定故障之后节点何时可以安全地参与针对数据项的读取和写入动作的方法,正如下文将更为详细地描述的那样。图6示出了由根据本发明的实施方式的分布式存储系统100的节点(例如110) 为了在故障之后使它存储在本地存储器中的数据项重新同步而执行的步骤。起初,正恢复的节点(例如110)检测到已经存在一个从故障的恢复(步骤600)。 该故障可能是正恢复的节点110的故障,如果正恢复的节点110的操作系统218和/或存储软件220重新启动,那么正恢复的节点110可以检测到这种故障。此外或可选地,该故障可能是通信网络140(或多个通信网络)的故障,这种故障已经导致正恢复的节点110与分布式存储系统100中的多个节点中的一个或多个节点断开,正恢复的节点110可以使用节点100的活节点清单2 来检测这种故障。响应于对故障的检测,正恢复的节点110将尝试重新建立与其它节点的联系(步骤 602)。如果故障是通信网络故障(并且正恢复的节点110本身尚未发生故障并且尚未重新启动),那么正恢复的节点110能够重新连接至其它节点并且立即重新开始处理读取和写入命令。如果正恢复的节点110已经发生故障并且已经重新启动,那么在它可能在发生故障时它已经丢失了关于在进行中的I3ax0s处理实例的信息(因为这些可能存储在RAM 208 中)。如果它立即重新开始处理I3ax0s实例,那么它可以违背它在故障之前发送的早期承诺或已接受消息,这可能导致数据永久地变得不一致。因此,正恢复的节点110而是必须首先使用图7中指定的和稍后将要描述的程序设立何时重新开始处理I^ax0s实例是安全的。一旦正恢复的节点110已经连接至其它节点,正恢复的节点110就请求其它节点中的一个或多个节点将它们的当前状态信息传输至恢复节点110。然后正恢复的节点 110从收到的更新信息中识别正恢复的节点110在其发生故障和/或断开时丢失的更新的 Paxos处理实例数(步骤604)。然后正恢复的节点110将使用这份丢失的I^ax0s处理实例数清单来向其它节点请求由与丢失的Paxos处理实例数相关的更新所更改的数据项的标识符(步骤606),然后正恢复的节点110将请求从群首节点接收已确定的数据项的已更新的值,和/或从节点接收指示已经接受了已识别出的更新的已经接受的更新信息(步骤608)。其结果是,正恢复的节点110能够确保与那些已经与群首节点就已识别出的更新达成一致的节点的一致性。在根据图6中的步骤的重新同步的过程中,正恢复的节点110可以接收来自客户端的读取请求和/或来自其它节点的(针对簇读取的)读取消息。响应于这些消息,起初, 正恢复的节点110的动作就好比所有的读取请求/读取消息是针对潜在的不一致数据,因此向客户端/其它节点报告它自身为不一致。响应于对指示正恢复的节点的不一致的消息的接收,客户端将向其它一致的节点重新传输读取请求。响应于对指示正恢复的节点的不一致的消息的接收,出于簇读取的目的,其它节点将忽略正恢复的节点(即,将按照其因故障而不能提供响应来对待正恢复的节点)。一旦正恢复的节点110知道哪些数据项需要修复,它就会向客户端/其它节点报告它自身为不一致,并且恢复正常读取处理。通过使用图6中的重新同步方法,节点可以使其本地存储器中的数据项与其它节点中的那些数据项重新同步以纠正因故障导致的不一致,而无需监视与对在分布式存储系统100中的节点之间传输的数据的更新相关的其它消息。通过这种方式,可以维持极少被更新的数据项的一致性。正如上文所描述的,已经发生故障并且重新启动的节点还必须确定它何时可以继续参与到其它节点中以便对发送至分布式存储系统100的读取和写入请求提供服务。图7 示出了由根据本发明的实施方式的分布式存储系统100的节点(例如110)为了确定它在故障之后何时已经与其它节点重新同步并且因此能够对与数据项相关的读取和写入提供服务而执行的步骤。起初,正恢复的节点(例如110)检测到已经存在从故障的恢复(步骤700)。如果正恢复的节点110发生故障并且重新启动(即,并不仅仅是在正恢复的节点100已经与一个或多个其它节点断开的情况下),那么除仅需执行图7中的剩余的步骤之外,可以采用上文针对图6中的步骤600所描述的同样的方式完成。响应于对正恢复的节点110的故障与重新启动的检测,正恢复的节点110将重新连接至其它节点并且向每个其它节点发送查询消息(步骤702)。响应于这些查询消息,每个其它节点发送包含该节点是否为群首节点的指示的响应(以及在这种情况下其当前群首循环数)、该节点已经从任何其它群首节点收到的最高群首循环数、以及该节点已经在接受或已接受消息中发送的或收到的最高处理实例数。然后正恢复的节点110使用已收到的响应中的信息来识别唯一的群首节点(步骤 704),例如通过使用群首循环数来检查群首节点和/或一簇多个节点认为群首节点至少是一簇多个节点的群首节点。如果不存在唯一的群首节点,那么正恢复的节点110定期地发送步骤702中的查询消息并且从其它节点接收响应,直至建立唯一的群首节点为止。一旦正恢复的节点110已经在步骤704中识别出当前群首节点,然后进行恢复的群首节点110就可以确定更新序列中被当前群首节点协调的点(步骤706)。该点可以是群首节点在其响应于正恢复的节点的查询消息中所指示的最高处理实例数。然后正恢复的节点110可以安全地参与超出确定的点的范围的所有更新命令, 即,参与带有由群首节点在其响应于正恢复的节点的查询消息中所指示的大于最高处理实例数的处理实例数的所有更新(步骤708)。通过根据上文的方法积极地识别和查询群首节点,正恢复的节点能够迅速确定它何时可以继续与其它节点参与对读取和写入请求提供服务,而无需等待在分布式存储系统 100中的节点之间传输的(诸如承诺和/或接受消息的)较旧的更新的稳定。使用图6和图7中的重新同步方法,本发明可以从读取和写入算法不能单独处理的数据项不一致中恢复过来。此外,读取和写入算法与重新同步方法的结合允许本发明的分布式存储系统在将阻止分布式存储系统对任何请求提供服务的(在其它算法中保证一致性的)情况下对请求提供服务。本发明避免了在许多故障情况下的数据不一致,但是,它在下文将要描述的一些罕见情况下不能保证数据一致性。
大多数节点故障将不会导致客户端读取不一致的数据,这是因为发生故障的并正恢复的节点意识到它的本地存储器可能包含不一致的数据,因此避免使用该数据响应于客户端请求,直至它已经(使用图6和图7中的方法)与系统中的其它节点重新同步。但是,一些多节点故障序列会导致数据不一致。具体地,如果正恢复的节点不能与它能够与其重新同步的其它节点进行通信,那么它别无选择只能采用其本地存储器中的数据来满足它收到的任何客户端请求。例如,考虑带有存储数据项的三个数据节点A、B和C 的分布式存储系统100。如果节点C发生故障,那么节点A和B能够继续处理对数据项的更新。然后如果节点A和B发生故障,然后节点C恢复(或节点C恢复但节点A和B在节点 C能使其数据与节点A和B重新同步之前发生故障),那么节点C将必须使用其数据的旧副本来对读取请求做出响应。分布式存储系统100的多个节点中的分区(例如通信网络故障将多个节点划分为两个或更多个不能相互进行通信的子集)会导致临时的数据不一致。例如,通信网络故障可以对多个节点进行分割,导致在多个节点的两个或更多个子集中单独地处理读取和写入请求。在这种情况下,子集将作为单独的分布式存储系统运行,因此由连接至一个子集的客户端发起的写入对于连接至其它子集的客户端来说将是不可见的。因此,连接至不同分区的客户端可以在分区存留的同时请求对相同的数据项进行冲突更新。但是,一旦分区固定,任何数据冲突将在步骤516中的数据项的簇读取过程中以及在图6和图7中所描述的重新同步方法得到解决。另一个例子是,群首节点短暂地从其它节点中分割出来,分割出来的时间足以让该节点错过由在其它节点中设立的替代群首节点发起的更新,但是不足以让群首节点检测它不再能够与其它节点进行通信。在这种情况下,客户端可能在群首节点被分割出来的同时向群首节点发送读取请求以及可以收到由群首节点给予的过时的数据,因为群首节点不知道存储在其本存储器中的数据项可能是过时的。一旦分区得到修复,群首节点,要么因为它从其它节点收到指示它曾被分割过的(例如,包括活节点清单或对活节点清单的更改的)消息,要么因为它即将开始从更新的群首节点接收承诺和/或接受消息,而意识到分区已经发生。作为响应,分割出来的群首节点将启动图6和图7中的重新同步方法。上述实施方式应被理解为本发明的说明性实例。依据下文的描述可以构想本发明的其它实施方式。本发明的可选实施方式是在分布式存储系统100由一组多个节点构成的情况下构想的。那个组中的多个节点中的各个节点可以根据上文所描述的本发明来操作,并且可以将不同的多个数据项存储到该组中的其它多个节点中。分布式哈希表或一些其它确定性的分区算法可以在分布式存储系统100中(例如,由所有多个节点中的节点所)使用,以便将在客户端请求中传输的每个数据项标识符映射至存储相应的数据项的多个节点,使得多个节点能够对针对那个项的请求提供服务。通过这种方式,由分布式存储系统100存储的数据项以及对那些项的访问是以跨越多个节点的方式分布的。分布式存储系统100中的每个节点可以是多个节点中的多于一个节点的成员,因此可以参与对不同组数据项的请求提供服务。将读取和写入请求传输至分布式存储系统100的多个客户端(例如150、160)可以以可选设置的方式提供更复杂的存储系统,该存储系统使用分布式存储系统来向一致的数据提供高水平的可用性。客户端可(例如)被配置成向其它计算设备提供数据库或文件系统,其中那个数据库或分布式文件系统中的数据项是使用分布式存储系统100存储的。在可选设置中,假如节点检测到下列情况得到满足,如果(在步骤503中检测到的)针对对那个数据项的最近的更新的最近的处理实例数在节点110的更新信息中未被标记为已同意,那么节点110可以使用第二读取模式来对数据项的读取提供服务。首先,节点 110必须正在处理对数据项的最近的更新,并且没有其它节点正在处理对带有相同的处理实例数的数据项的更新。其次,节点110必须在步骤504中检测到它存储在非易失性存储器中的数据项没有过时。如果这些条件都得到满足,那么节点110将(即,在步骤508中) 延迟使用第二读取模式对读取请求提供服务,直至它检测到对那个数据项的最近的更新在节点110的更新信息中被标记为已同意。如果在延迟使用第二读取模式对读取请求提供服务的同时,节点110检测到另一个节点已经推荐带有与最近的更新相同的处理实例数的更新,那么节点110将(即,通过后面的步骤510至518)改为使用第一读取模式来对读取请求提供服务。那么节点110可以检测针对数据项而处理的最近的更新是否已经得到同意,即, 针对更新的处理实例数在节点100的更新信息中是否已被标记为已同意。如果针对数据项而处理的最近的更新已经得到同意,那么群首节点110在允许读取请求完成处理之前将等待直至更新已被标记为已同意(步骤506)。在可选设置中,分布式存储系统100还可以提供条件写入方法。如果数据项的当前一致值等于客户端提供的预期的旧值,那么条件写入方法允许客户端(例如150)在传输至分布式存储系统100的条件写入请求中提供预期的旧值和更新值,这种方法将仅存储更新值至已识别出的数据项。为了处理条件写入,收到条件写入请求的节点首先使用图5中的方法读取数据项,并且将数据项与由客户提供的预期的旧值进行比较。如果比较指示条件写入应该继续进行,那么已更新的值是由节点使用图如和图4b中的写入方法写入的。即使当节点在任意点处发生故障且同时使用图如和图4b中的方法写入更新时, 条件写入也可以完成。客户端(例如150)将在故障之后暂停,并且作为响应,向分布式存储系统100中的另一个节点重新传输条件写入请求,然后该另一个节点尝试变成群首节点。 在这个过程中,新的群首节点要么检测到已经完全地或部分地应用了更新(并且因此完成了更新),要么检测到尚未应用更新并且旧值仍旧可用于核对客户端的预期的旧值。在可选设置中,节点(例如110)可以不尝试解决由图5中所示的读取方法的步骤 516中的数据项的簇读取返回的冲突值。相反地,节点110将使用数据项的所有的冲突值来对读取请求提供服务,即,所有的冲突值将在图5的步骤520中被传输至客户端。然后轮到客户端(例如150)选择使用哪一个冲突值,并将写入请求传输至分布式存储系统100以便纠正不一致。在可选设置中,分布式存储系统100响应于来自客户端的请求而处理的每个更新可以涉及由分布式存储系统100存储的一个或多个数据项。在上文的实施方式中,当确定系统处于相对一致的状态时使用的有效的(第二) 读取模式包括仅从单个节点读取。但是,预计在可选实施方式中,它可以包括仅从两个或可能更多个节点读取;只要这个节点数小于在其它(第一)读取模式中读取的节点数,使得第二读取模式可以提供超出第一读取模式的对性能的改进。 需要理解的是,所描述的与任何一个实施方式相关的任何特征可以单独使用,或结合所描述的其它特征使用,而且还可以结合任何其它实施方式或任何其它实施方式的任何组合中的一个或多个特征使用。此外,在不脱离本发明的范围的前提下,还可以利用上文未描述的在所附权利要求中定义的等同物和修改。
权利要求
1.一种对包括经由数据通信网络而连接的多个存储节点的分布式存储系统中的数据项进行访问的方法,每个所述数据项跨越多个所述存储节点进行复制,其中,所述方法包括通过在第一读取模式和第二读取模式之间进行选择来从所述分布式存储系统中读取数据项,所述第一读取模式包括尝试从包括多个所述存储节点在内的节点组中读取数据项以检查跨越所述节点组中的至少一簇的数据项一致性,所述第二读取模式包括从至少一个所述存储节点中读取数据项,所述方法包括 接收在给定节点中检索数据项的请求;根据所述分布式存储系统的系统状态的至少一个检出特性来选择在所述数据项的检索中使用所述第一读取模式和第二读取模式中的哪一种,其中,所述选择包括当系统状态的至少一个检出特性指示较高可能性的数据项一致性时选择所述第二读取模式,以及当系统状态的至少一个检出特性指示较低可能性的数据项一致性时选择所述第一读取模式; 使用所选定的读取模式从所述分布式存储系统中读取所述数据项;以及响应于检索数据项的所述请求,传输通过所述选定的读取模式读取的所述数据项。
2.根据权利要求1所述的方法,其中,所述第一读取模式包括从第一数量的多个节点中读取数据项,其中所述第二读取模式包括从第二数量的多个节点中读取数据项,并且其中所述第二数量小于所述第一数量。
3.根据权利要求1或2所述的方法,其中,所述第二读取模式包括从多个节点中的仅一个节点中读取数据项。
4.根据前述任一项权利要求所述的方法,其中,所述给定节点响应于对检索数据项的所述请求的接收,根据系统状态的至少一个检出特性所指示的当前系统状态来执行读取模式的选择。
5.根据前述任一项权利要求所述的方法,其中,所述簇包括所述节点组的一多半。
6.根据权利要求4或5所述的方法,包括使用从多个节点中的所述簇中读取的数据项来对存储在所述多个节点中的一个或多个节点中的数据项进行更新。
7.根据前述任一项权利要求所述的方法,包括从所述节点组中的多个节点请求指示所述数据项的写入命令的同意的消息; 检测指示所述数据项写入命令尚未得到所述节点组同意的同意问题特性; 将所述同意问题特性包括在所述分布式存储系统的系统状态的所述至少一个检出特性中。
8.根据前述任一项权利要求所述的方法,包括在所述给定节点中对本地存储的数据项可能过时的指示进行监控; 对指示所述本地存储的数据项可能不是最新版本的数据项的过时特性进行检测; 将所述过时特性包括在所述分布式存储系统的系统状态的所述至少一个检出特性中。
9.根据前述任一项权利要求所述的方法,包括 针对所述节点组来分配当前群首节点;对指示所述给定节点不是所述节点组的当前群首的群首问题特性进行检测; 将所述群首问题特性包括在所述分布式存储系统的系统状态的所述至少一个检出特性中。
10.根据权利要求9所述的方法,包括,在所述给定节点中响应于在所述给定节点接收到来自所述节点组中的其它节点中的至少一个节点的确认消息,承担对存储在所述节点组中的每个成员中的数据项的更新进行控制的责任;以及根据在所述给定节点中收到的群首配置信息来检测所述群首问题特性,所述群首配置信息指示已经发生了对更新进行控制的责任的随后的更改。
11.根据权利要求8至10中任一项所述的方法,其中,所述监控包括监控所述给点节点是否处于最近故障的状态。
12.根据权利要求8至11中任一项所述的方法,其中,所述监控包括监控所述给定节点是否已经不能与所述节点组中的一个或多个其它节点联系。
13.根据权利要求8至12中任一项所述的方法,其中,所述监控包括监控与所述数据项相关的更新的情况是否已经意外地完成。
14.一种对包括经由数据通信网络而连接的多个存储节点的分布式存储系统中的一存储节点的数据项进行备份访问的方法,每个所述数据项跨越多个所述存储节点进行复制,其中,所述方法包括检测所述存储节点已经与包括多个所述存储节点的节点组中的其它存储节点断开,数据项已经跨越多个所述存储节点进行了复制;查询所述一组存储节点的一个或多个成员以识别负责对所述一组存储节点的更新进行协调的当前群首节点;确定与所述存储节点可能已经错过了对所述节点组的更新相关的一个或多个数据项;以及响应于所述确定,查询所述节点组中的一个或多个节点以更新本地存储的数据项,以确保所述本地存储的数据项与所述节点组中的至少一簇的一致性。
15.根据权利要求14所述的方法,其中,所述确定与所述存储节点可能已经错过了对所述节点组的更新相关的一个或多个数据项包括识别与所述群首节点尚未确认复制动作的完成相关的一个或多个数据项。
16.一种对包括经由数据通信网络而连接的多个存储节点的分布式存储系统中的一存储节点的数据项进行备份访问的方法,每个所述数据项跨越多个所述存储节点进行了复制,其中,所述方法包括检测所述存储节点已经发生故障并且已经重新启动;查询所述一组存储节点的一个或多个成员以识别负责对所述一组存储节点的更新进行协调的当前群首节点;确定由所述当前群首节点进行协调的分布式存储系统动作的序列中的点的标识符,以及参与由所述群首节点所指示的超出所述序列中所述点的范围的读取和/或写入动作。
全文摘要
一种对包括多个存储节点的分布式存储系统中的数据项进行访问的方法。每个数据项跨越多个存储节点而进行复制。数据项是通过在第一读取模式与第二读取模式之间进行选择而从分布式存储系统中读取的,该第一读取模式包括尝试从一组存储节点中读取数据项以检查跨越该节点组中的至少一簇的数据项一致性,该第二读取模式包括从至少一个存储节点中读取数据项。该读取模式是根据所述分布式存储系统的系统状态的至少一个检出特性而选择的。当检测到的特性指示较高可能性的数据项一致性时,则选择第二读取模式,而当检测到的特性指示较低可能性的数据项一致性时,则选择第一读取模式。
文档编号H04L29/08GK102567438SQ201110296608
公开日2012年7月11日 申请日期2011年9月28日 优先权日2010年9月28日
发明者迈克尔·杰弗里·埃文斯 申请人:迈塔斯威士网络有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1