基于缓存集群的缓存方法和系统与流程

文档序号:13718014阅读:145来源:国知局
技术领域本发明涉及存储领域,尤其涉及基于缓存集群的缓存方法和系统。

背景技术:
在现有的数据中心与存储产品中,闪存(flash)等高速非易失性缓存设备被广泛的用来加速后台共享存储的访问速度。缓存的写入方式可分为透写(write-through)和写回(write-back)两种方式。透写(write-through)指的是在写入缓存设备的同时也写入共享存储设备一份。其优点是操作简单,缓存设备和共享存储设备中数据保持一致,不易丢失数据;其缺点是访问数据速度较慢,整体的读写速度受共享存储设备的影响大,提升系统的每秒的输入输出数(inputoutputpersecond,IOPS)较难。回写(write-back)指的是在写入缓存设备时并不同步写入共享存储设备中,数据在写入缓存设备后即可向上层业务返回写成功,同时通过后台管理在适当的时候写入共享存储设备中。其优点是读写速度快,即IOPS高,其缺点是操作管理复杂,当缓存设备故障时易造成数据不一致。由于对于数据中心与存储产品中,产品的IOPS是一项非常重要的指标参数,因此写回缓存设备被广泛使用在各类存储产品中。为了克服写回缓存设备容易造成的数据不一致问题,须在写回缓存设备中增加保证数据一致性(dataconsistency)的机制。现有技术中,采用双节点互为镜像的方式,将一个写回缓存设备的写回缓存镜像到另一个节点。主要方式为:当某个写回缓存设备接受写业务时,其同时拷贝该请求至相应的镜像写回缓存设备,在镜像写回缓存设备中同时执行该写操作,从而保证互为镜像的两个写回缓存设备的数据一致。从而当其中某个写回缓存设备故障时,可以从相应的镜像写回缓存设备中恢复并获得数据,从而保证数据的一致性。由上可见,双写回缓存设备互为镜像的方式可以在一定程度上解决写回缓存的两副本一致性问题,但是这种方式只支持2个写回缓存设备互为镜像,无法满足大规模集群的可靠性需求。

技术实现要素:
本发明实施例提供基于缓存集群的缓存方法和系统,可以满足大规模集群的可靠性需求。一方面,提供了一种基于缓存集群的缓存方法,所述缓存集群包括视图服务节点和多个存储节点,每个存储节点包含至少一个写回缓存设备,每个所述写回缓存设备包括多个子分区,多个所述子分区构成一个缓存分区,每个所述缓存分区包含一个主子分区和至少一个备子分区,所述视图服务节点用于记录每个所述缓存分区的视图信息,所述视图信息包括每个所述缓存分区包含各个子分区所在的缓存设备的节点信息,其中,第一缓存分区的主子分区所在的存储节点为所述第一缓存分区的主节点,所述第一缓存分区的各个备子分区所在的存储节点为所述第一缓存分区的备节点,所述第一缓存分区为所述缓存集群中的任一缓存分区,所述方法包括:缓存客户端确定待写入数据对应的缓存分区的分区号;所述缓存客户端根据所述待写入数据对应的缓存分区的分区号向所述视图服务节点查询所述待写入数据对应的缓存分区的主节点信息;所述缓存客户端接收所述视图服务节点返回的所述待写入数据对应的缓存分区的主节点信息,并根据所述待写入数据对应的缓存分区的主节点信息向所述待写入数据对应的缓存分区的主节点发送写请求,所述写请求携带所述待写入数据;所述待写入数据对应的缓存分区的主节点根据所述写请求,将所述待写入数据写入本地写回缓存;所述待写入数据对应的缓存分区的主节点从所述视图服务节点获取所述待写入数据对应的缓存分区的各个备节点信息,并将所述待写入数据复制到所述待写入数据对应的缓存分区的各个备节点。由上可见,本发明实施例中通过将写回缓存设备划分为多个子分区,由多个子分区构成一个缓存分区,当缓存客户端要写入数据时,首先确定待写入数据对应的缓存分区的分区号,有利于实现负载均衡;并且,视图服务节点记录每个缓存分区的视图信息,视图信息包括每个缓存分区包含各个子分区所在的缓存设备的节点信息,便于实现缓存客户端将待写入数据将数据备份到多个缓存设备上,提高了缓存方法的可靠性。在一种可能的设计中,所述方法还包括:所述待写入数据对应的缓存分区的主节点确认所述待写入数据对应的缓存分区的各个备节点均将所述待写入数据复制完成;所述待写入数据对应的缓存分区的主节点向所述缓存客户端发送写响应;所述缓存客户端接收所述待写入数据对应的缓存分区的主节点发送的写响应,确认缓存完成。在一种可能的设计中,所述待写入数据对应的缓存分区的主节点根据所述写请求,将所述待写入数据写入本地写回缓存之前,所述方法还包括:所述待写入数据对应的缓存分区的主节点向所述视图服务节点查询所述待写入数据对应的缓存分区的视图信息;所述待写入数据对应的缓存分区的主节点根据所述待写入数据对应的缓存分区的视图信息,确认自身为所述待写入数据对应的缓存分区的主节点。由上可见,所述待写入数据对应的缓存分区的主节点在接收到所述缓存客户端发送的写请求后,不是直接将所述待写入数据写入本地写回缓存,而是先确认自身为所述待写入数据对应的缓存分区的主节点,从而可以提高执行操作的准确性,避免当缓存客户端发送写请求后,主节点发生了切换引起的误操作。在一种可能的设计中,所述视图信息还包括所述待写入数据对应的缓存分区的主分区切换次数;所述待写入数据对应的缓存分区的主节点根据所述待写入数据对应的缓存分区的视图信息,确认自身为所述待写入数据对应的缓存分区的主节点之后,所述方法还包括:验证所述写请求中携带的所述待写入数据对应的缓存分区的主分区切换次数与所述待写入数据对应的缓存分区的视图信息中携带的的主分区切换次数一致。由上可见,视图服务节点中的视图信息可能会发生更新,通过验证所述写请求中携带的所述待写入数据对应的缓存分区的主分区切换次数与所述待写入数据对应的缓存分区的视图信息中携带的的主分区切换次数一致,可以确保主节点中存储最新的视图信息,当验证结果不一致时,触发主节点从视图服务节点获取最新的视图信息。在一种可能的设计中,所述待写入数据对应的缓存分区的主节点根据所述写请求,将所述待写入数据写入本地写回缓存,包括:所述待写入数据对应的缓存分区的主节点根据所述写请求,生成所述待写入数据的操作项,所述操作项中包括操作序列号和操作参数;根据所述操作项中包括的操作序列号和操作参数,将所述待写入数据写入本地写回缓存。由上可见,主节点根据写请求生成相应的操作项,然后根据操作项包括的操作序列号和操作参数将待写入数据写入本地写回缓存,可以确保当主节点接收到多个写请求时,每个写请求的执行顺序,确保先接收到的写请求先执行。在一种可能的设计中,所述将所述待写入数据复制到所述待写入数据对应的缓存分区的各个备节点,包括:所述待写入数据对应的缓存分区的主节点将所述写请求和所述操作项发送给所述待写入数据对应的缓存分区的各个备节点;所述待写入数据对应的缓存分区的各个备节点向所述视图服务节点查询所述待写入数据对应的缓存分区的视图信息;所述待写入数据对应的缓存分区的各个备节点接收所述视图服务节点返回的所述待写入数据对应的缓存分区的视图信息,所述视图信息中还包括所述待写入数据对应的缓存分区的主分区切换次数;所述待写入数据对应的缓存分区的各个备节点验证所述写请求中携带的所述待写入数据对应的缓存分区的主分区切换次数与所述视图信息中包括的所述待写入数据对应的缓存分区的主分区切换次数一致;所述待写入数据对应的缓存分区的各个备节点验证所述操作项中的操作序列号与预期的操作序列号一致;所述待写入数据对应的缓存分区的各个备节点根据所述操作项中包括的操作序列号和操作参数,将数据写入本地写回缓存。由上可见,缓存分区的各个备节点在接收到主节点发送的写请求和操作项之后,先要验证主分区切换次数的一致性和操作序列号的一致性,从而保证节点操作的准确性及写请求操作的顺序性。在一种可能的设计中,在每个存储节点上都记录着该节点上每个分区的最大连续已提交操作序列号,所述最大连续已提交操作序列号表示小于该序列号的序列号对应的写操作均已复制到所有的备节点;所述主节点确认所有备节点均将数据复制完成之后,所述方法还包括:确定小于所述序列号的写请求均执行完毕,更新所述最大连续已提交操作序列号;所述主节点将更新后的所述最大连续已提交操作序列号通知所有备节点;所述主节点和所有备节点根据所述最大连续已提交操作序列号,回收和释放操作项。在一种可能的设计中,所述方法还包括:所述主节点确定需要刷盘;选取需要刷盘的脏数据块;将选取的数据块的状态标记为刷盘状态;将能够同时刷盘的数据块合并;从本地写回缓存中读取要刷盘的数据块的数据;将数据写回到相应的共享存储设备。在一种可能的设计中,所述方法还包括:当所述主节点在刷盘过程中收到写请求时,判断要写入的数据块是否为刷盘状态;如果判断出要写入的数据块为刷盘状态,则将写请求挂起,等待刷盘结束以后再处理;如果判断出要写入的数据块不是刷盘状态,则根据所述写请求进行相应的写操作。在一种可能的设计中,所述方法还包括:所述主节点确认本地刷盘成功;给所有备节点发送刷盘请求,将刷盘的数据块地址同步给所有备节点;备节点收到刷盘请求以后,将相应地址的数据从本地缓存删除。在一种可能的设计中,所述方法还包括:备节点等待数据删除完成以后,返回给所述主节点操作结果;所述主节点等到所有备节点都刷盘成功以后,所述主节点则将本地缓存中相应的脏数据块状态修改为干净状态。在一种可能的设计中,所述方法还包括:如果写回缓存可用空间小于某个阈值,则需要回收缓存空间;根据替换算法选择状态为干净状态的数据块;删除数据块的数据;回收此数据块,修改数据块状态为可用。在一种可能的设计中,所述方法还包括:当所述视图服务节点确认一个缓存分区的当前主节点发生故障以后,所述视图服务节点为所述第二缓存分区选择新的主节点并更新所述第二缓存分区的视图信息并将更新后的视图信息推送给所述第二缓存分区的主节点和各个备节点;所述第二缓存分区选择的新的主节点根据所述更新后的视图信息确定其为所述第二缓存分区的主节点后,开始主节点切主同步流程,挂起所述第二缓存分区所有新的修改业务;所述第二缓存分区的各个备节点根据所述更新后的视图信息确定所述第二缓存分区更新主节点,并开始备节点切主同步流程。由上可见,当一个缓存分区的主节点发生故障以后,通过视图服务节点的视图更新流程、主节点切主同步流程和备节点切主同步流程,可以保证缓存业务的连续性和可靠性,避免业务中断。在一种可能的设计中,所述所有备节点根据视图信息知道缓存分区的主节点切换后,开始备的切主同步流程,包括:备节点发送自己的最大请求序列号给新主节点;新主节点找到自己与该备节点的最大共同请求序列号,然后将两者共同请求序列号以及共同请求序列号以后的所有操作项发给该备节点;备节点算出差异操作项集合,自己有而新主节点没有的,回滚该操作项;自己没有而新主节点有的追赶该操作项。在一种可能的设计中,所述备节点算出差异操作项集合,自己有而新主节点没有的,回滚该操作项;自己没有而新主节点有的,追赶该操作项,包括:备节点按照逆序遍历所有需要回滚的操作项集合,依次从主节点上读取操作项对应的数据并覆盖本地写回缓存;备节点按照正序遍历所有需要追赶的操作项集合,依次从主节点上读取操作项对应的数据并覆盖本地写回缓存。在一种可能的设计中,所述方法还包括:当备节点处理完所有差异操作项以后,备节点通知新主节点切主同步成功完成;新主节点得到所有备节点切主同步完成的回应后,切主流程完成,开始处理该分区新业务。在一种可能的设计中,所述方法还包括:当备节点故障重启以后,向视图服务节点查询或者视图服务节点主动推送本节点的分区信息;备节点与主节点同步数据。在一种可能的设计中,所述备节点与主节点同步数据,包括:备节点将需要进行数据覆盖的分区的缓存数据删除,然后备节点向主节点发送一个数据覆盖请求;主节点将自己的最大请求序列号返回给备节点,然后主节点启动刷盘流程,将此请求序列号以前所有的脏数据刷盘。在一种可能的设计中,所述方法还包括:如果在刷盘过程中,主节点收到新的写请求,该写请求要写入的数据块还没有刷盘,则同时在本地执行该写请求并将该写请求转发到所有备节点,且相应的数据块不需要在此次数据覆盖过程中刷盘。在一种可能的设计中,所述方法还包括:当主节点上的所述请求序列号以前所有的脏数据块全部刷盘成功以后,则主节点通知该备节点数据完成同步;主节点通知视图服务节点该备节点上该分区故障恢复成功;视图服务节点更新视图并推送给所有相关节点。在一种可能的设计中,所述备节点与主节点同步数据,包括:备节点发送自己的最大操作序列号给主节点。主节点如果没有找到自己与该备节点的共同操作序列号,则进行数据覆盖流程;主节点如果找到自己与该备节点的最大共同操作序列号,然后将两者共同操作序列号以及共同操作序列号以后的所有操作项发给备节点;备节点算出差异操作项集合,自己有而新主节点没有的,回滚该操作项;自己没有而新主节点有的追赶该操作项。另一方面,提供了一种基于缓存集群的缓存系统,所述系统包括:所述缓存集群和缓存客户端;所述缓存集群包括视图服务节点和多个存储节点,每个存储节点包含至少一个写回缓存设备,每个所述写回缓存设备包括多个子分区,多个所述子分区构成一个缓存分区,每个所述缓存分区包含一个主子分区和至少一个备子分区,所述视图服务节点用于记录每个所述缓存分区的视图信息,所述视图信息包括每个所述缓存分区包含各个子分区所在的缓存设备的节点信息,其中,第一缓存分区的主子分区所在的存储节点为所述第一缓存分区的主节点,所述第一缓存分区的各个备子分区所在的存储节点为所述第一缓存分区的备节点,所述第一缓存分区为所述缓存集群中的任一缓存分区;所述缓存客户端,用于确定待写入数据对应的缓存分区的分区号;根据所述待写入数据对应的缓存分区的分区号向所述视图服务节点查询所述待写入数据对应的缓存分区的主节点信息;接收所述视图服务节点返回的所述待写入数据对应的缓存分区的主节点信息,并根据所述待写入数据对应的缓存分区的主节点信息向所述待写入数据对应的缓存分区的主节点发送写请求,所述写请求携带所述待写入数据;所述待写入数据对应的缓存分区的主节点,用于根据所述写请求,将所述待写入数据写入本地写回缓存;从所述视图服务节点获取所述待写入数据对应的缓存分区的各个备节点信息,并将所述待写入数据复制到所述待写入数据对应的缓存分区的各个备节点。在一种可能的设计中,所述待写入数据对应的缓存分区的主节点,还用于在根据所述写请求,将所述待写入数据写入本地写回缓存之前,向所述视图服务节点查询所述待写入数据对应的缓存分区的视图信息;根据所述待写入数据对应的缓存分区的视图信息,确认自身为所述待写入数据对应的缓存分区的主节点。在一种可能的设计中,所述视图信息还包括所述待写入数据对应的缓存分区的主分区切换次数;所述待写入数据对应的缓存分区的主节点,还用于在根据所述待写入数据对应的缓存分区的视图信息,确认自身为所述待写入数据对应的缓存分区的主节点之后,验证所述写请求中携带的所述待写入数据对应的缓存分区的主分区切换次数与所述待写入数据对应的缓存分区的视图信息中携带的的主分区切换次数一致。在一种可能的设计中,所述待写入数据对应的缓存分区的主节点,具体用于根据所述写请求,生成所述待写入数据的操作项,所述操作项中包括操作序列号和操作参数;根据所述操作项中包括的操作序列号和操作参数,将所述待写入数据写入本地写回缓存。在一种可能的设计中,所述待写入数据对应的缓存分区的主节点,具体用于将所述写请求和所述操作项发送给所述待写入数据对应的缓存分区的各个备节点;所述待写入数据对应的缓存分区的各个备节点,用于向所述视图服务节点查询所述待写入数据对应的缓存分区的视图信息;接收所述视图服务节点返回的所述待写入数据对应的缓存分区的视图信息,所述视图信息中还包括所述待写入数据对应的缓存分区的主分区切换次数;验证所述写请求中携带的所述待写入数据对应的缓存分区的主分区切换次数与所述视图信息中包括的所述待写入数据对应的缓存分区的主分区切换次数一致;验证所述操作项中的操作序列号与预期的操作序列号一致;根据所述操作项中包括的操作序列号和操作参数,将数据写入本地写回缓存。在一种可能的设计中,所述视图服务节点,用于在确认第二缓存分区的当前主节点发生故障以后,为所述第二缓存分区选择新的主节点并更新所述第二缓存分区的视图信息并将更新后的视图信息推送给所述第二缓存分区的主节点和各个备节点;所述第二缓存分区选择的新的主节点,用于根据所述更新后的视图信息确定其为所述第二缓存分区的主节点后,开始主节点切主同步流程,挂起所述第二缓存分区所有新的修改业务;所述第二缓存分区的各个备节点,用于根据所述更新后的视图信息确定所述第二缓存分区更新主节点,并开始备节点切主同步流程。另一方面,本发明实施例提供了一种缓存客户端,该缓存客户端具有实现上述方法实际中缓存客户端行为的功能。所述功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的模块。在一个可能的设计中,缓存客户端的结构中包括处理器、接收器和发射器,所述处理器被配置为支持缓存客户端执行上述方法中相应的功能。所述接收器用于支持缓存客户端与存储节点和视图服务节点之间的通信,接收存储节点和视图服务节点发送的上述方法中所涉及的信息或者指令。所述发射器用于支持缓存客户端与存储节点和视图服务节点之间的通信,向存储节点和视图服务节点发送上述方法中所涉及的信息或者指令。所述缓存客户端还可以包括存储器,所述存储器用于与处理器耦合,其保存缓存客户端必要的程序指令和数据。又一方面,本发明实施例提供了一种存储节点,该存储节点具有实现上述方法设计中缓存分区的主节点或备节点行为的功能。所述功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的模块。所述模块可以是软件和/或硬件。在一个可能的设计中,存储节点的结构中包括发送器、接收器和处理器,所述发送器和所述接收器用于支持该存储节点与其他存储节点、缓存客户端、视图服务节点之间的通信,所述接收器被配置为支持存储节点接收上述缓存客户端发送的写请求等各种指令。所述处理器控制存储节点根据所述接收器接收的写请求进行写操作。又一方面,本发明实施例提供了一种视图服务节点,该视图服务节点具有实现上述方法设计中视图服务节点行为的功能。所述功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的模块。所述模块可以是软件和/或硬件。在一个可能的设计中,视图服务节点的结构中包括发送器、接收器和处理器,所述发送器和所述接收器用于支持该视图服务节点与存储节点、缓存客户端之间的通信,所述接收器被配置为支持视图服务节点接收上述缓存客户端或存储节点发送的视图查询等各种指令。所述处理器控制视图服务节点进行更新视图等操作。再一方面,本发明实施例提供了一种计算机存储介质,用于储存为上述缓存客户端所用的计算机软件指令,缓存客户端执行该计算机指令时执行上述方面中提供的缓存方法。再一方面,本发明实施例提供了一种计算机存储介质,用于储存为上述存储节点所用的计算机软件指令,存储节点执行该计算机指令时执行上述方面中提供的缓存方法。再一方面,本发明实施例提供了一种计算机存储介质,用于储存为上述视图服务节点所用的计算机软件指令,其包含用于执行上述方面所设计的程序。相较于现有技术,本发明实施例中,通过在缓存分区的主节点和备节点上建立多个副本,可以满足大规模集群的可靠性要求,并且,通过存储分区信息的视图服务节点,提供了改变主节点和备节点的可能,具有很高的灵活性。附图说明图1a为本发明实施例提供的缓存方法所基于的一种系统架构示意图;图1b为本发明实施例提供的缓存方法所基于的另一种系统架构示意图;图1c为本发明实施例提供的缓存方法所基于的另一种系统架构示意图;图2为本发明实施例提供的缓存分区示意图;图3为本发明实施例提供的缓存方法中包括的正常写操作信号流图;图4为本发明实施例提供的缓存方法包括的正常刷盘流程信号流图;图5为本发明实施例提供的缓存方法包括的主切换流程信号流图;图6为本发明实施例提供的缓存方法包括的一种备故障恢复流程信号流图;图7为本发明实施例提供的缓存方法包括的另一种备故障恢复流程信号流图;图8为本发明实施例提供的缓存方法基于的另一种系统架构示意图;图9为本发明实施例提供的基于缓存集群的缓存系统结构图。具体实施方式下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚地描述。本发明给出了一种基于缓存集群的缓存方法和系统,实现了大规模分布式写回缓存多副本强一致性,能够满足大规模集群对于可靠性和可用性的需求。本发明的具体应用场景广泛,可用于传统多控阵列、服务器存储区域网络(ServerStorageAreaNetwork,ServerSAN)、分布式文件系统、分布式数据库以及其他分布式存储系统的写回缓存加速场景。图1a为本发明实施例提供的缓存方法所基于的缓存集群的系统架构示意图,该缓存集群包括多个写回缓存设备和多个共享存储设备以及至少一个视图服务节点,缓存客户端与写回缓存设备之间、缓存客户端与视图服务节点之间、共享存储设备与写回缓存设备之间、以及写回缓存设备与视图服务节点之间均可通过通信网络连接。写回缓存设备可以为非易失性的存储设备,例如SSD盘或FLASH盘,共享存储设备可以为硬盘。图1b和图1c为本发明实施例提供的缓存方法所基于的缓存集群的另两个系统架构示意图。这两个系统架构中,该缓存集群包括视图服务节点和多个存储节点。图1b为写回缓存设备和共享存储设备融合在一个存储节点上的系统架构,例如,一个存储节点上包括一个写回缓存设备和多个共享存储设备。图1c为写回缓存设备和共享存储设备分离在不同存储节点上的系统架构,例如,一个存储节点上,均部署写回缓存设备,另一个存储节点上均部署共享存储设备。缓存客户端与写回缓存设备之间、缓存客户端与视图服务节点之间、共享存储设备与写回缓存设备之间、以及写回缓存设备与视图服务节点之间均可通过通信通路连接。共享存储设备采用非易失性的存储介质,例如磁盘,写回缓存设备的介质种类不做限制,可以为易失性的存储介质也可以为非易失性的存储介质。该系统中的视图服务节点负责写回缓存的数据排布视图查询、变换和推送服务,并监视写回缓存设备所在的存储节点的状态。存储节点定期向视图服务节点发送心跳。写回缓存设备中缓存的是要写入共享存储设备的数据,写回缓存设备的脏数据会周期性的刷(flush)到共享存储设备。其中,脏(dirty)数据是指缓存中的已经更新但是还没有写入到共享存储设备的数据。缓存客户端是缓存服务的使用者,缓存客户端可以和写回缓存设备部署在同一存储节点,也可以单独部署,缓存客户端和存储节点可以通过网络互联。缓存客户端,写回缓存设备和视图服务节点可以作为独立的服务器部署,也可以作为模块集成到现有设备中。为了提高写回缓存中数据的可靠性并加快写入速度,本发明通过将写回缓存在逻辑上分区进行管理,并具体通过视图服务节点进行管理,图2为本发明实施例提供的缓存分区示意图,参见图2,每个写回缓存设备被从逻辑上或者物理上被划分为若干个子分区,视图服务节点则按照数据排布算法将缓存集群里面的所有子分区按照特定要求分别划入若干个缓存分区(Partition,PT),具体可以依据副本数,可靠性要求,均衡性等将子分区划入若干个PT,并将所有缓存分区中每个子分区的位置(例如,每个子分区所在的缓存设备的节点信息)、健康状态等记录在视图服务节点,通过通信通路推送给所有存储节点,其中,记录了分区的位置、健康状态等这些信息的数据结构或存储空间在本发明实施例中也叫做分区视图或者视图。一个缓存分区中的各个子分区一般来自于两个或两个以上的写回缓存设备,优选的,一个缓存分区中的每个子分区均来自于不同的写回缓存设备。一个缓存分区包含1个主子分区和若干个备子分区,上述分区视图中还记录了每个子分区的属性信息,该属性信息用于指示该子分区为主子分区或备子分区,写入该缓存分区的数据都会发给主子分区所在的存储节点,其中,一个缓存分区的主子分区所在的存储节点简称该缓存分区的主节点,主节点负责将写入的数据复制到所有备子分区所在的存储节点,其中,一个缓存分区的备子分区所在的存储节点简称该缓存分区的备节点,从而维护写入数据的多个副本。一个存储节点可以是主节点也可以是备节点,对于某个缓存分区来说一个存储节点是主节点,而对于另外一个缓存分区,则这个存储节点可能就是备节点。每个缓存分区的属性包含一个ioviewid和一个ptviewid,两者初始值可以指定(例如0,或者1),当这个分区的主分区发生切换时,ioviewid累加,当备分区状态转换时ptviewid累加,其中,状态是指备子分区是处于运行状态(UP)还是故障状态(DOWN),从UP到DOWN或者从DOWN到UP都是状态转换。图3为本发明实施例提供的缓存方法中包括的正常写操作信号流图,该方法可以基于图1a、图1b或图1c所示的系统架构和图2所示的缓存分区,参照图3,该方法包括:步骤301,缓存客户端获取待写入数据的缓存分区的分区号。具体地,可以先将要待写入数据分割成固定长度的数据块,然后根据数据块的地址,利用哈希算法,计算出待写入的缓存分区的分区号。步骤302,缓存客户端向视图服务节点发送查询请求,该查询请求中携带了待写入数据的缓存分区的分区号,查询缓存分区的主子分区对应的存储节点。其中,上述缓存分区的主子分区对应的存储节点即缓存分区的主节点。本发明实施例中,视图服务节点的分区视图中记录了每个缓存分区包含的各子分区,以及每个子分区的属性信息,在步骤301缓存客户端计算得出要写入数据的缓存分区后,即可将该缓存分区的分区号携带在查询请求中发送给视图服务节点,由视图服务节点根据分区视图中记录的信息确定该缓存分区的主子分区对应的存储节点。步骤303,视图服务节点向缓存客户端返回主节点信息。其中,上述主节点信息可以包括分区号(ID),分区状态(UP/DOWN),ioviewid,主分区所在节点ID,主分区的地址和端口号的信息之任一个或任意多个。本发明实施例中,缓存客户端可以缓存此主节点信息。步骤304,缓存客户端向主节点发送写请求。写请求中携带待写入数据。步骤305,主节点收到写请求以后,主节点向视图服务节点发送查询请求,查询缓存分区的视图信息。其中,步骤305为可选步骤,如果主节点本身缓存有缓存分区的视图信息,也可以不执行步骤305,但是,由于缓存分区的视图信息可能发生变化,因此主节点在收到写请求后,再查询缓存分区的视图信息,能够获得最新的视图信息。此外,如果步骤302中,缓存客户端向视图服务节点发送的查询请求,除了查询缓存分区的主子分区对应的存储节点,还查询缓存分区的视图信息,并且,步骤304中,缓存客户端向主节点发送写请求时,在写请求中携带缓存分区的视图信息,则步骤305也可以不执行。步骤306,视图服务节点返回该分区的视图信息。其中,该分区的视图信息包括每个子分区的位置、健康状态和每个子分区的属性信息之任一个或任意多个,该属性信息用于指示该子分区为主子分区或备子分区,上述子分区的位置指示子分区所在的缓存设备。主节点可以缓存此视图信息。步骤307,主节点验证自己是要写入数据的主节点。具体地,可以验证请求中携带的分区ioviewid和自己缓存的该分区ioviewid是否相同。如果ioviewid是相同的,则执行步骤308;如果ioviewid是不同的,则执行步骤305,以便更新视图信息。通过ioviewid是否相同来再次验证自身为要写入数据的主节点,避免写请求发送过程中主节点已经发生切换。其中,验证ioviewid是否相同,可以作为查询视图信息的一个触发条件。步骤308,如果ioviewid是相同的,主节点为此写请求生成一个操作项(Entry),该操作项记录了操作序列号(SeqID)、写请求携带的参数等。其中,操作序列号由分区当前ioviewid和一个累加操作计数(SeqNo)组成,累加操作计数每次加1,即针对当前写请求的累加操作计数为上一个写请求的累加操作计数的值加1。本发明实施例中,对于写请求中携带的参数不进行具体限定,上述参数可以为要写入的文件名称,数据长度等。步骤309,主节点根据生成的操作项将数据写入本地写回缓存。其中,上述本地写回缓存具体指的是待写入数据对应的缓存分区的主节点的写回缓存设备。步骤310,主节点将写请求(连同Entry)转发给步骤306返回的视图信息中包括的所有备节点。步骤311,备节点收到主节点转发的写请求以后,备节点向视图服务节点发送查询请求,查询缓存分区的视图信息。其中,步骤311为可选步骤,如果备节点接收到的写请求中携带了缓存分区的视图信息,则可以不执行步骤311。步骤312,视图服务节点返回该分区的视图信息。备节点可以缓存此视图信息。步骤313,备节点根据视图信息验证ioviewid是否是期待的。具体地,可以验证请求中携带的分区ioviewid和自己缓存的该分区ioviewid是否相同。如果ioviewid是相同的,则执行步骤314;如果ioviewid是不同的,则执行步骤311,以便更新视图信息。步骤314,备节点验证entry中的SeqID是否是期待的。其中,操作序列号(SeqID)由分区当前ioviewid和一个累加操作计数(SeqNo)组成,累加操作计数每次加1,即针对当前写请求的累加操作计数为上一个写请求的累加操作计数的值加1。步骤314即验证entry中的SeqID是否满足上述规则。步骤315,备节点如果上述验证都通过,则根据步骤310中发送的entry生成一个本地的entry,并按照SeqID的顺序记录在本地内存中。步骤316,备节点根据接收到的操作项将数据写入本地写回缓存,并等待执行完毕。步骤317,备节点等本地写回缓存执行完成以后,将执行结果返回给主节点。步骤318,主节点等待本地写回缓存执行完成以及所有备节点都执行完毕。主节点将entry设置为已提交(committed)状态,如果需要的话,更新最大连续已提交操作序列号(lastCommittedSeqID)。lastCommittedSeqID的定义是,所有等于和小于lastCommittedSeqID的所有操作都已经处于committed状态。步骤319,主节点返回给缓存客户端写请求的响应。其中,在步骤308中,主节点为此写操作生成操作项,该操作项中除了记录了操作序列号(SeqID)、写操作携带的参数,还可以记录要写入的数据。这种情况下,步骤309可以不必在步骤308之后执行,而是可以在主节点确认所有备节点均有该操作项之后,再执行步骤309。本发明实施例中,为了保证Entry不会占用太多资源,需要进行Entry回收。具体地,可以通过下面的算法回收Entry。在主节点和备节点上每个分区都记录lastCommittedSeqID,表示此SeqID前面的操作都已经复制到所有的备分区。在主节点在处理写请求过程中,假设此写请求的SeqID为CurrentSeqID,当收到本地写回缓存和所有备节点都执行完毕以后,则尝试更新lastCommittedSeqID。如果SeqID小于CurrentSeqID的写请求没有全部执行完毕,则不更新;否则查找一个最大的new_lastCommittedSeqID,此new_lastCommittedSeqID前面的所有写操作都已经执行完毕。更新lastCommittedSeqID为new_lastCommittedSeqID。主节点上的lastCommittedSeqID更新以后,则将新lastCommittedSeqID通知给备节点。这个通知可以被携带在正常的写操作和刷盘操作复制流程里面。SeqID小于lastCommittedSeqID的Entry都可以被回收和释放。正常刷盘流程负责将写流程写入到写回缓存设备的脏数据刷到共享存储设备,写流程和刷盘流程共同协同工作,保证数据最终写入共享存储设备。图4为本发明实施例提供的缓存方法包括的正常刷盘流程信号流图,参照图4,该方法包括:步骤401,当刷盘算法判断需要刷盘,则触发刷盘流程。具体地,判断需要刷盘的方法可以但不限于下列几种:根据脏数据的总量,如果超过某个阈值,则进行刷盘;或者,强制要将所有数据刷下去;或者,要将某个分区的数据全部刷下去;或者,系统空闲的时候,也可以将数据刷下去。步骤402,主节点选取一定量需要刷盘的脏数据块。步骤403,主节点标记选出的要刷盘的数据块为刷盘(flushing)状态。步骤404,将能够同时刷盘的数据块合并。具体地,可以将在共享存储设备上的地址连续的数据块的数据读出来,然后合并成一个刷盘请求发给共享存储设备。步骤405,从本地写回缓存中读取要刷盘的数据块的数据。步骤406,将数据写回到相应的共享存储设备。步骤407,共享存储设备写入数据完成以后返回结果。步骤408,在刷盘过程中收到写请求。步骤409,在刷盘过程中,可以继续处理读写业务。当收到写请求以后,先判断写请求和正在刷盘的数据是否冲突。如果要写入的数据块为刷盘(flushing)状态,则将写请求挂起,等待刷盘结束以后再处理;如果要写入的数据块不是flushing状态,则和正常写流程处理方式相同。步骤410,本地刷盘成功以后,给所有备节点发送刷盘请求,将刷盘的数据块地址同步给所有备节点。步骤411,备节点收到刷盘请求以后将相应地址的数据从本地缓存删除。具体地,可以使用标记删除技术将相应地址的数据从本地缓存删除。步骤412,等待数据删除完成以后,返回给主节点操作结果。步骤413,等到所有备节点都刷盘成功以后,主节点则将本地缓存中相应的脏数据块状态修改为干净(clean)状态,并将状态持久化。步骤414,清除相应数据块的flushing标记。步骤415,确认一次刷盘成功结束。本发明实施例中,还可以包括下面的后台数据块回收流程。步骤416,如果写回缓存设备可用空间小于某个阈值,则需要回收缓存空间。步骤417,根据替换算法选择状态为clean的数据块。步骤418,删除数据块的数据。步骤419,回收此数据块,修改数据块状态为可用。本发明实施例提供的缓存方法还可以包括主切换流程。当某个分区的主节点发生故障以后,会停止向视图服务节点发送心跳,视图服务节点没有收到若干个该主节点心跳后,判断此主节点故障,然后视图服务节点则需要从备节点中选取一个节点将其升级为主节点,并将更新后的视图推送给所有相关主备节点。主切换过程中,新的主节点和备节点中的Entry都存在,而且通过lastCommittedSeqID保证两者一定有共同的SeqID,因此可以通过Entry进行快速数据同步。图5为本发明实施例提供的缓存方法包括的主切换流程信号流图,参照图5,该方法包括:步骤501,视图服务节点确定缓存分区的当前主节点发生故障,选择新主节点。步骤502,视图服务节点生成新视图。步骤503,视图服务节点将新视图推送给所有该分区的主节点和备节点。步骤504,新主节点根据视图推算出自己是新主后,开始新主节点的切主同步流程,挂起该分区所有新的修改业务。步骤505,所有备节点根据视图知道主切换后,开始备节点的切主同步流程。备节点的切主同步流程主要包括:步骤5051,备节点发送自己的最大SeqID给新主节点。步骤5052,新主节点找到自己与该备节点的最大共同seqID,然后将两者共同SeqID以及共同SeqID以后的所有entry发给备节点。步骤5053,备节点算出差异entry集合,自己有而新主节点没有的,需要回滚该Entry;自己没有而新主节点有的需要追赶该Entry。备节点按照逆序遍历(SeqID从大到小)所有需要回滚的entry集合,依次从主节点上读取Entry对应的数据并覆盖本地写回缓存。备节点按照正序遍历(SeqID从小到大)所有需要追赶的entry集合,依次从主节点上读取Entry对应的数据并覆盖本地写回缓存。当备节点处理完所有差异Entry以后,则主节点和备节点数据一致。步骤506,备节点通知新主节点切主同步成功完成。步骤507,新主节点得到所有备节点切主同步完成的回应后,切主流程完成,开始处理该分区新业务。本发明实施例提供的缓存方法还可以包括备故障恢复流程。当备节点故障以后,则主节点会暂时忽略此备节点,新的业务不会复制到此备节点。当备节点故障恢复以后,需要和主节点进行数据同步,从而使备节点和主节点数据达到一致。其中,Entry在节点中的存储方式分为持久化和不持久化两种,对于不同的存储方式,相应的备故障恢复流程也有所不同。不持久化的意思是不需要写入非易失性的存储介质(例如,Flash或者磁盘),只保留在易失性的存储介质(例如,随机存取存储器(Random-AccessMemory,RAM))中。下面先对Entry不持久化时的备故障恢复流程进行说明,因为Entry不持久化,所以当备节点故障恢复以后没有任何Entry,主备节点数据同步要通过数据覆盖来实现。图6为本发明实施例提供的缓存方法包括的备故障恢复流程信号流图,其具体为Entry不持久化时的备故障恢复流程,参照图6,该方法包括:步骤601,当备节点故障重启以后,向视图服务节点查询或者视图服务节点主动推送本节点的分区信息。步骤602,备节点将需要进行数据覆盖的分区的缓存数据删除。步骤603,备节点向主节点发送一个数据覆盖请求。步骤604,主节点将自己的最大SeqID返回给备节点。步骤605,主节点启动刷盘流程,将此SeqID以前包括此SeqID的所有的脏数据(记录为一个集合,记作TO_FLUSH_SET)刷盘。具体刷盘流程与前面实施例中的刷盘流程类似,在此不做赘述。步骤606,在刷盘过程中,主节点收到新的写请求。本发明实施例中,如果该写请求要写入的数据块还没有刷盘,则同时在本地执行该写请求并将该写请求转发到所有备节点,且相应的数据块不需要在此次数据覆盖过程中刷盘。如果该写请求要写入的数据块正在刷盘,则不停止该刷盘操作。而是要等待刷盘结束再写入。步骤607,在本地执行写请求。步骤608,将写请求转发到所有备节点。步骤607和步骤608可以同时执行。其中,上述所有备节点既包括正常状态的备节点,也包括备故障恢复流程中处于数据覆盖的备节点,并将相应的数据块从TO_FLUSH_SET中删除,因为该数据块重新写入了数据,从而实现了主节点和备节点的数据同步,暂时不需要刷盘了。步骤609,主节点确认TO_FLUSH_SET中的脏数据块全部刷盘成功。步骤610,主节点通知该备节点数据完成同步。步骤611,主节点通知视图服务节点该备节点上该分区故障恢复成功。步骤612,视图服务节点更新视图。随后可将更新后的视图推送给所有相关节点。下面再对Entry持久化时的备故障恢复流程进行说明,具体地,在正常写流程里,Entry也可以连同数据一并持久化,将Entry和数据一齐写入本地写回缓存,当将Entry和数据一并持久化以后,备节点故障恢复以后仍可以从本地写回缓存中恢复Entry信息,从而可以按照Entry从主节点追赶数据,从而达到主备节点数据一致。图7为本发明实施例提供的缓存方法包括的备故障恢复流程信号流图,其具体为Entry持久化时的备故障恢复流程,参照图7,该方法包括:步骤701,当备节点故障重启以后,向视图服务节点查询或者视图服务节点主动推送本节点的分区信息。备节点根据视图知道主节点后,开始备节点的故障恢复流程。步骤702,备节点发送自己的最大SeqID给主节点。步骤703,主节点如果没有找到自己与该备节点的共同SeqID,则进行数据覆盖流程。步骤704,主节点如果找到自己与该备节点的最大共同seqID,然后将两者最大共同SeqID以及最大共同SeqID以后的所有entry发给备节点。步骤705,备节点算出差异entry集合,自己有而新主没有的,需要回滚该Entry;自己没有而新主有的需要追赶该Entry。具体地,备节点按照逆序遍历(SeqID从大到小)所有需要回滚的entry集合,依次从主节点上读取Entry对应的数据并覆盖本地写回缓存。备节点按照正序遍历(SeqID从小到大)所有需要追赶的entry集合,依次从主上读取Entry对应的数据并覆盖本地写回缓存。当备节点处理完所有差异Entry以后,则主备数据一致。步骤706,备节点通知主节点数据追赶成功完成。步骤707,主节点得到备节点数据追赶完成的回应后,向视图服务节点报告该备节点数据追赶完成。步骤708,视图服务节点修改视图。可选地,还可以包括:步骤709,视图服务节点将新视图推送给所有相关节点。图8为本发明实施例提供的缓存方法基于的另一种系统架构示意图,该系统架构中缓存客户端和写回缓存设备部署在同一个存储节点上面,基于该系统架构的缓存方法与前面描述的缓存方法相同,在此不做赘述。图9为本发明实施例提供的基于缓存集群的缓存系统结构图,该系统用于执行本发明实施例提供的基于缓存集群的缓存方法,该系统包括:缓存集群901和缓存客户端902;所述缓存集群901包括视图服务节点9011和多个存储节点9012,每个存储节点9012包含至少一个写回缓存设备90121,每个所述写回缓存设备90121包括多个子分区,多个所述子分区构成一个缓存分区,每个所述缓存分区包含一个主子分区和至少一个备子分区,所述视图服务节点9011用于记录每个所述缓存分区的视图信息,所述视图信息包括每个所述缓存分区包含各个子分区所在的缓存设备的节点信息,其中,第一缓存分区的主子分区所在的存储节点为所述第一缓存分区的主节点,所述第一缓存分区的各个备子分区所在的存储节点为所述第一缓存分区的备节点,所述第一缓存分区为所述缓存集群中的任一缓存分区;所述缓存客户端902,用于确定待写入数据对应的缓存分区的分区号;根据所述待写入数据对应的缓存分区的分区号向所述视图服务节点9011查询所述待写入数据对应的缓存分区的主节点信息;接收所述视图服务节点9011返回的所述待写入数据对应的缓存分区的主节点信息,并根据所述待写入数据对应的缓存分区的主节点信息向所述待写入数据对应的缓存分区的主节点发送写请求,所述写请求携带所述待写入数据;所述待写入数据对应的缓存分区的主节点,用于根据所述写请求,将所述待写入数据写入本地写回缓存;从所述视图服务节点9011获取所述待写入数据对应的缓存分区的各个备节点信息,并将所述待写入数据复制到所述待写入数据对应的缓存分区的各个备节点。可选地,所述待写入数据对应的缓存分区的主节点,还用于在根据所述写请求,将所述待写入数据写入本地写回缓存之前,向所述视图服务节点9011查询所述待写入数据对应的缓存分区的视图信息;根据所述待写入数据对应的缓存分区的视图信息,确认自身为所述待写入数据对应的缓存分区的主节点。可选地,所述视图信息还包括所述待写入数据对应的缓存分区的主分区切换次数;所述待写入数据对应的缓存分区的主节点,还用于在根据所述待写入数据对应的缓存分区的视图信息,确认自身为所述待写入数据对应的缓存分区的主节点之后,验证所述写请求中携带的所述待写入数据对应的缓存分区的主分区切换次数与所述待写入数据对应的缓存分区的视图信息中携带的的主分区切换次数一致。可选地,所述待写入数据对应的缓存分区的主节点,具体用于根据所述写请求,生成所述待写入数据的操作项,所述操作项中包括操作序列号和操作参数;根据所述操作项中包括的操作序列号和操作参数,将所述待写入数据写入本地写回缓存。可选地,所述待写入数据对应的缓存分区的主节点,具体用于将所述写请求和所述操作项发送给所述待写入数据对应的缓存分区的各个备节点;所述待写入数据对应的缓存分区的各个备节点,用于向所述视图服务节点9011查询所述待写入数据对应的缓存分区的视图信息;接收所述视图服务节点9011返回的所述待写入数据对应的缓存分区的视图信息,所述视图信息中还包括所述待写入数据对应的缓存分区的主分区切换次数;验证所述写请求中携带的所述待写入数据对应的缓存分区的主分区切换次数与所述视图信息中包括的所述待写入数据对应的缓存分区的主分区切换次数一致;验证所述操作项中的操作序列号与预期的操作序列号一致;根据所述操作项中包括的操作序列号和操作参数,将数据写入本地写回缓存。可选地,所述视图服务节点9011,用于在确认第二缓存分区的当前主节点发生故障以后,为所述第二缓存分区选择新的主节点并更新所述第二缓存分区的视图信息并将更新后的视图信息推送给所述第二缓存分区的主节点和各个备节点;所述第二缓存分区选择的新的主节点,用于根据所述更新后的视图信息确定其为所述第二缓存分区的主节点后,开始主节点切主同步流程,挂起所述第二缓存分区所有新的修改业务;所述第二缓存分区的各个备节点,用于根据所述更新后的视图信息确定所述第二缓存分区更新主节点,并开始备节点切主同步流程。本发明从大规模分布式写回缓存集群面临的技术问题出发,给出一种用于分布式写回缓存多副本强一致性的方法和系统,可以通过多副本机制,特别是对于3副本以及大于3副本的支持,满足缓存集群对写回缓存的高可靠和高可用的要求;并通过数据分区和数据正常和故障恢复流程的设计,保证缓存集群对于横向扩展和快速故障恢复的要求。专业人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令处理器完成,所述的程序可以存储于计算机可读存储介质中,所述存储介质是非短暂性(non-transitory)介质,例如随机存取存储器,只读存储器,快闪存储器,硬盘,固态硬盘,磁带(magnetictape),软盘(floppydisk),光盘(opticaldisc)及其任意组合。以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1