一种基于RAID5的实现内存数据可靠性方法及系统与流程

文档序号:17656298发布日期:2019-05-15 22:02阅读:281来源:国知局

本发明涉及计算机领域,具体涉及一种基于RAID5实现分布式存储系统的内存数据可靠性方法及系统。



背景技术:

随着互联网的深入普及以及移动互联网的蓬勃发展,越来越多的web应用涌现,它们对于访问延迟和吞吐量等性能参数有很高的要求,如社交网络、信息检索和电子商务等。而且随着智能手机的普及,web应用的用户的数量也是与日俱增,动辄百万千万级甚至上亿级的用户访问,对系统的架构和性能提出了严峻的考验。

传统的关系型数据库在面对海量数据存在三个问题:第一、高性能,对数据库高并发读写的需求。庞大的用户数量会导致数量巨大的并发访问,这是磁盘难以承受的。第二、海量存储,对海量数据的高效率存储和访问的需求。数据量的快速增长,关系型数据库通过查表的方式来查找数据会导致效率低下。第三、可扩展性,对数据库的高可扩展性的需求。对于web应用,数据库是最难以扩展的。当一个应用的用户数量和访问量日益增加,数据库没办法简单的添加硬件资源或节点来扩展性能和负载能力。而且对于7*24小时服务器的系统,传统的数据库维护和升级一般需要停机维护和数据迁移。

NoSQL技术的提出,可以在很大程度上解决上述的问题,与此同时,面对大数据,显然单机已经不能满足容量或者性能上需求了。分布式的存储成为一个必须选择的方案。分布式系统相对于单机的明显优点就是存储容量不再受到限制,当容量不够的时候,可以简单地增加节点来扩展。而且多个节点可以提供更多的计算资源,可以采取多线程并行读写,性能上也会有明显提升。计算机系统最快的存储系统是传统上主要作为内存的RAM。将数据直接放到内存中或者将一部分内存资源作为缓存使用,可以使系统的性能得到大幅提升,相对于磁盘,直接从内存中获取数据会快得多,因此,采用In-memory的方案可以进一步的将NoSQL的优点充分发挥出来。当前In-memory的NoSQL存储系统在提供数据可靠性方面都是采用备份或者持久化到磁盘的方式,有的干脆不提供数据可靠性。备份系统对于存储成本是一个翻倍的过程,而持久化到磁盘在性能上又会受到明显影响。



技术实现要素:

针对现有技术缺陷或者不足,本发明提供一种基于RAID5实现分布式存储系统的内存数据可靠性方法及系统,本发明具有数据可靠性高,并且节约存储成本的特点。

本发明提供的一种实现内存数据可靠性的方法,其特征在于,该方法包括数据存储过程和数据读取过程,其中,数据存储过程包括:

(1)当客户端存储一个数据Item时,通过客户端的hash算法选择一个服务器进行存储;

(2)客户端将所述数据Item添加到一个记录链表中,该记录链表用于记录客户端向服务器发送的所有存储的Item;

(3)当客户端检测到有数据Item加入记录链表,遍历所述记录链表,判断记录链表中是否有几个Item构成了一个条带,如果有,进入步骤(4),如果没有,结束数据存储过程;

(4)将构成一个条带的数据Item进行异或,得到校验信息存储到特定的服务器中,所述校验信息是按一定的规律分散的存储在各个存储服务器中的;

(5)对同一个条带的数据Item,记录条带信息即元数据信息,并按照一定的组织格式以一定的规律分散的存储到各个存储服务器中;

(6)当元数据信息存储完成后,客户端将记录链表中的同一条带的数据Item删除;

所述数据读取过程为:

当服务器正常运行时,客户端通过key找到对应的value,客户端向服务器请求数据,然后服务器返回客户端请求的数据;当其中一台服务器出现故障时,客户端获取存储在此服务器上的Item,先获取元数据信息,通过元数据信息得到同一条带的数据和对应的校验信息,通过RAID5的异或操作将此Item的数据恢复出来,返回给客户端。

本发明提供的一种实现内存数据可靠性的系统,其特征在于,该系统包括设置在各客户端的数据存储模块和数据读取模块,以及至少三台存储服务器,各存储服务器均提供一定容量的内存组成RAID5,共同组成RAID5集群;

数据存储模块包括下述子模块:

第一子模块:用于在客户端存储一个数据Item时,通过客户端的hash算法选择一个服务器进行存储;

第二子模块:用于客户端将所述数据Item添加到一个记录链表中,该记录链表用于记录客户端向服务器发送的所有存储的Item;

第三子模块:用于当客户端检测到有数据Item加入记录链表,遍历所述记录链表,判断记录链表中是否有几个Item构成了一个条带,如果有,进入第四子模块,如果没有,进入第六子模块;

第四子模块:用于将构成一个条带的数据Item进行异或,得到校验信息存储到特定的服务器中,所述校验信息是按一定的规律分散的存储在各个存储服务器中的;

第五子模块:用于对同一个条带的数据Item,记录条带信息即元数据信息,并按照一定的组织格式以一定的规律分散的存储到各个存储服务器中;

第六子模块:用于当元数据信息存储完成后,客户端将记录链表中的同一条带的数据Item删除;

所述数据读取模块在当服务器正常运行时,客户端通过key找到对应的value,客户端向服务器请求数据,然后服务器返回客户端请求的数据;当其中一台服务器出现故障时,客户端获取存储在此服务器上的Item,先获取元数据信息,通过元数据信息得到同一条带的数据和对应的校验信息,通过RAID5的异或操作将此Item的数据恢复出来,返回给客户端。

本发明至少需要三台服务器来组成RAID5集群来存储数据。每一台服务器提供一定容量的内存组成RAID5。存储数据时,通过构建RAID5来保证数据的可靠性,当发生单点故障(其中一台机器宕机了)时,仍然可以在不访问磁盘上数据库的情况下,在内存级别恢复出数据来。通过构建RAID5可以明显的降低数据的冗余度,从而降低数据存储成本,而且在出现单点故障的情况下也可以保持较高的性能。总体而言,按照本发明点的以上技术方案与现有技术相比,主要具备以下的技术优点:

1、本系统至少需要三台数据存储服务器组成系统,每个系统需要划分出来一定的内存资源用于,存储经常访问的数据。当系统出现单点故障后,可以不去访问磁盘,通过RAID5的数据恢复原理,在内存级别还原出数据,保证了系统的高性能,可靠性。

2、本系统采用RAID5编码的方式,相较于备份方式,会节省更多的存储成本,而且存储机器数量越多,节约的存储成本越多。

附图说明

图1是本系统的基本架构图;

图2是RAID5的数据组织形式;

图3是正常获取数据过程示意图;

图4是正常获取数据过程流程图;

图5是本系统的数据存储示意图;

图6是数据存储流程图;

图7是单点故障时数据获取示意图;

图8是单点故障时数据获取流程图。

具体实施方式

下面结合附图对本发明的具体实施方式作进一步说明。在此需要说明的是,对于这些实施方式的说明用于帮助理解本发明,但并不构成对本发明的限定。此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。

根据实际应用需求在每台服务器上划分出一定容量的内存资源,用来存储数据;其中数据存储的形式是key/value形式。以下称数据为Item。

本发明提供的一种实现内存数据可靠性的方法,包括数据存储和数据读取二个过程,其中数据存储过程包括下述步骤:

(1)客户端在存储一个数据Item时,会通过客户端的hash算法(例如一致性hash算法)选择一个服务器进行存储。具体实现步骤如下

(1-1)对要存储数据的key计算hash得到一个hash值

(1-2)用这个hash值选择一个服务器,将数据发送给这个服务器,进行存储。

(2)客户端将Item添加到一个记录链表中。此记录链表用于记录客户端向服务器发送的所有存储的Item。

(3)客户端检测到了一个Item加入记录链表,会遍历记录链表。判断记录链表中是否有几个Item构成了一个条带,如果没有,则结束存储过程;如果有,进入步骤(4);

(4)将构成一个条带的Item进行异或,得到校验信息存储到特定的服务器中。校验信息是按一定的规律分散的存储在各个存储服务器中的。

具体实现步骤可以包括:

(4-1):将同一条带的信息进行异或操作,得到校验信息。

(4-2):从有最大ID的服务器开始,按照循环加1取模的方式,按照服务器ID,从大到小的顺序存储校验信息,到最小后,再转到最大,以此循环。

(5)对同一个条带的Item,需要将条带信息(下面称为元数据信息)记录下来,按照一定的组织格式以一定的规律分散的存储到各个存储服务器中。

存储元数据信息的步骤可以包括:

(5-1):对于同一条带的Item,需要记录每个Item的key的信息,在数据恢复的时候通过查找的key找到处于同一条带的其他key。

(5-2)对于每一个key,将元数据信息存储到存储此Item的服务器的下一台服务器中,如果是最大的服务器,则选择第1台服务器,避免放在同一台原因是当此服务器坏了,可以通过下一台机器找到条带信息。

(6)元数据信息存储完成,客户端将记录链表中的同一条带的Item删除。

所述数据读取过程为:

当服务器正常运行时,客户端通过key在找到对应的value。如图3中的步骤1和步骤2,客户端向服务器请求数据,然后服务器返回客户端请求的数据;当其中一台服务器出现故障时,客户端获取存储在此服务器上的Item,可先获取元数据信息,通过元数据信息可以得到同一条带的数据和对应的校验信息,通过RAID5的异或操作将此Item的数据恢复出来,返回给客户端。

其中,所述数据恢复的过程如图7所示,具体包括:

(b1)客户端通过hash算法,找到key对应的存储Item的服务器,然后对服务器的ID加1,对服务器数量取模,得到元数据信息。

得到元数据信息具体包括以下步骤:

b11、客户端通过计算或者Item的key的hash值,得到Item所在的服务器的ID,如图7中的步骤1。

b12、对得到的ID加1,获取同一条带的另一个Item的key的信息,并向此服务器发送请求得到对应的数据。图7中的步骤2为请求过程,步骤3为服务器对客户端的响应过程;

b13、根据b12中得到的元数据信息,再次向服务器请求同一条带的数据信息,如图7中的步骤4和5。

(b2)客户端将同一条带的信息进行异或操作,得到校验信息的key,并向存储校验信息的服务器发送请求获取校验信息,如图7的步骤6,相应的服务器返回校验信息。

(b3)通过校验信息得到条带数据和校验数据。对数据进行异或计算恢复出所需数据,返回给客户端。

实例:

本发明的技术方案是按照以下方式实现的,系统物理环境和架构如下:

采用4台服务器,在上面运行Memcached,将每台机器划分出1G内存来存储热数据。将其组织成RAID5。

如图2所示:RAID5中处于同一位置的数据称为一个条带,即图中的Data1,Data2,Data3。PData1是校验信息,其中

上述的Data在实际系统中是一个Item,即一个key/value对。在本系统中,除了存储Data的基本数据,还要存储一个条带的信息。当其中的一台服务器坏掉了,例如第一台机器坏掉了,即Data1丢失了,系统可通过记录的条带信息,得到Data2,Data3和PData1.则有

可恢复出Data1。具体的存储组织形式如图5。

根据图5所示,本系统中的Data就是一个Item,其中ItemA,ItemB,ItemC是一个条带。其中ItemA的具体信息为KeyA:ValueA,ItemB的具体信息为keyB:valueB,ItemC的具体信息为keyC:valueC,同时还要记录条带信息,目的是通过任意一个key可以找到与其处在同一条带的其他Item。如图5中的第三行,需要存储keyA:keyB,这样可以通过keyA找到keyB。同理存储keyB:keyC和keyC:keyA。存储是按照一定的规律来的。考虑到其中一台服务器坏掉了,可以得到原来的服务器ID,然后加1,即可得到同一条带的其他key的信息,进而获取相应的数据,通过异或将数据恢复出来。

图4是当服务器正常时,获取数据的流程图。客户端持有请求数据的key,需要获取对应的value。1)需要通过某种hash算法(例如一致性hash算法)获取存储其数据的服务器ID。2)向此服务器发起请求,若服务器上有此数据,则返回,若没有则返回空值。

图6是存储数据的流程图,客户端持有一个Item,即一个key/value对,将value存储到其中某一台服务器中去。1)通过某种hash算法(例如一致性hash算法)选择一台服务器。2)将数据存储到这台服务器中去。3)将此Item加入到记录链表中,扫描链表,是否凑齐了一个条带。4)若不够一个条带,则返回。5)若凑齐了一个条带,如,ItemA,ItemB,ItemC,都在记录链表中了。则通过异或计算出ItemP。将ItemP存储到某一台服务器中。6)存储同一条带的元数据信息,每一个元数据信息,存储到此Item的下一台服务器上面。

图8为发生了单点故障后的数据获取流程图。假设服务器1坏了。客户端持有ItemA的KeyA,需要得到ValueA。1)通过某种hash算法(例如一致性hash算法)获取存储ItemA的服务器ID,然后向ID服务器请求数据,发现ID服务器已经坏掉了。2)将ID加1,通过KeyA找到KeyB,通过KeyB找到KeyC,即可得到ValueB和VlaueC。3)再通过得到KeyP,通过KeyP可以得到ValueP。4)通过可以恢复出ValueA。

5)返回ValueA。

本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1