本发明属于数据存储技术领域,特别涉及一种分布式存储系统及其同步缓存方法。
背景技术:
如图1所示为现有的分布式存储集群中,服务端包括:元数据节点、监控节点、存储节点。但是规模最大的是存储节点,保存用户的数据,并直接给客户端提供读写请求的支持。监控节点(有些系统也叫管理节点)主要是记录所有服务端和客户端的状态,这个节点会每过几秒与其它节点通信,确定各服务端和客户端是否正常。
为了提高系统的读写性能,客户端和服务器存储节点都可能提供数据缓存,以加快读写的速度。但是在分布式系统中客户端实现读写缓存将带来比较复杂的问题。比如客户端在写数据时,如果缓存到本地,此时客户端出现宕机或者服务出错,将会产生数据丢失。客户端在读数据时,如果直接从本地缓存读取数据,但是之前可能其它客户端更新了相关数据,而本地读缓存并不能够获得,这时将得到的是旧数据。
所以在分布式系统中,客户端程序一般不提供数据缓存,采用同步的处理方法,而仅仅在服务端存储节点提供数据缓存的方案。但是如果能够在客户端提供一个可靠的数据缓存,能够很大程度的提高存储性能。由于客户端的写缓存存在数据丢失的可能,本发明是针对加速客户端读性能来设计的。
技术实现要素:
发明目的:针对现有技术中存在的问题,本发明提供一种通过在服务端存储节点上记录每个客户端缓存的状态信息,在服务端进行数据更新时,通知相关客户端废弃本地缓存信息,最终实现加速客户端的读性能,并通过缓存的多点同步方式,避免客户端读数据时得到旧的缓存数据,最终实现了一种可靠的分布式存储系统及其同步缓存方法。
技术方案:为解决上述技术问题,本发明提供的一种分布式存储系统,其中包括与网络交换机连接的若干个客户端、元数据节点、监控节点和若干个存储节点,所述每个客户端内均设置有缓存同步模块,所述每个存储节点上均设置有缓存记录模块;
存储节点:用于保存用户的数据,并直接给客户端提供读写请求的支持;
监控节点:用于记录所有服务端和客户端的状态。
一种如上所述的分布式存储系统的同步缓存方法,具体步骤如下:在每个客户端上设置缓存同步模块,在分布式存储服务端的若干个存储节点上,每个存储节点设置缓存同步模块,在数据进行读写操作时进行截取,并在中间插入缓存处理,最终在客户端对数据进行读取。
进一步的,所述对数据进行写操作时缓存处理的具体方法为:
步骤一:首先文件写模块接收到写请求,然后把文件分割为更小的对象,并给对象进行唯一性编号:ID;
步骤二:缓存同步模块启动并建立一定大小的缓存区;然后保存每次写请求的对象数据内容和该对象的编号;最后对缓存区的占容量是否已满进行判断,当缓存区所占容量判断为已满时清除最旧的对象缓存;当缓存区所占容量判断为未满时进行步骤三操作保存对象到本地缓存包括编号和内容并置对象为“临时状态”
步骤三:客户端本地缓存保存数据后,向服务器端发送对象内容、对象ID和客户端自身的ID,并将该缓存数据标识为“临时状态”;
步骤四:服务端接收数据后,保存对象内容到永久存储介质上,然后更新对象ID和客户端ID到服务缓存记录中;
步骤五:对于缓存记录模块中是否存在该对象ID的多条记录进行判断,如果不存在则通知客户端写操作完成并清除对象“临时状态”并最终写操作结束,如果存在则进行步骤六;
步骤六:遍历该对象ID和客户端ID,然后通知其他客户端该对象ID的缓存失效,并异步等待返回结果;如果异步有结果则返回异步结果并结束,如果异步没有结果进入步骤七;
步骤七:监控节点首先记录没有异步返回结果的客户端整体缓存失效,然后客户端定时通信任务触发缓存同步模块清除该客户端的所有缓存。
进一步的,所述对数据进行读操作时缓存处理的具体方法为:
步骤1:文件读模块收到文件读请求,然后对本地缓存是否包括对象数据进行判断,如果包含对象数据则返回读数据给请求程序,读操作过程结束;如果不包括对象数据则进入步骤二:
步骤2:服务器接收读请求并从服务端中取得对象数据,然后更新对象ID和客户端ID到服务缓存记录中,并把读出的数据对象结果返回给客户端。客户端判断本地缓存是否已满,如果缓存已满则清除最旧的对象缓存并进入步骤三,如果判断缓存未满则直接进入步骤三:
步骤3:保存对象数据到本地缓存,包括编号和内容并最终返回读数据,读操作过程结束。
进一步的,所述对数据进行写操作时缓存处理的步骤二中缓存区的占容量是否已满的判断标准为,判断缓存区所使用的空间是否大于一定的比例(如百分之九十),如果大于该比例则判断缓存区的占容量已满,如果不大于该比例则判断缓存区的占容量未满。
进一步的,所述对数据进行读操作时缓存处理的步骤2中缓存是否已满的判断标准为,判断缓存区所使用的空间是否大于一定的比例(如百分之九十),如果大于百分之九十则判断缓存已满,如果不大于百分之九十则判断缓存未满。
与现有技术相比,本发明的优点在于:
本发明在整个流程中,客户端宕机只是相当于本节点的缓存失效,而不影响数据的一致性。如果服务器端的存储节点存在宕机、增加或者减少的情况,那么会通知所有客户端废弃所有本地缓存数据,保证数据的一致性。因此,对于读多写少的Web之类的应用服务,整个操作过程中,一定程度增加了服务器的写负担,但是可以明显加快读请求性能和反应速度。
本发明能够提高本地客户端缓存的命中率,并保证数据的一致性,最终提高了分布式存储系统中的读性能。
附图说明
图1为现有技术中分布式存储系统的结构示意图;
图2为本发明的结构示意图;
图3为本发明对数据进行写操作时缓存处理的整体流程图;
图4为本发明对数据进行读操作时缓存处理的整体流程图。
具体实施方式
下面结合附图和具体实施方式,进一步阐明本发明。
本发明提供了一种多客户端缓存与服务端的同步方法,通过在服务端存储节点上记录每个客户端缓存的状态信息,在服务端进行数据更新时,通知相关客户端废弃本地缓存信息,最终实现加速客户端的读性能。本发明中缓存的颗粒度是以一个对象为单位,对象可以是一个完整文件,或者一个大文件的一部分。通过这种缓存的同步方式最终避免了客户端读数据时缓存的旧数据不可靠问题。
本发明的系统结构如附图2。在这种分布式存储中服务端有多个存储节点,每个存储节点增加一个本发明设计的“缓存记录模块”;客户端也会有多个,在客户端增加本发明设计的“缓存同步模块”。服务端保存数据的位置由分布式存储系统自身决定,可能分布到任何一台存储节点上。本发明的流程是截取数据的读写流程,在中间插入缓存的处理。对于保存每个对象缓存数据的方法为:
1.“缓存同步模块”启动时,建立一定大小的缓存区。
2.“缓存同步模块”保存每次写请求的对象数据内容和该对象的编号。当缓存区快满时(比如大约90%使用),则采用常规算法置最旧内容为脏数据。
3.客户端本地缓存保存数据后,向服务器端发送对象内容、对象ID和客户端自身的ID,但是暂时置该缓存数据为“临时状态”标志。
4.服务端接收数据后,保存对象内容到永久存储介质上,并把对象ID和客户端自身的ID作为“缓存记录模块”的一条记录保存。这里同一个对象ID,可以有多条客户端ID记录,因为多个客户端都可能缓存该对象。
5.对于记录中存在的不是本次客户端发起的其它客户端,服务器向这些客户端发送对象ID缓存记录失效的通知,但是异步等待返回结果。
6.所有缓存失效通知发完后,不等待结果,直接通知发起写请求客户端清除该缓存的“临时状态”标志,结束本次写请求。
7.对于等待异步返回结果的模块,如果在一定时间内发现返回结果则异步结束。否则多次重试后仍然没有结果,那么通知监控节点(或管理节点)该客户端整体失效。
8.对于收到对象ID缓存失效通知的客户端,则把该缓存数据置为脏数据。
9.客户端定时任务与监控节点(或者管理节点)不断通信,发现客户端整体失效通知后,本地客户端会置所有本地缓存为脏数据。
对于,客户端读取对象数据的方法为:
1.客户端查找本地缓存是否存在该对象数据和对象编号,且不为脏数据。
2.如果存在,且没有“临时状态”标志,说明数据有效,则直接返回给请求程序,读对象过程结束。
3.如果不存在,向后端服务器发起读请求。
4.服务器端从自身存储中取得对象数据,并在“缓存记录模块”中添加或者更新该对象ID和客户端ID对应关系记录。
5.然后服务器端把数据返回给客户端。
6.客户端同样把这次数据缓存到本地,最终提供给请求程序,读对象过程结束。当缓存区快满时(比如大约90%使用),则采用常规算法置最旧内容为脏数据。
其中,上面操作中置为脏数据,表明该段数据无效,可以覆盖。实际相当与清除数据,但是非常快速。在整个流程中,客户端宕机只是相当于本节点的缓存失效,而不影响数据的一致性。如果服务器端的存储节点存在宕机、增加或者减少的情况,那么会通知所有客户端废弃所有本地缓存数据,保证数据的一致性。至于服务端存储节点的宕机或者数据丢失是由服务端多副本的方法来保证,不属于本发明范畴。
由上述可知,对于读多写少的Web之类的应用服务,整个操作过程中,一定程度增加了服务器的写负担,但是可以明显加快读请求性能和反应速度。
本发明中在分布式存储系统中,客户端部署缓存同步模块,在服务端的存储节点部署缓存记录模块,整个读写的流程见附图3和4,该方法写请求流程包括:
1.服务端的存储节点以对象为单位存储用户数据,一个对象是小于4M(可配置)大小的用户数据,可以是一个完整文件,或者一个大文件的一部分,或者是一个大数据块的一部分。也就是说对于小于4M的文件,完整文件为一个对象;对于大于4M的文件,以4M为单位切割;对于不是以文件为单位的数据块,比如一个模拟块设备,也是以4M为单位切割。
2.客户端“缓存同步模块”启动时,建立一定大小的缓存区,缓存区可以保存在内存或者SSD等高速介质中,而不影响其功能。
3.“缓存同步模块”首先判断缓存区是否已快满(比如大约90%使用)。如果是则采用常规算法置最旧的缓存对象为脏数据。之后,把本次保存对象内容和相关编号保存到本地缓存区,并置该缓存数据为“临时状态”标志,表示数据还不最终可用。
4.客户端向服务器端发送对象内容、对象ID和客户端自身的ID。
5.服务端接收数据后,保存对象内容到永久存储介质上,并在“缓存记录模块”中更新对象ID和客户端ID应用关系记录。这个记录保存在内存中,可以不需要永久存储。
6.“缓存记录模块”查找所有以对象ID为键值的记录,这里可能有多条,如:
对象ID,客户端1的ID1
对象ID,客户端2的ID2
这表明这个对象ID在多个客户端都有缓存。这些编号的内容可以用多种方式设置,只要保证唯一性即可。
7.“缓存记录模块”遍历对象ID记录,对于不是本次客户端发起的其它客户端,服务器向这些客户端发起对象ID缓存失效的通知,但是异步等待返回结果。
8.所有缓存失效通知发完后,返回本次写请求结束给客户端。客户端接到通知后清除该缓存的“临时状态”标志,结束本次写请求。
9.对于等待异步返回结果模块,在一定时间内有返回结果则异步结束。否则如果多次(一般为3次)重试发出对象ID缓存失效通知,仍然没有结果,那么通知监控节点(或管理节点)该客户端整体失效。
10.客户端收到对象ID缓存失效通知,则把该缓存数据置为脏数据。
11.客户端定时任务与监控节点(或者管理节点)不断通信,发现客户端整体失效通知后,本地客户端会置所有本地缓存为脏数据。
对于读请求流程包括:
1.客户端“缓存同步模块”接收到数据读请求时,首先判断本地缓存是否存在该数据和对应编号。
2.如果存在,且没有“临时状态”标志,直接拿去本地数据返回给请求程序,读请求结束。这一点可以大大加快了读数据的过程。
3.如果不存在,走向后端服务器发起读请求。
4.服务器端,接收到请求后,自身存储中取得对象数据,并在“缓存记录模块”中添加或者更新对象ID和客户端ID记录。
5.然后服务器端把数据返回给客户端。
6.客户端“缓存同步模块”通用判断缓存区是否已快满(比如大约90%使用)。如果是则采用常规算法清除最旧的缓存数据。然后缓存本次读请求数据,最后把该对象内容返回给请求程序,读请求结束。
因此,本发明提供了一种多客户端读缓存与服务端的同步方法。该方法能够提高本地客户端缓存的命中率,并保证数据的一致性,最终提高了分布式存储系统中的读性能。
以上所述仅为本发明的实施例子而已,并不用于限制本发明。凡在本发明的原则之内,所作的等同替换,均应包含在本发明的保护范围之内。本发明未作详细阐述的内容属于本专业领域技术人员公知的已有技术。