背景技术
随着计算机技术以及网络技术的高速发展,需要存储和处理的数据量呈几何倍数的增长,传统的存储***采用集中的存储服务器存放所有数据,存储服务器成为***性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。于是分布式存储方案应运而生。分布式存储方案利用多副本、条带化等技术,以适应用户对数据安全性,读写高效性的需求。如图1所示,分布式存储***采用可扩展的***结构,利用多台存储服务器分担存储负荷,由主控服务器通过通信网络与多台存储服务器相连,管理多台存储服务器上的存储设备(物理存储资源),它不但提高了***的可靠性、可用性和存取效率,还易于扩展。分区(partition)为用于存储数据的虚拟容器,每个分区对应于某个存储节点上的一段存储空间,每个存储节点通常可对应多个分区。为了存储的安全性,通常将同一个分区的多个副本分别对应到不同的存储节点上,也即数据的多个副本将存储到不同的存储节点上。如图2所示,示出了数据、分区以及存储节点的对应关系。
任何一个分布式存储***都需要解决的一个关键问题就是:在各存储节点上数据的各副本如何分布。解决这个问题的算法称为分区分配算法(partition allocation algorithm),也称作副本放置算法(replica placement algorithm)或数据分配算法(data allocation algorithm)等。该算法决定了整个存储***在以下几个指标上能否达到最优:
(1)安全性:安全级别可以为rack、server、disk等,根据安全级别不同,数据的各副本必须存放在不同安全级别的存储节点上,例如:安全级别为server时,同一分区的不同副本必须存放在不同的server上);
(2)各个节点负载均衡性:指分配在各个存储节点上的数据总量以及数据的各种类型的副本(主副本、备副本1、备副本2,简称为主、备1、备2)分别的总量是否相同或接近;
(3)分散性:节点故障后故障节点的负载能否均匀的分散到其他节点上;以及
(4)在节点故障和故障恢复过程中,是否存在无效的数据迁移。无效的数据迁移即指在节点故障时:出现非该故障节点上的数据往其他节点上的数据迁移;或者在故障节点恢复或增加节点时,出现其他节点往非故障恢复节点或非新增节点上的数据迁移。
上述指标中,安全性决定了数据存放是否安全,后面三个指标则影响存储节点的使用寿命以及数据I/O的性能。这几个指标相互关联,相互约束,如何能兼顾上述各指标成为分区分配算法的一个难点。
目前较常用的分区分配算法为按规则分配的分区分配算法:
存储***中每个存储节点(rack、server、OSD(ObjectStorage Device,对象存储设备)等)上都记录着分区分配相关的信息。例如,分配到该存储节点上的所有分区、分区的总数、分区各种副本的个数,该存储节点上分区主对应的备副本、以及备副本对应的备副本分散到其他存储节点的个数,以及各存储节点的存储容量对应的权值等。分区分配时,依据存储节点上所保存的这些信息按照安全性、均衡性、分散性、以及无无效迁移等规则对存储节点进行比较,择优选出最适合该分区各副本存放的各存储节点。在出现节点故障时,把故障节点上的分区副本全部取出,按照上述分配方法进行再分配。故障恢复以及扩容时,根据存储节点上保存的信息,仍按照安全性、均衡性、分散性、以及无效迁移等规则对原有的存储节点上的分区副本进行全局比较,选择最不合适的分区副本,并根据上述分配规则将该分区副本重新分配到故障恢复或者扩容的存储节点上。
按规则分配的分区分配算法在对所有分区在所有存储节点进行统一分配时,能够做到分配结果在满足安全性的前提下具备几乎完美的均衡性和分散性。但是为了保证每次剔除故障节点以及对故障节点进行恢复时的分区分配结果都最优,再加上为了满足无无效迁移的条件,这样的限制使得在所有的故障存储节点都已经恢复时,分配出来的结果比把所有分区在所有存储节点上进行统一分配的结果差,在这种情况下,再出现节点故障的场景,分区分配的结果会在现有基础上不断恶化,变得越来越差。
发明内容
有鉴于此,本发明提供了一种分区分配方法、装置及分布式存储***,能够在存储***中出现故障节点时,保障分区分配的结果达到尽量最优。
为了实现上述目的,在第一方面,本发明的实施例提供了一种分区分配方法,包括:
预先建立稳定的存储节点拓扑结构下的分区分配结果的快照,所述稳定的存储节点拓扑结构为没有故障节点的拓扑结构,所述快照中记录有各分区副本和为各分区副本所分配的存储节点;
存储节点故障时,将故障节点上的分区副本分配到其余的存储节点;以及
若所述故障节点恢复正常,则则根据所述快照的记录,将从所述恢复正常的故障节点被分配到其余的存储节点的分区副本,重新分配回所述恢复正常的故障节点。
结合第一方面,在第一种可能的实现方式中,若存在多个故障节点,且所述多个故障节点中至少一个恢复正常,对于每个恢复正常的故障节点,在所述根据所述快照的记录,将从所述恢复正常的故障节点被分配到其余的存储节点的分区副本,重新分配回所述恢复正常的故障节点的步骤后:
根据所述快照的记录,将从未恢复正常的故障节点上被分配至其余的存储节点的分区副本中的部分,分配到所述恢复正常的故障节点。
结合第一方面或第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述根据所述快照的记录,将从所述恢复正常的故障节点被分配到其余的存储节点的分区副本,重新分配回所述恢复正常的故障节点的步骤包括:
若存在与待重新分配回所述恢复正常的故障节点的分区副本有安全冲突的冲突副本,则将所述待重新分配回所述恢复正常的故障节点的分区副本与所述冲突副本进行调换,再将调换后的冲突副本分配回所述恢复正常的故障节点;
其中,所述有安全冲突的冲突副本为存储在所述恢复正常的故障节点所在安全级别的其它存储节点上,与所述待重新分配回所述恢复正常的故障节点的分区副本属于同一分区的分区副本;
所述调换包括:副本类型的调换以及在所述快照中副本与存储节点的对应关系的调换。
结合第一方面或第一方面的第一至或二种可能的实现方式,在第三种可能的实现方式中,在所述将故障节点上的分区副本分配到其余的存储节点的步骤中,具体地:在满足安全性的前提下,按照保障分配结果均衡性和分散性最优的原则分配所述故障节点上的分区副本。
在第二方面,本发明实施例提供了一种分区分配装置,包括:
快照建立单元,用于预先建立稳定的存储节点拓扑结构下的分区分配结果的快照,所述稳定的存储节点拓扑结构为没有故障节点的拓扑结构,所述快照中记录各分区副本和为各分区副本所分配的存储节点;
分配单元,用于在存储节点故障时,将故障节点上的分区副本分配到其余的存储节点;以及
重分配单元,用于在所述故障节点恢复正常时,根据所述快照的记录,将从所述恢复正常的故障节点被分配到其余的存储节点的分区副本,重新分配回所述恢复正常的故障节点。
结合第二方面,在第一种可能的实现方式中,所述重分配单元包括:
负载均衡模块,用于根据所述快照的记录,将从未恢复正常的故障节点上被分配至其余的存储节点的分区副本中的部分,分配到所述恢复正常的故障节点。
结合第二方面或第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述重分配单元包括:
调换模块,用于将待重新分配回所述恢复正常的故障节点的分区副本与冲突副本进行调换,再将调换后的冲突副本分配回所述恢复正常的故障节点;
其中,所述有安全冲突的冲突副本为存储在所述恢复正常的故障节点所在安全级别的其它存储节点上,与所述待重新分配回所述恢复正常的故障节点的分区副本属于同一分区的分区副本;
所述调换包括:副本类型的调换以及在所述快照中分区副本与存储节点的对应关系的调换。
结合第二方面或第二方面的第一或第二种可能的实现方式,在第三种可能的实现方式中,所述分配单元在满足安全性的前提下,按照保障分配结果均衡性和分散性最优的要求分配所述故障节点上的分区副本。
第三方面,本发明实施例提供了一种分布式存储***,包括客户端服务器、主控服务器以及存储服务器,所述主控服务器包括第二方面或第二方面的任一种实现方式中所述的分区分配装置。
本发明实施例提供的方法、装置及分布式存储***,以稳定态的分区分配的结果作为基础,并按照该分区分配结果的快照进行分区副本的重分配,在存储***中出现故障节点时,可以保障分区分配的结果尽量达到最优,以确保存储***基本上保持在最优的分区分配方案下运行。
根据下面参考附图对示例性实施例的详细说明,本发明的其它特征及方面将变得清楚。
具体实施方式
以下将参考附图详细说明本发明的各种示例性实施例、特征和方面。附图中相同的附图标记表示功能相同或相似的元件。尽管在附图中示出了实施例的各种方面,但是除非特别指出,不必按比例绘制附图。
在这里专用的词“示例性”意为“用作例子、实施例或说明性”。这里作为“示例性”所说明的任何实施例不必解释为优于或好于其它实施例。
另外,为了更好的说明本发明,在下文的具体实施方式中给出了众多的具体细节。本领域技术人员应当理解,没有这些具体细节,本发明同样可以实施。在另外一些实例中,对于大家熟知的方法、手段、元件和电路未作详细描述,以便于凸显本发明的主旨。
如图3所示,本发明实施例的分区分配方法包括:
S1.预先建立稳定的存储节点拓扑结构下的分区分配结果的快照。
其中,所述快照记录有各分区副本和为各分区副本所分配的存储节点。该稳定的存储节点拓扑结构即用户期望能够在该种拓扑结构下长期运行的存储节点拓扑结构,换言之为没有故障节点的拓扑结构。这种稳定的存储节点拓扑结构可为存储***初始配置的拓扑结构,或者用户扩容后的拓扑结构,或者用户减容后的拓扑结构,或者其他用户希望***长期保持的一种拓扑结构。这样的拓扑结构下的分区分配结果可以作为快照。
在该稳定的存储节点拓扑结构下,可对所有待分配的分区副本以及存储节点的拓扑结构进行整体分析,将所有待分配的分区副本按照一定的分区分配算法(例如按规则分配的分区分配算法)分配到存储节点上。由于对所有待分配的分区副本和所有存储节点做了整体分析,所以可以使整个分区分配结果在安全性、均衡性、和分散性上都能够达到最优或者力所能及的次优结果,该结果的快照可以作为再分配的基础。
该快照记录了包括分区分配的场景以及分区分配的结果的相关信息,分区分配的场景包括影响到分区分配结果的场景信息,例如存储节点的队列信息以及存储节点的拓扑结构信息等,初始的分区分配的方法不同,该分区分配的场景所记录的信息不同;分区分配的结果为所有分区的各副本和存储节点的对应关系。如图4所示,为按照“按规则分配的分区分配算法”进行分区分配的结果,其中显示了所建立的该分区分配的结果的快照记录的信息。
S2.存储节点出现永久性故障时,将该出现永久性故障的存储节点(以下称故障节点)上的分区副本分配到其余存储节点上,且应在满足安全性的前提下,按照保障分配结果均衡性和分散性尽量最优的原则将该故障节点上的分区副本分配到其余存储节点上。
需要说明的是,本发明实施例的方法对出现短暂故障的故障节点不做处理,而是等待其恢复,如果等待一定时间后仍无法恢复,则确认其出现永久故障,对出现永久故障的故障节点的存储设备进行更换处理并在确认该故障节点已恢复正常后,再进行分区副本的重新分配,因此,本发明实施例方法中所说的“故障节点”为出现永久故障的存储节点。
S3.若所述故障节点恢复正常,则则根据所述快照的记录,将从所述恢复正常的故障节点被分配到其余的存储节点的分区副本,重新分配回所述恢复正常的故障节点。
本发明实施例的方法以稳定的存储节点拓扑结构下的分区分配结果作为基础,并按照该分区分配结果的快照进行分区副本的重分配,在存储***中出现故障节点时,可以保障分区分配的结果达到尽量最优,以确保存储***基本上保持在尽量最优的分区分配方案运行。
具言之,当出现一个存储节点永久故障后,将分配到该节点上的分区副本按照一定规则分配到其余的正常的存储节点,且在步骤S3中,在对该故障节点的故障存储设备进行更换使该故障节点恢复正常后,优先按照快照进行分区副本的重新分配:将快照中所记录的分配在该节点上的分区副本重新分配回该节点。
若存在多个故障节点,则每次将分区副本重新分配回恢复正常的故障节点后,还需要进行再均衡分配:将快照记录中所记载的属于未恢复正常的故障节点的分区副本(已在步骤S2中分配至其余的存储节点)中、从未恢复正常的故障节点被分配到其余存储节点的分区副本中的部分,分配到所述恢复正常的故障节点,以使各存储节点的负载均衡。
仍以图4中所示的快照为例,在图4所示的快照建立完成后,假设***中OSD 1、OSD2以及OSD4三个存储节点出现永久性故障。根据本发明实施例的方法,这三个节点上的分区副本经过步骤S2均匀地分配到了其余的正常的存储节点上,其余的正常的存储节点上的分区分配情况如图5所示:不仅包括快照中所记录的本存储节点上所分配的分区副本,还包括从三个故障节点上转移过来的分区副本。假设OSD4恢复正常,则经过步骤S3,OSD 4上将仅包含快照中所记录的分区副本,而其余的正常的存储节点上的分区分配情况将如图6所示:包括快照中所记录的本存储节点上所分配的分区副本,还包括从故障节点OSD 1和OSD 2上转移过来的分区副本。此时,OSD 4上分配的分区副本少于其他正常的存储节点上分配的分区副本,所以需要进行再均衡分配:从其他正常的存储节点上把在快照中记录的属于OSD 1和OSD 2上的分区副本(此时分配在其余的正常的存储节点上)分配一部分到OSD 4上,使得存储***中所有正常的存储节点上的分区副本可以达到负载均衡。如果OSD 2再恢复,情况和OSD 4类似。最后,OSD 1恢复,由于是恢复的最后一个故障节点,所以不用进行再均衡分区分配,OSD 1恢复并经过步骤S3的处理后,整个存储***的分区分配状态就可以恢复到和快照所记录的一致的状态。
本发明实施例的方法在出现故障节点时,只存在从故障节点向其他存储节点的分区副本的迁移;在故障节点恢复时,只存在其他存储节点向已恢复的故障节点的分区副本的迁移,所以在整个存储节点故障和故障节点恢复的过程中不存在无效迁移,使整个分布式存储***在生命周期内,其数据分布的安全性、均衡性、以及分散性可以得到保障,并且整个过程中无无效数据迁移。
此外,为了避免分区回迁过程中的安全冲突问题,本发明实施例的方法在步骤S3中还包括进行冲突分区副本的调换的步骤。具言之:若存在与待重新分配回所述恢复正常的故障节点的分区副本有安全冲突的冲突副本(为存储在所述恢复正常的故障节点所在安全级别的其它存储节点上,与所述待重新分配回所述恢复正常的故障节点的分区副本属于同一分区的分区副本),则将所述待重新分配回所述恢复正常的故障节点的分区副本与所述冲突副本进行调换,包括:副本类型的调换和在所述快照中记录的分区副本与存储节点的对应关系的调换;再将调换后的原冲突副本分配回所述恢复正常的故障节点,而原来待重新分配的分区副本则不作移动。
以图7所示的拓扑结构为例:每个分区包括两个副本(主副本以及备副本),存储***的安全级别为server级(即不能把同一分区的不同副本分配到同一server上),初始的分区分配完成后,根据分区分配结果建立快照。假设快照中分区1的主副本分配到OSD 0,备副本分配到OSD 4,OSD 0属于server 0,OSD 4属于server 1,则根据本发明实施例的方法:
若OSD 0故障,将分区1的主副本暂时分配到OSD 8上,OSD8属于server 3;假设OSD 4又出现故障,分区1的备副本被暂时分配到OSD 2。
OSD 0恢复后,按照快照把分区1的主副本从OSD 8回迁分配到OSD 0,但此时,分区1的备副本在OSD 2上,如果分区1的主副本重新分配回OSD 0,则将出现分区1的两个副本同时被分配到server 0下,不符合安全性;如果先把分区1的备副本迁移到其他server下的OSD,再把分区1的主副本回迁到OSD 0可以解决这个问题,但是这样将出现了无效迁移。
因此,本发明实施例的方法在步骤S3中,先将分区1的主副本和备副本进行主备倒换,包括副本类型的调换以及快照中记录的副本与存储节点之间对应关系的调换,这时分区1的主副本在OSD 2上,分区1的备副本在OSD 8上,再按照快照把分区1的主副本从OSD 2回迁到OSD 0,从而避免了无效迁移,且分区的分配结果恢复到与快照一致。
综上,本发明实施例的方法可使分布式存储***更加稳定、高效,且通过数据的均衡分布和避免无效数据迁移,延长了存储节点的使用寿命。
如图8所示,为本发明实施例的分区分配装置800的结构框图,该装置800依照图3至图7所示实施例的方法进行分区分配,该装置包括:
快照建立单元810,用于预先建立稳定的存储节点拓扑结构下的分区分配结果的快照,所述稳定的存储节点拓扑结构为没有故障节点的拓扑结构,所述快照中记录有各分区副本和为各分区副本分配的存储节点;
分配单元820,用于在存储节点故障时,在满足安全性的前提下,按照保障分配结果均衡性和分散性最优的要求,将故障节点上的分区副本分配到其余的存储节点;以及
重分配单元830,用于在所述故障节点恢复正常时,则根据所述快照的记录,将从所述恢复正常的故障节点被分配到其余的存储节点的分区副本,重新分配回所述恢复正常的故障节点。
本发明实施例的装置以稳定的存储节点拓扑结构下的分区分配结果作为基础,并按照该分区分配结果的快照进行分区重分配,可以保障在存储***中出现故障节点时,使分区分配的结果达到尽量最优,确保存储***基本上保持在尽量最优的分区分配方案下运行。
此外,在本发明实施例的装置中,重分配单元830可包括:负载均衡模块831,用于根据所述快照的记录,将从未恢复正常的故障节点上被分配至其余的存储节点的分区副本中的部分,分配到所述恢复正常的故障节点,以使各存储节点的负载均衡。
重分配单元830还可包括:调换模块832,用于将待重新分配回所述恢复正常的故障节点的分区副本与冲突副本进行调换,再将调换后的冲突副本分配回所述恢复正常的故障节点;其中,所述冲突副本为在所述恢复正常的故障节点所在安全级别的其它存储节点上,与所述待重新分配回所述恢复正常的故障节点的分区副本属于同一分区的分区副本;所述调换包括:副本类型的调换以及在所述快照中分区副本与存储节点的对应关系的调换。
本发明实施例的装置在出现故障节点时,只存在从故障节点向其他存储节点的分区副本的迁移;在故障节点恢复时,只存在其他存储节点向已恢复的故障节点的分区副本的迁移,所以在整个存储节点故障和故障节点恢复的过程中不存在无效迁移,使整个分布式存储***在生命周期内,其数据分布的安全性、均衡性、以及分散性可以得到保障,并且整个过程中无无效数据迁移。本发明实施例的装置可使分布式存储***更加稳定、高效,且通过数据的均衡分布和避免无效数据迁移,延长了存储节点的使用寿命。
本发明实施例还提供了一种如图1所示的分布式存储***,该分布式存储***包括客户端服务器、主控服务器、以及存储服务器。本发明具体实施例并不对该主控服务器的具体实现做限定。如图9所示,该主控服务器900可以包括:
处理器(processor)910、通信接口(CommunicationsInterface)920、存储器(memory)930、以及通信总线940。其中:
处理器910、通信接口720、以及存储器930通过通信总线740完成相互间的通信。
通信接口920,用于与比如客户端等的网元通信。
处理器910,用于执行程序932,具体可以执行上述图3至图7所示的方法实施例中的相关步骤。
具体地,程序932可以包括程序代码,所述程序代码包括计算机操作指令。
处理器910可能是一个中央处理器CPU,或者是特定集成电路ASIC(Application Specific Integrated Circuit),或者是被配置成实施本发明实施例的一个或多个集成电路。
存储器930,用于存放程序932。存储器930可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatilememory),例如至少一个磁盘存储器。程序932具体可以包括:
快照建立单元,用于预先建立稳定的存储节点拓扑结构下的分区分配结果的快照;
分配单元,用于在存储节点故障时,在满足安全性的前提下,按照保障分配结果均衡性和分散性最优的要求,将故障节点上的分区副本分配到其余的存储节点;以及
重分配单元,用于在所述故障节点恢复正常时,根据所述快照的记录,将从所述恢复正常的故障节点被分配到其余的存储节点的分区副本,重新分配回所述恢复正常的故障节点。
程序932中各单元的具体实现可以参见图8所示装置实施例中的相应单元,在此不赘述。所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的设备和模块的具体工作过程,可以参考前述方法实施例中的对应过程描述,在此不再赘述。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及方法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,RandomAccess Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上实施方式仅用于说明本发明,而并非对本发明的限制,有关技术领域的普通技术人员,在不脱离本发明的精神和范围的情况下,还可以做出各种变化和变型,因此所有等同的技术方案也属于本发明的范畴,本发明的专利保护范围应由权利要求限定。