发明内容
本发明的目的之一在于提供一种缓存健康度检测方法及装置。
为实现上述发明目的之一,本发明一实施方式提供了一种缓存健康度检测方法,其包括:
每一预设周期,若服务器未处于满负载状态,则在服务器的访问请求中抽取至少一个作为抽样请求;
将抽样请求通过异步线程查询服务器的数据库和缓存中的数据,得到相对应的原始数据和缓存数据;
比对上述缓存数据和原始数据,并根据比对结果判断缓存健康度。
作为本发明一实施方式的进一步改进,所述“每一预设周期,若服务器未处于满负载状态,则在服务器的访问请求中抽取至少一个作为抽样请求”具体包括:
每一预设周期,根据所述服务器的负载获取对应所述负载的抽样比例,并根据所述抽样比例以及访问的请求数量计算抽样请求的数量;其中,服务器负载越高,抽样比例越低;服务器负载越低,抽样比例越高。
作为本发明一实施方式的进一步改进,抽样请求的数量=所述抽样比例*访问请求的数量;
所述抽样比例=1-服务器当前负载百分比,若所述服务器当前负载百分比大于或等于1,则表示所述服务器处于满负载状态,不进行抽样。
作为本发明一实施方式的进一步改进,所述服务器的当前负载百分比=R1*CPU负载+R2*内存负载+R3*IO负载+R4*网络负载,其中,R1、R2、R3、R4为相应参数的权重值,所述R1>R2>R3。
作为本发明一实施方式的进一步改进,所述CPU负载为:服务器当前的CPU负载/(服务器的CPU核数*单核CPU的负载基准值);
所述内存负载为:服务器当前的内存负载/内存的负载基准值;
所述IO负载为:服务器当前的IO负载/IO的负载基准值;
所述网络负载为:服务器当前的网络负载/网络的负载基准值。
作为本发明一实施方式的进一步改进,所述方法还包括:
若所述缓存数据和所述原始数据相同,则表示缓存健康度良好;
若所述缓存数据和所述原始数据不相同,则依据所述原始数据更新所述缓存数据。
为实现上述发明目的之一,本发明一实施方式提供了一种缓存健康度检测装置,其包括:
抽样模块,用于在每一预设周期,若服务器未处于满负载状态,则在服务器的访问请求中抽取至少一个作为抽样请求;
查询模块,用于将抽样请求通过异步线程查询服务器的数据库和缓存中的数据,得到相对应的原始数据和缓存数据;
比对模块,用于比对上述缓存数据和原始数据,并根据比对结果判断缓存健康度。
作为本发明一实施方式的进一步改进,所述抽样模块用于:每一预设周期,根据所述服务器的负载获取对应所述负载的抽样比例,并根据所述抽样比例以及访问请求的数量计算抽样请求的数量;其中,服务器负载越高,抽样比例越低;服务器负载越低,抽样比例越高。
作为本发明一实施方式的进一步改进,抽样请求的数量=所述抽样比例*访问请求的数量;
所述抽样比例=1-服务器当前负载百分比,若所述服务器当前负载百分比大于或等于1,则表示所述服务器处于满负载状态,不进行抽样。
作为本发明一实施方式的进一步改进,所述服务器的当前负载百分比=R1*CPU负载+R2*内存负载+R3*IO负载+R4*网络负载,其中,R1、R2、R3、R4为相应参数的权重值,所述R1>R2>R3。
作为本发明一实施方式的进一步改进,所述CPU负载为:服务器当前的CPU负载/(服务器的CPU核数*单核CPU的负载基准值);
所述内存负载为:服务器当前的内存负载/内存的负载基准值;
所述IO负载为:服务器当前的IO负载/IO的负载基准值;
所述网络负载为:服务器当前的网络负载/网络的负载基准值。
作为本发明一实施方式的进一步改进,所述比对模块还用于判断所述缓存数据和所述原始数据是否相同,
若所述缓存数据和所述原始数据相同,则表示缓存健康度良好;
若所述缓存数据和所述原始数据不相同,则依据所述原始数据更新所述缓存数据。
与现有技术相比,本发明的有益效果是:本发明的缓存健康度检测方法及装置,在高并发查询请求且不改变系统整体负载的前提下,可实时的进行抽样,并根据抽样请求获取数据库和缓存中的数据,以判断缓存的健康度,如此,即可在缓存和数据库中数据不一致时,即时发现问题。
具体实施方式
以下将结合附图所示的各实施方式对本发明进行详细描述。但这些实施方式并不限制本发明,本领域的普通技术人员根据这些实施方式所轻易做出的结构、方法、或功能上的变换均包含在本发明的保护范围内。
一般地,缓存是将数据以key-value的形式存储在相对较高访问速度存储介质的Hash表中,以便于在查询数据时,只需要从存储介质中根据Key获取对应的Value。存储于缓存中的数据具有访问速度快、数据易丢失等特点。
所述健康度指缓存中的数据与实际数据库的数据一致性的比例。当缓存中的数据与实际数据库的数据完全一致时,则健康度为百分之百,相应的,所述缓存的健康度是衡量缓存数据有效性的重要指标。
如图1所示,在本发明一实施方式中,所述缓存健康度检测方法包括:
每一预设周期,若服务器未处于满负载状态,则在服务器的访问请求中抽取至少一个作为抽样请求。
优选的,可动态获取服务器当前负载下合理的抽样比例。在服务器集群环境下,每台服务器的负载和内存占用都是各不相同的,因此,需要一种集群动态分配策略将抽样请求按照负载的不同分布到不同的服务器上。如:若某一服务器当前负载很高,则这台服务器当前可能不会分配到抽样请求,而当前负载较低的服务器就会分配到较多的抽样请求,以实现对服务器资源充分利用,且这种基于负载的抽样不会影响到服务器的整体性能,实现资源的最大化利用和功能最大化。
相应的,在本发明一实施方式中,可动态地获取服务器当前合理的抽样比例,并根据抽样比例随机抽取访问请求中特定的请求作为健康度抽样请求。
具体的,每一预设周期,根据所述服务器的负载获取对应所述负载的抽样比例,并根据所述抽样比例以及访问请求的数量计算抽样请求的数量;其中,服务器负载越高,抽样比例越低;服务器负载越低,抽样比例越高。
进一步的,抽样请求的数量=所述抽样比例*访问请求的数量;
所述抽样比例=1-服务器当前负载百分比,若所述服务器当前负载百分比大于或等于1,则表示所述服务器处于超负载或满负载状态,则不对该服务器进行抽样。
优选的,结合参照图2所示,本实施方式中,服务器是处于Linux环境下,影响服务器当前负载百分比的各种主要的资源所对应用的程序主要考虑以下几个参数。
CPU运算速度,即当前CPU的负载;内存的占有率,即内存负载;系统IO速度,即IO负载;网络传输速度,即网络负载;当然,如果出现swap,则系统的当前负载百分比也很高,在此不做详细赘述。
相应的,所述CPU负载为:服务器当前的CPU负载/(服务器的CPU核数*单核CPU的负载基准值);即:
所述内存负载为:服务器当前的内存负载/内存的负载基准值;即:
所述IO负载为:服务器当前的IO负载/IO的负载基准值;即:
所述网络负载为:服务器当前的网络负载/网络的负载基准值;即:
其中,Lcpu(i)表示第i台服务器的当前CPU负载,Ki表示第i台服务器的CPU核数,BASEcpu则为单核CPU的负载基准值;Lm(i)表示第i台服务器的当前内存负载,BASEm则为内存负载的基准值;Lio(i)表示第i台服务器的当前IO负载,BASEio则为IO负载的基准值;Lnet(i)表示第i台服务器的当前网络负载,BASEnet则为网络负载的基准值;
相应的,仅以CPU的当前负载为例做具体说明,其他不再详细赘述。
例如:通常情况下,单核CPU的负载理论最大值为1,但是在设计负载容量的时候,一般都会留有一定的buffer,即缓冲区,故,将单核CPU的负载基准值设置为0.7,即单个CPU的负载超过0.7即认为负载很高。
进一步的,给每个维度的负载情况赋予权重值后,得到所述服务器的当前负载百分比。
相应的,所述服务器的当前负载百分比=R1*CPU负载+R2*内存负载+R3*IO负载+R4*网络负载,即:
ΣRi=R1+R2+R3+R4
其中,Load(i)表示第i台服务器的当前负载百分比,R1、R2、R3、R4为相应参数的权重值。ΣRi用来表示相对服务器负载的整体权重,通常情况下,ΣRi=1。
优选的,在本发明一具体实施方式中,相应权重值的大小关系为:R1>R2>R3=R4,例如:所述R1、R2、R3、R4的取值依次为:0.55、0.25、0.1、0.1。
需要说明的是,在实际操作过程中,影响服务器当前负载百分比的各种主要的资源并不一定仅具有上述4个参数,其参数个数及种类会随着系统环境的变换进行增加或减少,相应的,服务器当前负载百分比的算法也会随之相应的调整,但其原理与上述原理相同,在此不做详细赘述。
将抽样请求通过异步线程查询服务器的数据库和缓存中的数据,得到相对应的原始数据和缓存数据。
具体的,将待检测的抽样请求放入异步线程池中,异步线程查询缓存中的数据,得到缓存数据Sa,以及异步线程查询数据库中的数据,得到原始数据Sb,通过与访问请求不同线程的异步线程,可不影响访问请求的实时返回和响应时间,也不会增加访问请求的线程压力。
比对上述缓存数据和原始数据,并根据比对结果判断缓存健康度。
相应的,判断所述缓存数据Sa和所述原始数据Sb是否相同,若所述缓存数据Sa和所述原始数据Sb相同,则表示缓存健康度良好,若所述缓存数据Sa和所述原始数据Sb不相同,则表示缓存健康度较差,此时,可依据所述原始数据更新所述缓存数据,即是将缓存数据Sa更新为原始数据Sb。当然,在缓存数据Sa和所述原始数据Sb不相同时,还可触发监控警报,以通过人工介入排查并处理,从而保证缓存与数据库中数据的最终一致性。
另外,在本发明一实施方式中,可形成健康度监控模型,以根据上述技术方案实时的对缓存的健康度进行监控。
如图3所示,在本发明一实施方式的缓存健康度检测装置,包括:抽样模块100,查询模块200,比对模块300。
抽样模块100用于在每一预设周期,若服务器未处于满负载状态,在服务器的访问请求中抽取至少一个作为抽样请求;
抽样模块100可动态获取服务器当前负载下合理的抽样比例。在服务器集群环境下,每台服务器的负载和内存占用都是各不相同的,因此,需要一种集群动态分配策略将抽样请求按照负载的不同分布到不同的服务器上。如:若某一服务器当前负载很高,则这台服务器当前可能不会分配到抽样请求,而当前负载较低的服务器就会分配到较多的抽样请求,以实现对服务器资源充分利用,且这种基于负载的抽样不会影响到服务器的整体性能,实现资源的最大化利用和功能最大化。
相应的,在本发明一实施方式中,抽样模块100可动态地获取服务器当前合理的抽样比例,并根据抽样比例随机抽取访问请求中特定的请求作为健康度抽样请求。
具体的,抽样模块100用于在每一预设周期,根据所述服务器的负载获取对应所述负载的抽样比例,并根据所述抽样比例以及访问请求的数量计算抽样请求的数量;其中,服务器负载越高,抽样比例越低;服务器负载越低,抽样比例越高。
进一步的,抽样请求的数量=所述抽样比例*访问请求的数量;
所述抽样比例=1-服务器当前负载百分比,若所述服务器当前负载百分比大于或等于1,则表示所述服务器处于超负载或满负载状态,则不对该服务器进行抽样。
优选的,结合参照图2所示,本实施方式中,服务器是处于Linux环境下,影响服务器当前负载百分比的各种主要的资源所对应用的程序主要考虑以下几个参数。
CPU运算速度,即当前CPU的负载;内存的占有率,即内存负载;系统IO速度,即IO负载;网络传输速度,即网络负载;当然,如果出现swap,则系统的当前负载百分比也很高,在此不做详细赘述。
相应的,所述CPU负载为:服务器当前的CPU负载/(服务器的CPU核数*单核CPU的负载基准值);即:
所述内存负载为:服务器当前的内存负载/内存的负载基准值;即:
所述IO负载为:服务器当前的IO负载/IO的负载基准值;即:
所述网络负载为:服务器当前的网络负载/网络的负载基准值;即:
其中,Lcpu(i)表示第i台服务器的当前CPU负载,Ki表示第i台服务器的CPU核数,BASEcpu则为单核CPU的负载基准值;Lm(i)表示第i台服务器的当前内存负载,BASEm则为内存负载的基准值;Lio(i)表示第i台服务器的当前IO负载,BASEio则为IO负载的基准值;Lnet(i)表示第i台服务器的当前网络负载,BASEnet则为网络负载的基准值;
相应的,仅以CPU的当前负载为例做具体说明,其他不再详细赘述。
例如:通常情况下,单核CPU的负载理论最大值为1,但是在设计负载容量的时候,一般都会留有一定的buffer,即缓冲区,故,将单核CPU的负载基准值设置为0.7,即单个CPU的负载超过0.7即认为负载很高。
进一步的,给每个维度的负载情况赋予权重值后,抽样模块100得到所述服务器的当前负载百分比。
相应的,所述服务器的当前负载百分比=R1*CPU负载+R2*内存负载+R3*IO负载+R4*网络负载,即:
ΣRi=R1+R2+R3+R4
其中,Load(i)表示第i台服务器的当前负载百分比,R1、R2、R3、R4为相应参数的权重值。ΣRi用来表示相对服务器负载的整体权重,通常情况下,ΣRi=1。
优选的,在本发明一具体实施方式中,相应权重值的大小关系为:R1>R2>R3=R4,例如:所述R1、R2、R3、R4的取值依次为:0.55、0.25、0.1、0.1。
需要说明的是,在实际操作过程中,影响服务器当前负载百分比的各种主要的资源并不一定仅具有上述4个参数,其参数个数及种类会随着系统环境的变换进行增加或减少,相应的,服务器当前负载百分比的算法也会随之相应的调整,但其原理与上述原理相同,在此不做详细赘述。
查询模块200用于将抽样请求通过异步线程查询服务器的数据库和缓存中的数据,得到相对应的原始数据和缓存数据。
具体的,查询模块200将待检测的抽样请求放入异步线程池中,异步线程查询缓存中的数据,得到缓存数据Sa,以及异步线程查询数据库中的数据,得到原始数据Sb,通过与访问请求不同线程的异步线程,可不影响访问请求的实时返回和响应时间,也不会增加访问请求的线程压力。
比对模块300用于比对上述缓存数据和原始数据,并根据比对结果判断缓存健康度。
具体的,比对模块300用于判断所述缓存数据Sa和所述原始数据Sb是否相同,若所述缓存数据Sa和所述原始数据Sb相同,则表示缓存健康度良好,若所述缓存数据Sa和所述原始数据Sb不相同,则表示缓存健康度较差,此时,比对模块300可依据所述原始数据更新所述缓存数据,即是将缓存数据Sa更新为原始数据Sb。当然,在缓存数据Sa和所述原始数据Sb不相同时,还可触发监控警报,以通过人工介入排查并处理,从而保证缓存与数据库中数据的最终一致性。
另外,在本发明一实施方式中,可形成健康度监控模型,以根据上述技术方案实时的对缓存的健康度进行监控。
综上所述,本发明的上述实施方式提供的缓存健康度检测方法及装置,在高并发查询请求且不改变系统整体负载的前提下,根据当前服务器的请求和负载情况,动态计算出缓存健康度抽样比例;然后,异步的将根据抽样的请求获取的数据库中的数据和缓存中的数据做健康度比较;如果出现不可预见因素导致缓存与数据库数据不一致的问题,可以通过监控模型马上发现并自动更新缓存,和/或通过人工介入排查和处理;进而动态的对缓存健康度做实时监测和预警,保证缓存和数据库完全一致性。
在本发明所提供的几个实施方式中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施方式仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施方式方案的目的。
另外,在本发明各个实施方式中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以2个或2个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机装置(可以是个人计算机,服务器,或者网络装置等)或处理器(processor)执行本发明各个实施方式所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施方式仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施方式对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施方式所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施方式技术方案的精神和范围。