CN112925763B - 一种基于cad快速持久化的方法 - Google Patents
一种基于cad快速持久化的方法 Download PDFInfo
- Publication number
- CN112925763B CN112925763B CN202110301348.4A CN202110301348A CN112925763B CN 112925763 B CN112925763 B CN 112925763B CN 202110301348 A CN202110301348 A CN 202110301348A CN 112925763 B CN112925763 B CN 112925763B
- Authority
- CN
- China
- Prior art keywords
- nodes
- node
- data
- written
- performance
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/18—File system types
- G06F16/182—Distributed file systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/10—File systems; File servers
- G06F16/13—File access structures, e.g. distributed indices
- G06F16/134—Distributed indices
-
- H—ELECTRICITY
- H04—ELECTRIC COMMUNICATION TECHNIQUE
- H04L—TRANSMISSION OF DIGITAL INFORMATION, e.g. TELEGRAPHIC COMMUNICATION
- H04L69/00—Network arrangements, protocols or services independent of the application payload and not provided for in the other groups of this subclass
- H04L69/26—Special purpose or proprietary protocols or architectures
Abstract
本发明为一种基于CAD快速持久化的方法,该方法包括以下步骤:(1)确定分布式系统集群中的总节点个数N,令F=(N‑1)/2,设置纠删码的数量为k,同时设置选择参数x的值;(2)判断集群中Leader节点最近收到的应答节点数是否大于等于F,如果大于等于F执行步骤(3);(3)判断集群中Leader节点最近收到的应答节点数是否大于等于F+k;如果Leader节点最近收到的应答节点数大于等于F+k,则按照F‑CAD一致性协议进行复制,直至F+1+x个节点持久化写入全量数据,提交该日志条目,执行下一轮复制;若Leader节点近期收到的应答节点数小于F+k,则按照CAD协议对系统进行一致性复制,直至全量数据持久化写入至少F+1+0个节点,提交该日志条目,执行下一轮复制。该方法能够降低单点故障的概率。
Description
技术领域
本发明属于分布式系统中一致性协议领域,具体是一种基于CAD快速持久化的方法,该方法使分布式系统在应对跨客户端读数取数据的问题时可以在保证单调性的同时还能兼顾高性能。
背景技术
分布式存储领域研究的一大重点是如何保证系统各节点数据的一致性,从线性化到最终一致性以及介于强一致性和弱一致性之间已经提出了很多模型,如因果一致性、存在一致性、可扩展的因果一致性等,并且已经得到了很好的研究。不过尽管进行了很多年的研究,但是当前大多数一致性协议在应对跨客户端读取数据的问题时,仍难以给出一个高效的解决方案。目前比较常见的解决方案有两个:同步持久化和异步持久化。同步持久化需要在提交日志条目时将该日志条目持久化写入到全部节点,总体写入速度为性能最差节点的写入速度,通常使用此模型来实现强一致性,例如,为防止陈旧的读取,分布式系统会同步写入使数据持久化,否则,可能会丢失已经确认的日志条目,从而在后续读取时读到陈旧的数据,如LogCabin。而异步持久化,通过快速确认写入来实现高性能,每次写入被延迟复制和持久化,无法实时化,可以看出此模型语义并不强,会使过时和乱序的数据暴露给用户。一般被用于具有较弱一致性模型的系统,如2014年由Diego Ongaro和John Ousterhout等在《In Search of an Understandable Consensus Algorithm(ExtendedVersion)》一文中提出的RAFT一致性算法便被广泛设计为一种异步持久化模型,其在应对跨客户端读取数据的问题时总避免不了乱序等错误的出现。
Aishwarya Ganesan等人在2020年发表于FAST会议的《Strong and EfficientConsistency with Consistency-Aware Durability》一文中提出的CAD一致性协议提出了一个比较折衷的解决方案。他们发现异步持久化会在节点发生故障时任意丢失数据,因此会同时阻碍非陈旧读取和单调读取的实现,不过异步持久化的性能要明显要优于同步持久化,基于这一点CAD选择延用异步写的高性能,其核心思想是:在读时强制数据持久化,写时按原一致性协议规则异步写入,简单来说就是读时会判断该读请求要访问的数据是否已经持久化,也就是该数据是否至少被F+1节点持久化写入,然后通过租约机制创造一个有效集来对读请求做限制,仅能从集合里的节点读取数据,值得注意的是数据被持久化写入的节点才能加入该集合。
但是他的缺点也很明显,可以看出,CAD协议中数据可读取的前提条件是该数据是否已经被持久化写入大多数节点。如果用户恰好要读取新写入的数据时,系统需要等待大多数节点持久化写入,并且仅能从有效集中的节点读取数据,其性能和同步持久化类似。比较糟糕的一种情况是:用户恰好需要频繁读取新写入的数据,此时CAD在应对热读时便很容易造成系统阻塞,甚至瘫痪。
发明内容
针对现有技术的不足,本发明拟解决的技术问题是,提供一种基于CAD快速持久化的方法,该方法通过将纠删码和CAD协议高效结合,在保证单调性的同时还能保证用户可以快速读到最新写入的数据,并且在一定程度上也节省了网络和存储资源。
本发明解决所述技术问题采用的技术方案是,一种基于CAD快速持久化的方法,该方法包括以下步骤:
(2)用户发出的写请求会生成对应的日志条目,根据生成的日志条目及分布式系统所提供的负载均衡接口的性能参数会得到一个分流日志表,该分流日志表包含Node(表示节点名)字段、Log_Index(表示日志条目的索引)字段、Frag_S(表示片段信息)字段、Per(表示节点性能)字段,并且得到的分流日志表会按照Per字段数据的大小完成降序排序;
(3)分布式系统通过多数派的原则确定Leader节点;
(4)判断集群中Leader节点最近收到的应答节点数是否大于等于F,如果大于等于F执行步骤(5);否则系统报错,该集群无法保证一致性;
(5)判断集群中Leader节点最近(距离当前时间段最后一轮RPC(远程过程调用))收到的应答节点数是否大于等于F+k;如果Leader节点最近收到的应答节点数大于等于F+k,则按照F-CAD(指在CAD的基础上加入纠删码)一致性协议进行复制,执行步骤(6);
若Leader节点近期收到的应答节点数小于F+k,则按照CAD协议对系统进行一致性复制,直至全量数据持久化写入至少F+1个节点,提交该日志条目,执行下一轮的复制;
(6)开始执行F-CAD一致性协议复制过程:
结合纠删码,快速单调可读:日志条目在写入各个节点时会先通过纠删码将该日志条目均分为k个数据片段,然后通过k个数据片段计算得到m个校验片段且满足生成的所有片段(包括校验片段和数据片段)会发送给Leader节点,通过Leader节点执行后续的复制。此处的k和m均表示生成片段的数量,被分片的数据片段的数量与纠删码中k的数量一致,k和m的和等于可用节点个数
纠删码分片结束后Leader节点将上述生成的k个数据片段和m个校验片段分发给包括Leader节点在内的全部节点,当前每个节点仅需写入一个数据片段或校验片段,其中数据片段通过查询分流日志表按指定规则持久化写入节点Per字段较高的节点(即k个数据片段在写入节点时,按照Per字段高低依次写入)中,当全部数据片段及至少F个校验片段持久化写入到节点中,此时用户便可以通过分别读取已经持久化的数据节点来读取完整数据,以达到快速单调可读的状态;
执行第一次分流操作:在达到单调可读条件之后,通过逆序查询分流日志表中的各节点字段按制定规则将性能较差节点的数据片段持久化写入到性能较优的节点中,使得用户可读的节点增多以实现分流的效果,有效地避免了单点故障问题;
在执行第一次分流操作前,系统会事先设定一个较优节点和一个较差节点为一个等级,比如:分流日志表中第2F+1和第1行所对应的节点为一个等级,第2F和第2行所对应的节点为一个等级……,由于第F+1节点无与之配对的节点,需单独讨论;
当前系统需要逆序遍历分流日志表中F个节点的Frag_S字段,如果当前节点的Frag_S字段内容为数据片段,则将该节点存储的数据片段持久化写入到同一等级的较优节点中;如果当前节点的Frag_S字段内容为校验片段,则同一等级的较优节点需要在自己已写入片段的基础上按照原日志条目分割的顺序在自己已写入片段的基础上持久化写入一个尚未写入的首片段(如果自己已写入的片段为校验片段P,则再写入数据片段1,完成第一次分流后同一等级较优节点中已写入的片段为校验片段P和数据片段1;如果自己已写入的片段是数据片段2,则再写入数据片段1,完成第一次分流后同一等级较优节点中已写入的片段为数据片段2和数据片段1;如果自己已写入的片段是数据片段3,则再写入数据片段1,完成第一次分流后同一等级较优节点中已写入的片段为数据片段3和数据片段1。);
第F+1节点为单个节点,同上述Frag_S字段内容为校验片段处理结果一致,未配对的单节点按初始分片顺序在自己已写入片段的基础上持久化写入一个尚未写入的首片段(首片段是指除了自身以外的剩余数据片段中位于最前的一个);
执行第二次分流操作,部分节点做数据补全操作:用户需事先给定整型参数x一个确切的值,且0≤x≤F,以供用户在节能和高性能之间进行选择,Leader节点首先查询用户设置的x值,根据x值选择后续的数据补全方案。Leader节点查询分流日志表中前F+1+x个节点的Frag_S字段的信息,根据Frag_S字段提供的已经持久化写入的数据片段编号,得出尚未写入的数据片段,然后将,未写入的数据片段继续持久化写入到性能较优的前F+1+x个节点组成完整数据,进一步进行分流,以提高性能;
而对于剩余的F-x个节点不选择继续写入,始终以第一次分流后的相应片段保留在相应节点之中,以达到节能的效果。
本发明还保护一种分布式系统,该分布式系统使用上述的基于CAD快速持久化的方法,应用于解决跨客户端读时数据乱序、混乱的问题,并且等待写入时间要明显少于CAD一致性协议。
与现有技术相比,本发明有益效果在于:
1.数据快速持久化。CAD协议虽然改进了现有的一致性协议,使用户一定程度上可以高效地实现跨客户端单调读取数据,但是实际应用中会出现的一种情况是最新写入的数据恰巧是用户最希望读到的数据,而CAD协议在处理这一类型读请求时处理速度很慢,速度基本和同步持久化一致,持久化写入到大多数节点才可读(假定有2F+1个节点,需要持久化写入大于等于F+1个节点)。本发明缩短了写入时间,通过纠删码将数据分片使得达到单调可读条件仅需每个节点持久化写入一个片段即可,假定写入单个节点单次写入的数据量为1,需要写入的数据量由原来的F+1减少到(F+k)/k。
2.全程保证F+1的Liveness。当纠删码应用到一致性协议时,服务器的数量N通常固定且为基数个。如果每个服务器仅存储由(k,m)-RS码生成的一个片段,其参数k和m服从k+m=N。一致性协议通常具备Safety和Liveness两种特性,Safety表示:在非拜占庭条件下,系统不会返回非正确的结果;Livenesss表示:只要大多数服务器都是活跃的,并且可以相互通信,也可以与客户端通信,它们就可以正常工作,则称这组服务器为健康服务器。但是,诸如RAFT、Paxos的Liveness是F+1,而纠删码的安全级别是k,但是经常会有k<(F+1),而较高的Liveness也代表着较高的可靠性,因此如何保证F+1的Liveness特别重要。
在异步系统中有个很重要的机制保证来safety:Quorum机制。假定有N个副本,写入Quorum QW={w1,w2,w3,w4,……,wi},读取Quorum QR={r1,r2,r3,r4,……,ri},更新操作wi在QW个副本中更新成功之后,才认为此次更新操作wi成功,称成功提交的更新操作对应的数据为:“成功提交的数据”。对于读操作而言,至多需要读QR个副本才能读到此次更新的数据。Quorum机制只要保证QW+QR–N>0便可以保证Safety,也就是需要保证QW和QR有交集,即满足包含-排除原则:|QW∪QR|=|QW|+|QR|-|QW∩QR|。常见的将纠删和一致性结合的方式是通过增加交集的大小,使得|QW∩QR|≥k,这样写操作所需的确认写入需由F+1变为F+k才能保证F+1的Liveness。因为至少需要F+k个节点确定写入,即QW=F+k,而QW和QR的交集至少为k,根据包含-排斥原则得|QW∪QR|=|F+k+QR|≥F+k,所以|QW|+|QR|-|QW∩QR|=F+k+|QR|-k≥F+k,此时F+|QR|≥F+k,令QW=F+1,则有N≥F+k必定成立,所以可以保证F+1的Liveness。
3.有效地降低了单点故障。本一致性方案虽然在CAD的基础上达到了快速单调可读的条件,但是由于此时数据以片段的方式唯一存储在单个节点中,因此如果多个用户恰巧仅需读取某个数据片段,会大大增加存储该数据片段的节点的故障概率。为了解决这一问题,通过构建一个分流日志表,该表包含四个字段:Node字段(表示其对应的节点名)、Log字段(日志条目的索引,即Index)、Frag_S字段(表示其对应节点所存储的片段信息)、Per字段(表示其节点对应的当前性能,通过直接调用分布式系统性能接口得到,并且会按照性能参数来对表进行降序排序),使得性能较优的节点能够在第一时间持久化写入性能较差节点的数据,增加可读节点的数目,并且后续的全量写入也会进一步增加可读节点数目,有效地降低单点故障的概率。
4.总体数据写入量减少。在第二次分流时用户可以选择部分节点全量写入,当F+1个节点写入全量数据之后,剩余节点通过系统给定的未知参数x选择具体的F+1+x个节点全量写入,剩余节点继续以片段的方式存在。由于全量数据节点是性能较优的节点,而且数据写入大多数节点已经高效地实现了分流效果并且提供了高性能,所以可读节点的少量减少并不会对系统造成较大的影响,并且可以从一定程度上减少了写开销,当x=0时,可以减少(F-(F+m)/k)/(2F+1)的写入开销。
本申请的核心创新点是将CAD协议和纠删码高效结合,属于一种一致性协议,是在CAD协议的基础上做的工作,弥补了CAD协议的不足。主要解决的问题是数据的一致性,是为了快速达到跨客户端单调读取数据的效果。
附图说明
图1是本发明基于CAD快速持久化的方法的总体写入流程示意图。
图2是本发明实施例1的分流日志表的初始值示意图。
图3是本发明实施例1的CAD结合纠删码生成片段示意图。
图4是本发明实施例1的F-CAD一致性方案快速达到单调可读条件示意图。
图5是本发明实施例1的F-CAD一致性方案初步分流方案示意图。
图6是本发明实施例1的F-CAD一致性方案结合预设值x第二次分流的示意图。
图7是本发明实施例2的两个节点发生分区故障示意图。
图8是本发明实施例2的两个节点分区故障方案进行数据写入的示意图。
具体实施方式
下面给出本发明的具体实施例。具体实施例仅用于进一步详细说明本发明,不限制本申请权利要求的保护范围。
本发明的应用场景是分布式系统,分布式系统由一个又一个节点构成,N代表总节点个数。一致性协议用来保证分布式系统中数据的一致性,一致性协议要求总结点个数为奇数个,因为半数节点在一致性协议中是一个很重要的阈值,所以将N=2F+1,方便后续利用半数节点做阐述,也保证总结点个数为奇数个。
总体来说本发明是为了保证分布式系统可以快速持久化数据以方便用户快速读取新写入数据的同时还能保证单调性,所谓单调性是指系统无论何时都不会读到旧的数据,通过反例说明一下,也就是读取不同的节点会读到旧的数据,举个例子:时间t0<t1,对于数据a:a0相对于a1是旧的版本,其中节点S1性能优于节点S2,节点S1先于节点S2将a0更新为a1,且t1时刻节点S2还未来得及更新数据a,在t0时刻读取节点S1中的数据a版本为a1,但是在t1时刻读取节点S2中的数据a读到的版本为a0,出现了乱序问题。
图1是本发明的总体写入流程示意图,主要分为F-CAD(快速持久化的CAD协议,为本申请的核心创新点)和CAD(已经提出的一致性协议)两大部分。
首先需要确定一个前提条件是:Leader节点最近收到的应答节点数大于等于F。然后会通过一个判定语句来选择具体要执行的复制方式:
如果Leader最近收到应答节点数小于F+k,按CAD协议进行一致性复制。CAD协议无论用户预设的未知变量x的值为多少,均使得x=0。然后Leader节点通过判断全量数据是否持久化写入到至少F+1+0个节点,如果尚未持久化写入到F+1个节点,则继续等待CAD一致性复制的完成;如果已经持久化写入到至少F+1个节点,则提交该日志条目,执行下一日志条目的复制。
如果Leader最近收到应答节点数大于等于F+k,则按F-CAD协议进行一致性复制,F-CAD主要分为两大部分:先结合纠删码做数据分片生成数据片段和校验片段,然后执行负载均衡模块(即第一、二次分流)。此时的未知变量x为用户的预设值。Leader节点会在执行第二次分流后判断全量数据是否持久化写入到至少F+1+x个节点,如果尚未持久化写入到F+1+x个节点,则继续等待F-CAD一致性复制的完成;如果已经持久化写入到F+1+x个节点,则提交该日志条目,执行下一日志条目的复制。
本发明提供了一种基于CAD快速持久化的方法(简称方法),该方法包括以下步骤:
(1)对于分布式系统,用户发出的写请求所要写入的数据会转换成日志条目(因为日志条目相对于真实要写入的数据而言数据量较小,所以发送给各个节点的时候所需发送的数据量会大大减少,各个节点在收到日志条目后再转换成真实的数据进行写入,因此在分布式系统中一般是以日志条目的方式执行写入复制),日志条目包含日志索引部分和数据部分。设定整个集群共有2F+1个节点(保证节点总数为奇数),纠删码的数据分片数目为k,同时用户提前设定选择参数x的具体值;
(2)通过多数派原则确定Leader节点;
(3)通过(2)中确定的Leader节点判断近期收到的应答节点数是否大于等于F,如果大于等于F执行步骤(4);否则系统报错,该集群无法保证一致性;
(4)用户发出一个写请求,该写请求会生成对应的日志条目,根据日志条目及分布式系统提供的负载均衡接口获得性能参数,并通过性能参数和日志条目获得分流日志表中Node字段、Index字段和Per字段的具体值,并按Per字段给定的值按进行降序排列;
(5)判断当前Leader节点最近收到的应答节点数是否大于等于F+k,如果小于F+k,执行步骤(6);如果大于等于F+k,执行步骤(7);
(6)如果不满足F+k个节点可用的条件,强行使用纠删码会使得该一致性方案的降低且小于F+1,对于分布式系统一般无法忍受小于F+1的Liveness。因此为了保证F+1的Liveness,此时系统需要按原CAD协议对系统进行复制。Leader先持久化写入该日志条目后再将该日志条目分发给全部节点令其持久化写入,然后Leader节点会判断全量数据是否持久化写入到F+1+x个节点(此时x=0),若全量数据未持久化写入到F+1+x个节点则返回继续按照CAD方案执行复制;若全量数据持久化写入到F+1+x个节点,则执行步骤(8)。CAD协议的含义是:需要持久化写入到至少F+1节点用户才可读该写入,并且只能从已经持久化写入的节点读取数据。
(7)此时满足F+k个节点可用的条件,即使加入纠删码也满足F+1的Liveness,因此可以用F-CAD结合纠删码的复制方式执行复制:
结合纠删码,快速单调可读:根据Leader节点此前获得确认节点数得到当前可用节点数目为所以纠删码中的校验片段跟据k和mLeader节点将写请求生成的日志条目结合纠删码进行分片,分为k个数据片段和m个校验片段,其中日志条目的Index字段不作分片。Leader节点根据(4)中生成的分流日志表按数据分片的顺序将k个数据片段分发给表中前k个节点,m个校验片段分发给表中的剩余节点(剩余节点数目=m),通知所有节点持久化写入收到的片段,并称持久化写入数据片段的节点为数据节点,持久化写入校验片段的节点为校验节点。直到Leader节点收到k个数据片段持久化写入以及任意至少F个校验片段持久化写入的确认消息即达到单调可读条件。其中,F和m并不相关,m是校验片段的数量。本发明在第一轮写入时需要持久化写入至少F+k个片段,包括所有数据片段持久化且至少F个校验片段持久化,第一轮写入时m个校验片段并不需要全部持久化写入;
完成结合纠删码写入操作后,Leader节点通过收到的确认写入消息得到各片段持久化写入的具体详情,并将片段信息写入(4)中生成的分流日志表中,同时表中数据也会按Per字段实时进行降序排序;
执行第一次分流:完成上述片段的持久化写入操作后每个数据节点均唯一地存储了一个数据片段,如果用户频繁地访问某一数据片段的内容,此时虽然达到CAD单调可读条件,但存储该数据的节点可能会出现单点故障的问题,因此需要实施分流操作以降低单点故障的概率;
Leader首先访问分流日志表中最后一行数据的Frag_S(片段信息)字段,如果该字段表示的内容为数据片段,则访问分流日志表中对应等级(第一行数据)的Node字段找到性能最优的节点名,然后Leader节点将先前读取到的最后一行数据的Frag_S字段里所标识的数据片段持久化写入到最优节点中;如果该字段表示的内容为校验片段,则访问分流日志表中对应等级(第一行数据)的Node字段找到性能最优的节点名,然后继续访问最优节点的Frag_S字段,得出未写入的数据片段,按初始分片顺序在自己已写入片段的基础上持久化写入一个尚未写入的首片段。接下来继续访问分流日志表中最后倒数第二行数据的Frag_S字段,具体操作流程同上,直到访问完分流日志表中倒数F个节点(校验节点或数据节点),此时性能较差节点的数据片段已经全部持久化写入到较优节点中;
由于第F+1节点没有与之对应的节点,为了防止空操作,按初始分片顺序在自己已写入片段的基础上持久化写入一个尚未写入的首片段;
执行第二次分流操作,部分节点做数据补全操作:完成上述操作,系统完成了初步的分流方案,按传统的一致性协议会继续对其余尚未写入全量数据的节点继续进行数据补全并且最后删除校验片段,但是如此先前写入的校验片段便是多余的写入,因此通过用户定义的整型参数x(0≤x≤F),在节能和高性能之间进行选择,其中F+x+1个节点全量复制,较小的x代表较少的写入资源和存储资源但是也意味着较少的节点供用户可读,反之较大的x则代表用户在跨客户端读取数据时能够表现出更高的性能。Leader节点首先查询用户设置的x值,根据x值选择后续的数据补全方案,Leader节点查询分流日志表中前F+1+x个节点的Frag_S字段的信息,根据Frag_S字段提供的已经持久化写入的数据片段编号,得出尚未持久化写入的数据片段,然后将未写入的数据片段继续持久化写入性能较优的前F+1+x个节点成为完整的数据;
而对于剩余的F-x个节点不选择继续写入,始终会以第一步分流后所保留的相应片段的方式保留在相应节点之中,如此由于无需所有节点均写入全量数据,可以大大节省网络和存储资源;
然后通过Leader节点判断全量数据是否持久化写入到F+1+x个节点(此时x为用户预设值),若全量数据未持久化写入到F+1+x个节点则返回继续按照F-CAD方案执行复制;若全量数据持久化写入到F+1+x个节点,则执行步骤(8);
(8)提交该日志条目:当一个日志条目完成上述流程之后,说明该日志条目已经持久化写入到大多数节点,完成了该日志条目的写入,可以继续进行下一个日志条目的写入。
实施例1
如图1所示,是本一致性方案的整体写入流程,其中深色部分表示系统此时可以实现单调读。用户发出一个写请求,生成的日志条目记为写请求1,该写请求1的日志Index字段也可以记为1,写请求1发送给Leader节点,Leader节点先判断最近确认写入节点数目是否大于等于F+k,如果小于则按CAD协议执行复制,否则写请求1按F-CAD一致性协议执行复制,通过纠删码将数据分片并持久化写入,然后执行两次分流操作,根据用户给定的x值继续持久化写入,直到F+x个节点的数据已经全量写入,此时可以提交该条目,执行下一个日志条目的写入,接下来详细说明日志条目1的写入流程。
(1)本实施例中的存储系统中初始存储数据为0,共有7个节点分别是S1、S2、S3、S4、S5、S6、S7,Leader节点已经通过其余节点选举得出,其中S1为Leader节点,并且当前该存储系统中的其余6个节点均可以同Leader节点通信。分流日志表Per字段已经根据调用分布式系统中的性能接口得到并且根据各节点性能已经从高到低完成排序,分别是S1、S2、S3、S4、S5、S6、S7,Index字段也已经通过日志条目索引得到。如图2所示,为初始分流日志表信息。
(2)开始第一轮写入:用户发出一个写请求1,因为节点S1为Leader节点,所以将该写请求发送给节点S1,节点S1收到用户发出的写请求,该写请求会以日志条目的方式分发给其余节点,由于节点S1可以同时与节点S2、S3、S4、S5、S6、S7通信,当前可用节点数量为7,本实施例中总结点个数为7,即2F+1=7,则F为3,同时并且设置的纠删码k为3,所以当前F+k=6,而系统当前可以互相通信的节点为7,满足当前可通信节点至少为F+k的前提条件,所以可以使用结合纠删码的复制方案进行复制。节点S1根据纠删码提供的k值将该日志条目的数据部分分为大小相等的3个数据片段,由于集群内当前有7个节点可用,所以通过结合纠删码矩阵变换得到4个校验片段(3+4=7),且单个校验片段的大小和单个数据片段的大小一致,4个校验片段均用P表示。其中任意的3(代表纠删码的数量k)个片段(比如2个校验片段和1个数据片段,或者3个数据片段或者3个校验片段、或者1个校验片段和2个数据片段)均可以通过计算可以得到全部数据,然后给每个片段附加该日志条目的Index字段1,如图3所示。
Leader节点正式开始写入,如图4所示。根据图2所示的分流日志表中的Per字段可以得到当前各节点性能依次从高到分别为S1、S2、S3、S4、S5、S6、S7,因此Leader节点自己写入数据片段1,并将数据片段2发给S2、数据片段3发给S3,将校验片段分发给S4、S5、S6、S7,然后各节点开始写入数据,直到S1、S2、S3节点持久化写入数据片段1、2、3以及任意3个校验节点持久化写入校验片段(无需全部校验片段均持久化写入,本发明在结合纠删码之后持久化写入F+k个节点即可),图中S1、S2、S3、S4、S5、S6节点性能较好,优先持久化写入完成,Leader节点收到S1、S2、S3、S4、S5、S6节点持久化写入完成的确认消息,此时Leader节点此时收到了F+k=6个节点持久化写入的消息,因此通知用户此时可以读取数据,并且可以具备单调性。
(3)开始第二轮写入:如图5所示。Leader节点通过查询当前分流日志表中的Per字段得到节点S5是性能最优节点(经过前一轮写入,节点性能会由于数据的写入而发生变化),S1次之,……,节点S2是性能最差节点,可以看到节点S2是数据节点且性能最差,如果多用户恰好读取数据片段2会大大增加节点S2的故障概率,所以此时性能最优节点S5写入数据片段2,如此用户便可以通过读取节点S5也可以读到数据片段2。然后由于节点S6的Per字段为2.0较节点S2稍优,但是由于节点S6的Frag_S字段为校验片段,所以节点S1不写入节点S6的片段,同时查询节点S1的Frag_S字段已经写入数据片段1,所以继续写入数据片段2(因为此时执行的操作是第一次分流操作,性能较优的节点写入性能较差节点的数据片段,校验片段不写入。S7、S6均是校验片段,节点S2数据片段已经被节点S5写入,所有写入都是一次操作,防止空操作同时也为了更好的分流,性能较优的节点即便没有性能较差节点的数据需要写入也会自动执行补全数据操作。)。同理查询节点S7的Frag_S字段为校验片段,所以节点S3不写入节点S7的片段,同时查询节点S3的Frag_S字段已经写入数据片段3,所以继续写入数据片段1。由于节点S4位于表的中间值,为单个节点,同时查询节点S4的Frag_S字段为P,所以写入数据片段1。此时初步完成了第一阶段的分流。
(4)开始第三轮写入:如图6所示。由于用户给定的x值为0,F+1+x=4,所以集群中4个节点需要全量写入(全量写入指将所有数据片段都写入到节点中),剩余的3个节点只需要以片段的方式(指的是第一步分流后所保留什么片段就按照那个片段进行存储)存在于集群中即可。此时Leader节点通过查询当前日志表中各节点的性能,选择性能较优的前F+1+x个节点需要全量写入,得到节点S5、S1、S3、S4需要全量写入数据,通过查询节点S5的Frag_S字段已经写入校验片段P和数据片段2,因此继续写入数据片段1和数据片段3;通过查询节点S1的Frag_S字段已经写入数据片段1和数据片段2,因此继续写入数据片段3;通过查询节点S3的Frag_S字段已经写入校验片段P和数据片段2,因此继续写入数据片段1和数据片段3;通过查询节点S4的Frag_S字段已经写入校验片段P和数据片段1,因此继续写入数据片段2和数据片段3。
(5)由于此时全量数据已经写入到节点S1、S3、S4、S5,其余节点虽然以片段的方式存在,但是已经符合一致性协议的大多数规则,所以可以提交日志条目1,继续写入下一个日志条目。
实施例2
(1)本实施例中的存储系统中初始存储数据为0,共有7个节点分别是S1、S2、S3、S4、S5、S6、S7,Leader节点已经通过其余节点选举得出,其中S1为Leader节点,并且该存储系统中S6、S7节点与S1、S2、S3、S4、S5节点发生分区故障,该存储系统中能够和Leader节点互相通信的节点的S2、S3、S4、S5。映射表Node字段已经根据调用原一致性系统中的性能接口得到并且根据各节点性能已经从高到低完成排序,分别是S1、S2、S3、S4、S5,虽然集群中存在7个节点,但是由于S6、S7节点与其余节点分区,Leader节点此时无法访问S6、S7节点,所以无法得知S6、S7节点此时的相关信息,如图7所示。
(2)用户发出一个写请求a,因为节点S1为Leader节点,所以将该请求发送给节点S1,节点S1收到用户发出的写请求,该写请求会以日志条目的方式分发给其余节点,由于节点S1只能同时与节点S2、S3、S4、S5通信,当前可通信节点大于4(F+1)但是小于6(F+k)(F=(7-1)/2=3),所以无法使用F-CAD协议结合纠删码的方式进行复制,需要按CAD协议进行复制。
按CAD协议直接写入:如图8所示,节点S1先将该日志条目持久化写入,此时再将该日志条目分别发送给节点S2、S3、S4、S5,等待其余节点的持久化写入,直到该集群中包括Leader节点至少F+1(4)个节点持久化写入后提交该日志条目,图中节点S2、S3、S4由于当前性能较佳,所以较快持久化写入,当Leader节点(S1)收到节点S2、S3、S4已经持久化写入的消息后,由于此时已经被写入到大多数节点,满足CAD单调读取的条件,可以提交日志条目1,继续写入日志条目2。用户此时可以通过Leader节点、节点S2、S3、S4读取最新写入的数据a。
本发明是针对上层分布式文件系统,将纠删码和CAD协议结合,是对一致性协议的改进,而非底层存储的冗余方案。通过纠删码技术将数据分为k个数据片段后会分别写入到各个节点后,此时每个数据节点唯一地存储了一个数据片段,如果用户频繁地访问某一数据片段的内容,存储该数据的节点可能会出现单点故障的问题。在达到单调可读条件之后,通过一个分流日志表执行后续的分流操作以降低单点故障的概率。本发明未述及之处适用于现有技术。
Claims (3)
1.一种基于CAD快速持久化的方法,该方法包括以下步骤:
(1)确定分布式系统集群中的总节点个数N,令F=(N-1)/2,设置纠删码的数量为k,同时设置选择参数x的值;用户发出写请求,生成对应的日志条目,并根据日志条目及负载均衡接口的性能参数得到分流日志表,该分流日志表包含节点名字段、日志条目的索引字段、片段信息字段、节点性能字段;
(2)判断集群中Leader节点最近收到的应答节点数是否大于等于F,如果大于等于F执行步骤(3);否则系统报错,该集群无法保证一致性;
(3)判断集群中Leader节点最近收到的应答节点数是否大于等于F+k;如果Leader节点最近收到的应答节点数大于等于F+k,则按照F-CAD一致性协议进行复制,直至F+1+x个节点持久化写入全量数据,提交该日志条目,执行下一轮复制;若Leader节点最近收到的应答节点数小于F+k,则按照CAD协议对系统进行一致性复制,直至全量数据写入至少F+1个节点,提交该日志条目,执行下一轮复制;
所述CAD为在读时强制数据持久化,写时按原一致性协议规则异步写入,所述最近收到的应答节点数为距离当前时间段最后一轮远程过程调用收到的应答节点数;
所述F-CAD一致性协议的执行过程是:
结合纠删码,快速单调可读:确定当前可用节点数至少为F+k个,日志条目在写入各个节点时会先通过纠删码将该日志条目均分为k个数据片段,则根据m=(当前可用节点数-k)获得校验片段数量m的值,再将所有片段发送给Leader节点;
然后Leader节点再将这k个数据片段和任意F个校验片段分别持久化写入到全部节点,数据片段通过查询分流日志表持久化写入节点性能字段最优的前k个节点,当全部数据片段和至少F个校验片段持久化写入到节点中,此时用户便通过分别读取已经持久化的数据节点来读取完整数据,以达到快速单调可读的状态;
执行第一次分流操作:在达到单调可读条件后,通过查询分流日志表中的节点性能字段按照对应等级将性能较差节点的数据片段持久化写入到性能较优的节点中,实现分流的效果;
执行第二次分流操作,部分节点做数据补全操作:选择参数为整数,且0≤x≤F,以供用户在节能和高性能之间进行选择,Leader节点首先查询用户设置的x值,根据x值选择后续的数据补全方案,Leader节点查询分流日志表中前F+1+x个节点的片段信息字段的信息,根据片段信息字段提供的已经持久化写入的数据片段编号,得出尚未写入的数据片段,然后将未写入的数据片段继续持久化写入性能较优的前F+1+x个节点成为完整的数据;
而对剩余的F-x节点不选择继续写入,始终会以第一次分流后的相应片段保留在相应节点之中;
所述第一次分流的过程是:系统需要访问分流日志表中各个节点的片段信息字段,直到逆序访问完分流日志表中性能较差的F个节点,各个节点按照性能最优节点对应性能最差节点、次优节点对应次差节点的方式进行配对分成不同的等级,将同一个等级中性能较差节点的数据片段全部持久化写入到对应等级性能较优节点中,如果某一等级性能较差节点的片段信息为校验片段,则对应等级的性能较优节点需要按初始分片顺序在自己已写入片段的基础上持久化写入一个尚未写入的首片段;未配对的单节点按初始分片顺序在自己已写入片段的基础上持久化写入一个尚未写入的首片段。
2.根据权利要求1所述的基于CAD快速持久化的方法,其特征在于,第二次分流操作的过程是:用户需事先给定整型选择参数x一个确切的值,且0≤x≤F,以供用户在节能和高性能之间进行选择,Leader节点首先查询用户设置的x值,根据x值选择后续的数据补全方案;Leader节点查询分流日志表中前F+1+x个节点的片段信息字段的信息,根据片段信息字段提供的已经持久化写入的数据片段编号,得出尚未写入的数据片段,然后将未写入的数据片段继续持久化写入到性能较优的前F+1+x个节点组成完整数据,进一步进行分流,以提高性能。
3.一种分布式系统,其特征在于,分布式系统使用权利要求1或2所述的基于CAD快速持久化的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110301348.4A CN112925763B (zh) | 2021-03-22 | 2021-03-22 | 一种基于cad快速持久化的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110301348.4A CN112925763B (zh) | 2021-03-22 | 2021-03-22 | 一种基于cad快速持久化的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112925763A CN112925763A (zh) | 2021-06-08 |
CN112925763B true CN112925763B (zh) | 2022-04-08 |
Family
ID=76175375
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110301348.4A Active CN112925763B (zh) | 2021-03-22 | 2021-03-22 | 一种基于cad快速持久化的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112925763B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113986944B (zh) * | 2021-12-29 | 2022-03-25 | 天地伟业技术有限公司 | 分片数据的写入方法、系统及电子设备 |
CN115145942B (zh) * | 2022-09-05 | 2023-01-17 | 北京奥星贝斯科技有限公司 | 一种分布式数据库系统及其单调读的实现方法、装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105930103A (zh) * | 2016-05-10 | 2016-09-07 | 南京大学 | 一种分布式存储ceph的纠删码覆盖写方法 |
CN107967124A (zh) * | 2017-12-14 | 2018-04-27 | 南京云创大数据科技股份有限公司 | 一种分布式持久性内存存储系统及方法 |
CN109726037A (zh) * | 2017-10-27 | 2019-05-07 | 伊姆西Ip控股有限责任公司 | 用于备份数据的方法、设备和计算机程序产品 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20170228285A1 (en) * | 2016-02-10 | 2017-08-10 | SwiftStack, Inc. | Data durability in stored objects |
-
2021
- 2021-03-22 CN CN202110301348.4A patent/CN112925763B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105930103A (zh) * | 2016-05-10 | 2016-09-07 | 南京大学 | 一种分布式存储ceph的纠删码覆盖写方法 |
CN109726037A (zh) * | 2017-10-27 | 2019-05-07 | 伊姆西Ip控股有限责任公司 | 用于备份数据的方法、设备和计算机程序产品 |
CN107967124A (zh) * | 2017-12-14 | 2018-04-27 | 南京云创大数据科技股份有限公司 | 一种分布式持久性内存存储系统及方法 |
Also Published As
Publication number | Publication date |
---|---|
CN112925763A (zh) | 2021-06-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20220276998A1 (en) | Database transaction processing method and apparatus, server, and storage medium | |
US9946735B2 (en) | Index structure navigation using page versions for read-only nodes | |
US10579610B2 (en) | Replicated database startup for common database storage | |
CN110502507B (zh) | 一种分布式数据库的管理系统、方法、设备和存储介质 | |
CN112925763B (zh) | 一种基于cad快速持久化的方法 | |
US10713275B2 (en) | System and method for augmenting consensus election in a distributed database | |
US7693882B2 (en) | Replicating data across the nodes in a cluster environment | |
EP2435916B1 (en) | Cache data processing using cache cluster with configurable modes | |
US9305056B1 (en) | Results cache invalidation | |
US10178168B2 (en) | Read-after-write consistency in data replication | |
US11086833B2 (en) | Data storage method and apparatus for distributed database | |
US10366106B2 (en) | Quorum-based replication of data records | |
JP4461147B2 (ja) | リモートデータミラーリングを用いたクラスタデータベース | |
US11029891B2 (en) | Hybrid distributed storage system to dynamically modify storage overhead and improve access performance | |
WO2020093501A1 (zh) | 文件存储方法、删除方法、服务器及存储介质 | |
CN110633378A (zh) | 一种支持超大规模关系网络的图数据库构建方法 | |
JPH0822409A (ja) | ネットワークにおける配布情報管理システム | |
EP4307137A1 (en) | Transaction processing method, distributed database system, cluster, and medium | |
CN111526208A (zh) | 一种基于微服务的高并发云平台文件传输优化方法 | |
JP2024501245A (ja) | ログ実行方法並びにその、装置、コンピュータ機器及びコンピュータプログラム | |
US11669518B1 (en) | Method and system for processing database transactions in a distributed online transaction processing (OLTP) database | |
JP6079876B2 (ja) | 分散処理システム | |
US11522966B2 (en) | Methods, devices and systems for non-disruptive upgrades to a replicated state machine in a distributed computing environment | |
CN115495495A (zh) | 事务处理方法、分布式数据库系统、集群及介质 | |
WO2023274409A1 (zh) | 在区块链系统中执行交易的方法和区块链节点 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |