机房多活环境下积分系统实现数据一致性的方法及系统与流程

未命名 10-18 阅读:96 评论:0


1.本发明涉及积分系统技术领域,特别是机房多活环境下积分系统实现数据一致性的方法及系统。


背景技术:

2.在当今数字化时代,单机房架构已经无法满足系统对于高可用性和容错性的要求,当机房出现灾难性的事故如光缆中断和机房硬件故障情形,系统服务将会完全停止,这就意味着在系统停止的时间内,企业将承受损失,如用户流失、收益减少、口碑下降等。所以搭建多机房多活环境成为许多企业的一个目标,然而采用多活环境也会面临一些问题。多活即是所有的集群都是正常提供服务的。首先,数据一致性是最主要的挑战之一,当多个节点同时更新积分数据时,可能会出现数据冲突,导致节点之间的积分数据不一致。此外,网络延迟和故障也增加了数据同步的复杂性,可能导致某些节点在一段时间内无法更新或同步积分数据。总之,在多活环境的架构设计上,如何在系统可用性和数据一致性之间进行取舍,是一个难题。多活即是在多个机房有完整的系统环境,能够在任一机房发生宕机,另一个机房也可以承载流量提供服务。


技术实现要素:

3.为克服上述问题,本发明的目的是提供一种机房多活环境下积分系统实现数据一致性的方法,能确保一个机房出现故障时,其他机房能使积分系统的数据保持一致性。
4.本发明采用以下方案实现:一种机房多活环境下积分系统实现数据一致性的方法,所述方法包括如下步骤:
5.步骤s1、网关接收积分消费的请求,将请求中用户编号与机房数量进行取模得到机房编号n,添加机房编号n到请求头中,如果n等于0则请求转发到机房a的积分系统,如果n等于1则请求转发到机房b的积分系统;
6.步骤s2、每隔设定时间向指定目录记录当前时间,作为心跳日志的心跳时间;
7.步骤s3、收到网关转发的请求后,将积分消费信息按日志格式存储到日志文件中,并执行数据库的积分更新,同时机房a和机房b的数据库采取双向同步策略;
8.步骤s4、当机房a发生故障,机房a从网关路由上剔除,则n等于0的请求被转发向了机房b,此部分用户请求头里的机房编号n和当前服务器不同,那么把积分消费日志格式上的跨机房访问标识设为true;
9.步骤s5、当机房a恢复后,先读取最后一条心跳日志获得最后心跳时间,得到时差为t,则拉取机房b上t时间的积分消费日志,用机房a数据的当前余额逐条扣除跨机房标识为true的积分消费日志的消费金额,进行补扣成功即得到最终的余额,同时网关恢复机房a的路由。
10.进一步的,所述积分消费信息包括目标机房编号,用户编号,消费积分,剩余积分,时间,以及是否跨机房;则日志格式为{目标机房编号,用户编号,消费积分,剩余积分,时
间,是否跨机房},其中是否跨机房的值为false或者true。
11.进一步的,步骤s4具体为:用户编号是双号的用户都是被网关转发到机房a的积分系统,用户编号是单号的用户都是被网关转发到机房b的积分系统,当机房在发生故障时,机房会被从网关路由上剔除;假设机房a发生了故障,机房a从网关路由上被剔除,则n=0原本要转发向机房a的请求,由于机房a不可用,则也转发向了机房b;机房b的积分系统收到请求,从请求里得知请求头head["set"]=0,和机房b的编号1不一致,那么在积分消费日志格式上把跨机房访问标识设为true。
[0012]
本发明还提供了机房多活环境下积分系统实现数据一致性的系统,所述系统包括积分请求处理模块、心跳日志生成模块、日志存储模块、故障积分处理模块以及积分恢复模块;
[0013]
所述积分请求处理模块,通过网关接收积分消费的请求,将请求中用户编号与机房数量进行取模得到机房编号n,添加机房编号n到请求头中,如果n等于0则请求转发到机房a的积分系统,如果n等于1则请求转发到机房b的积分系统;
[0014]
所述心跳日志生成模块,每隔设定时间向指定目录记录当前时间,作为心跳日志的心跳时间;
[0015]
所述日志存储模块,收到网关转发的请求后,将积分消费信息按日志格式存储到日志文件中,并执行数据库的积分更新,同时机房a和机房b的数据库采取双向同步策略;
[0016]
所述故障积分处理模块,当机房a发生故障,机房a从网关路由上剔除,则n等于0的请求被转发向了机房b,此部分用户请求头里的机房编号n和当前服务器不同,那么把积分消费日志格式上的跨机房访问标识设为true;
[0017]
所述积分恢复模块,当机房a恢复后,先读取最后一条心跳日志获得最后心跳时间,得到时差为t,则拉取机房b上t时间的积分消费日志,用机房a数据的当前余额逐条扣除跨机房标识为true的积分消费日志的消费金额,进行补扣成功即得到最终的余额,同时网关恢复机房a的路由。
[0018]
进一步的,所述积分消费信息包括目标机房编号,用户编号,消费积分,剩余积分,时间,以及是否跨机房;则日志格式为{目标机房编号,用户编号,消费积分,剩余积分,时间,是否跨机房},其中是否跨机房的值为false或者true。
[0019]
进一步的,所述故障积分处理模块具体为:用户编号是双号的用户都是被网关转发到机房a的积分系统,用户编号是单号的用户都是被网关转发到机房b的积分系统,当机房在发生故障时,机房会被从网关路由上剔除;假设机房a发生了故障,机房a从网关路由上被剔除,则n=0原本要转发向机房a的请求,由于机房a不可用,则也转发向了机房b;机房b的积分系统收到请求,从请求里得知请求头head["set"]=0,和机房b的编号1不一致,那么在积分消费日志格式上把跨机房访问标识设为true。
[0020]
本发明的有益效果在于:机房多活环境下积分系统实现数据一致性的方法及系统,在多活环境中即使在分布式节点之间存在网络延迟或故障的情况下也能确保多机房的积分数据最终达到一致状态,从而保证积分系统的数据稳定性,提高用户的体验度。
附图说明
[0021]
图1是本发明的方法流程示意图。
[0022]
图2是本发明一实施的机房a和机房b之间的数据处理示意图。
[0023]
图3是本发明的系统原理框图。
具体实施方式
[0024]
下面结合附图对本发明做进一步说明。
[0025]
请参阅图1所示,本发明的一种机房多活环境下积分系统实现数据一致性的方法,所述方法包括如下步骤:
[0026]
步骤s1、网关接收积分消费的请求,将请求中用户编号与机房数量进行取模得到机房编号n,添加机房编号n到积分消费的请求的请求头中,如果n等于0则请求转发到机房a的积分系统,如果n等于1则请求转发到机房b的积分系统;其中,用户编号与机房数量进行取模得到机房编号n,由于此处设计是双机房(机房a和机房b)的多活场景,则进行2取模,要是3个机房,则进行3取模,以此类推,要是多机房,则和机房数量进行取模。
[0027]
步骤s2、每隔设定时间向指定目录记录当前时间,作为心跳日志的心跳时间;
[0028]
步骤s3、收到网关转发的请求后,将积分消费信息按日志格式存储到日志文件中,并执行数据库的积分更新,同时机房a和机房b的数据库采取双向同步策略;所述积分消费信息包括目标机房编号,用户编号,消费积分,剩余积分,时间,以及是否跨机房;则日志格式为{目标机房编号,用户编号,消费积分,剩余积分,时间,是否跨机房},其中是否跨机房的值为false或者true。
[0029]
步骤s4、当机房a发生故障,机房a从网关路由上剔除,则n等于0的请求被转发向了机房b,此部分用户请求头里的机房编号n和当前服务器不同,那么把积分消费日志格式上的跨机房访问标识设为true;
[0030]
步骤s5、当机房a恢复后,先读取最后一条心跳日志获得最后心跳时间,得到时差为t,则拉取机房b上t时间的积分消费日志,用机房a数据的当前余额逐条扣除跨机房标识为true的积分消费日志的消费金额,进行补扣成功即得到最终的余额,同时网关恢复机房a的路由。
[0031]
下面结合一具体实施例对本发明做进一步说明:
[0032]
请参阅图2所示,一种机房多活环境下积分系统实现数据一致性的方法,
[0033]
1、网关接收积分消费的请求,将请求中用户编号参数与机房数量进行取模得到机房编号n,添加机房编号n到请求头中,如果n等于0则请求转发到机房a的积分系统,n等于1则请求转发到机房b的积分系统。
[0034]
假设当前有2个机房a和b,用0和1给他们编号,举例积分消费的接口地址是api.xxx.com/point/buy,网关收到889880这位用户消费100积分的积分消费的请求,地址如下api.xxx.com/point/buy?userid=889880&point=100,用用户编号userid与机房数量2进行取模,n=889880%2=0,添加机房编号n到请求头中,head["set"]=0,n等于0则表示这个请求是转发到机房a的积分系统,如果n等于1则请求转发到机房b的积分系统。要说明的是网关在机房a和机房b均有部署,无论哪个机房的网关收到请求,均会根据userid来对请求进行正确的转发。此举保证了有一半用户是始终访问机房a的积分系统,另一半用户是始终访问积分b的积分系统。
[0035]
2、系统每隔1秒向指定目录记录当前时间,作为心跳日志的心跳时间。
[0036]
积分系统会启动一个线程运行心跳任务,每秒向指定的日志目录heart记录当前的时间,作为心跳日志的心跳时间。输出日志内容如下:
[0037]
2023-07-04 21:58:44
[0038]
2023-07-04 21:58:45
[0039]
2023-07-04 21:58:46
[0040]
3、系统收到网关转发的请求后,按{目标机房编号,用户编号,消费积分,剩余积分,时间,是否跨机房}的积分消费日志格式存储到日志文件中,接着执行数据库的积分更新。并且机房a和b的数据库采取双向同步策略。
[0041]
积分系统收到网关转发的请求后,读取用户的当前积分,假设当前积分为500,那么本次消费积分为100,剩余积分为500-100=400。获取请求头中的目标机房编号head["set"],判断是否和当前机房编号一致,如果一致则是否跨机房=false,否则为true。按格式{目标机房编号,用户编号,消费积分,剩余积分,时间,是否跨机房}的格式得到{0,889880,-100,400,2023-07-04 21:58:50,false}存入到日志文件中,日志存储成功后,接着执行数据库的积分更新,把用户的积分余额更新为400。并且积分a和积分b的数据库mysql采取双向同步策略,这样机房a和机房b都会有全量的用户数据。
[0042]
4、当机房a发生故障,机房a从网关路由上剔除,所以n等于0的请求也被转发向了机房b,此部分用户请求头里的机房编号n和当前服务器不同,那么把积分消费日志格式上的跨机房访问标识设为true。
[0043]
在日常的请求中,用户编号双号的用户都是被网关转发到机房a的积分系统,单号的用户都是被网关转发到机房b的积分系统,但当机房在发生故障时,机房会被从网关路由上剔除。我们假设机房a发生了故障,机房a从网关路由上被剔除了,所以n=0原本要转发向机房a的请求,由于机房a不可用,所以也转发向了机房b。机房b的积分系统收到请求,从请求头里得知head["set"]=0,和本机房b的编号1不一致,那么在积分消费日志格式上把跨机房访问标识设为true。
[0044]
假设机房a的积分消费日志如下:
[0045]
{0,889880,-100,400,2023-07-04 21:58:46,false}
[0046]
表示用户889880在2023-07-04 21:58:46消费完100积分后还剩余400积分,并且不存在跨机房请求。
[0047]
机房b在2023-07-04 21:58:51收到用户889880的100积分消费请求,记录的积分消费日志如下:
[0048]
{1,889880,-100,400,2023-07-04 21:58:51,true}
[0049]
由于机房a发生了故障,数据库中这条消费信息还未同步至机房b的数据库,所以机房b的数据库中用户889880的余额还是500,与机房a不一致。所以500-100得到剩余余额是400,并且由于存在跨机房访问,所以跨机房标识为true。
[0050]
接着在2023-07-04 21:59:00又收到用户889880消费50积分的请求,记录日志如下:
[0051]
{1,889880,-100,400,2023-07-04 21:58:51,true}
[0052]
{1,889880,-50,350,2023-07-04 21:59:00,true}
[0053]
5、当机房a恢复后,程序启动时先读取最后一条心跳日志获得最后心跳时间,计算
时差为t,则拉取机房b上t时间的积分消费日志,用机房a数据的当前余额逐条扣除跨机房标识为true的积分消费日志的消费金额,进行补扣成功即得到最终的余额,接着网关恢复机房a的路由。
[0054]
当机房a的故障恢复后,机房a的程序在2023-07-04 22:05:00启动,启动时先读取本地心跳日志,在步骤2中可以得知最后的心跳日志为2023-07-04 21:58:46,则拉取机房b上2023-07-04 21:58:46到2023-07-04 22:05:00这之前时间差为6分14秒的积分消费日志,合并2个机房的日志得到日志如下:
[0055]
{0,889880,-100,400,2023-07-04 21:58:46,false}
[0056]
{1,889880,-100,400,2023-07-04 21:58:51,true}
[0057]
{1,889880,-50,350,2023-07-04 21:59:00,true}
[0058]
已知用户889880在机房a的当前余额为400,逐条扣机房b的消费积分日志的消费金额,即获取机房编号=1并且跨积分标识=true的日志,那么用户889880的最新余额=400-100-50=250,更新回数据库,保证了数据的最终一致性。
[0059]
请参阅图3所示,本发明还提供了一种机房多活环境下积分系统实现数据一致性的系统,所述系统包括积分请求处理模块、心跳日志生成模块、日志存储模块、故障积分处理模块以及积分恢复模块;
[0060]
所述积分请求处理模块,通过网关接收积分消费的请求,将请求中用户编号与2取模得到机房编号n,添加机房编号n到积分消费的请求的请求头中,如果n等于0则请求转发到机房a的积分系统,如果n等于1则请求转发到机房b的积分系统;所述积分消费信息包括目标机房编号,用户编号,消费积分,剩余积分,时间,以及是否跨机房;则日志格式为{目标机房编号,用户编号,消费积分,剩余积分,时间,是否跨机房},其中是否跨机房的值为false或者true。
[0061]
假设当前有2个机房a和b,用0和1给他们编号,举例积分消费的接口地址是api.xxx.com/point/buy,网关收到889880这位用户消费100积分的积分消费的请求,地址如下api.xxx.com/point/buy?userid=889880&point=100,用用户编号userid与机房数量2进行取模,n=889880%2=0,添加机房编号n到请求头中,head["set"]=0,n等于0则表示这个请求是转发到机房a的积分系统,如果n等于1则请求转发到机房b的积分系统。要说明的是网关在机房a和机房b均有部署,无论哪个机房的网关收到请求,均会根据userid来对请求进行正确的转发。此举保证了有一半用户是始终访问机房a的积分系统,另一半用户是始终访问积分b的积分系统。
[0062]
所述心跳日志生成模块,每隔设定时间向指定目录记录当前时间,作为心跳日志的心跳时间;
[0063]
所述日志存储模块,收到网关转发的请求后,将积分消费信息按日志格式存储到日志文件中,并执行数据库的积分更新,同时机房a和机房b的数据库采取双向同步策略;
[0064]
所述故障积分处理模块,当机房a发生故障,机房a从网关路由上剔除,则n等于0的请求被转发向了机房b,此部分用户请求头里的机房编号n和当前服务器不同,那么把积分消费日志格式上的跨机房访问标识设为true;
[0065]
所述故障积分处理模块具体为:用户编号是双号的用户都是被网关转发到机房a的积分系统,用户编号是单号的用户都是被网关转发到机房b的积分系统,当机房在发生故
障时,机房会被从网关路由上剔除;假设机房a发生了故障,机房a从网关路由上被剔除,则n=0原本要转发向机房a的请求,由于机房a不可用,则也转发向了机房b;机房b的积分系统收到请求,从请求里得知请求头head["set"]=0,和机房b的编号1不一致,那么在积分消费日志格式上把跨机房访问标识设为true。
[0066]
假设机房a的积分消费日志如下:
[0067]
{0,889880,-100,400,2023-07-04 21:58:46,false}
[0068]
表示用户889880在2023-07-04 21:58:46消费完100积分后还剩余400积分,并且不存在跨机房请求。
[0069]
机房b在2023-07-04 21:58:51收到用户889880的100积分消费请求,记录的积分消费日志如下:
[0070]
{1,889880,-100,400,2023-07-04 21:58:51,true}
[0071]
由于机房a发生了故障,数据库中这条消费信息还未同步至机房b的数据库,所以机房b的数据库中用户889880的余额还是500,与机房a不一致。所以500-100得到剩余余额是400,并且由于存在跨机房访问,所以跨机房标识为true。
[0072]
接着在2023-07-04 21:59:00又收到用户889880消费50积分的请求,记录日志如下:
[0073]
{1,889880,-100,400,2023-07-04 21:58:51,true}
[0074]
{1,889880,-50,350,2023-07-04 21:59:00,true}
[0075]
所述积分恢复模块,当机房a恢复后,先读取最后一条心跳日志获得最后心跳时间,得到时差为t,则拉取机房b上t时间的积分消费日志,用机房a数据的当前余额逐条扣除跨机房标识为true的积分消费日志的消费金额,进行补扣成功即得到最终的余额,同时网关恢复机房a的路由。
[0076]
当机房a的故障恢复后,机房a的程序在2023-07-04 22:05:00启动,启动时先读取本地心跳日志,在步骤2中可以得知最后的心跳日志为2023-07-04 21:58:46,则拉取机房b上2023-07-04 21:58:46到2023-07-04 22:05:00这之前时间差为6分14秒的积分消费日志,合并2个机房的日志得到日志如下:
[0077]
{0,889880,-100,400,2023-07-04 21:58:46,false}
[0078]
{1,889880,-100,400,2023-07-04 21:58:51,true}
[0079]
{1,889880,-50,350,2023-07-04 21:59:00,true}
[0080]
已知用户889880在机房a的当前余额为400,逐条扣机房b的消费积分日志的消费金额,即获取机房编号=1并且跨积分标识=true的日志,那么用户889880的最新余额=400-100-50=250,更新回数据库,保证了数据的最终一致性。
[0081]
以上所述仅为本发明的较佳实施例,凡依本发明申请专利范围所做的均等变化与修饰,皆应属本发明的涵盖范围。

技术特征:
1.一种机房多活环境下积分系统实现数据一致性的方法,其特征在于:所述方法包括如下步骤:步骤s1、网关接收积分消费的请求,将请求中用户编号与机房数量进行取模得到机房编号n,添加机房编号n到请求头中,如果n等于0则请求转发到机房a的积分系统,如果n等于1则请求转发到机房b的积分系统;步骤s2、每隔设定时间向指定目录记录当前时间,作为心跳日志的心跳时间;步骤s3、收到网关转发的请求后,将积分消费信息按日志格式存储到日志文件中,并执行数据库的积分更新,同时机房a和机房b的数据库采取双向同步策略;步骤s4、当机房a发生故障,机房a从网关路由上剔除,则n等于0的请求被转发向了机房b,此部分用户请求头里的机房编号n和当前服务器不同,那么把积分消费日志格式上的跨机房访问标识设为true;步骤s5、当机房a恢复后,先读取最后一条心跳日志获得最后心跳时间,得到时差为t,则拉取机房b上t时间的积分消费日志,用机房a数据的当前余额逐条扣除跨机房标识为true的积分消费日志的消费金额,进行补扣成功即得到最终的余额,同时网关恢复机房a的路由。2.根据权利要求1所述的机房多活环境下积分系统实现数据一致性的方法,其特征在于:所述积分消费信息包括目标机房编号,用户编号,消费积分,剩余积分,时间,以及是否跨机房;则日志格式为{目标机房编号,用户编号,消费积分,剩余积分,时间,是否跨机房},其中是否跨机房的值为false或者true。3.根据权利要求1所述的机房多活环境下积分系统实现数据一致性的方法,其特征在于:步骤s4具体为:用户编号是双号的用户都是被网关转发到机房a的积分系统,用户编号是单号的用户都是被网关转发到机房b的积分系统,当机房在发生故障时,机房会被从网关路由上剔除;假设机房a发生了故障,机房a从网关路由上被剔除,则n=0原本要转发向机房a的请求,由于机房a不可用,则也转发向了机房b;机房b的积分系统收到请求,从请求里得知请求头head["set"]=0,和机房b的编号1不一致,那么在积分消费日志格式上把跨机房访问标识设为true。4.一种机房多活环境下积分系统实现数据一致性的系统,其特征在于:所述系统包括积分请求处理模块、心跳日志生成模块、日志存储模块、故障积分处理模块以及积分恢复模块;所述积分请求处理模块,通过网关接收积分消费的请求,将请求中用户编号与机房数量进行取模得到机房编号n,添加机房编号n到请求头中,如果n等于0则请求转发到机房a的积分系统,如果n等于1则请求转发到机房b的积分系统;所述心跳日志生成模块,每隔设定时间向指定目录记录当前时间,作为心跳日志的心跳时间;所述日志存储模块,收到网关转发的请求后,将积分消费信息按日志格式存储到日志文件中,并执行数据库的积分更新,同时机房a和机房b的数据库采取双向同步策略;所述故障积分处理模块,当机房a发生故障,机房a从网关路由上剔除,则n等于0的请求被转发向了机房b,此部分用户请求头里的机房编号n和当前服务器不同,那么把积分消费日志格式上的跨机房访问标识设为true;
所述积分恢复模块,当机房a恢复后,先读取最后一条心跳日志获得最后心跳时间,得到时差为t,则拉取机房b上t时间的积分消费日志,用机房a数据的当前余额逐条扣除跨机房标识为true的积分消费日志的消费金额,进行补扣成功即得到最终的余额,同时网关恢复机房a的路由。5.根据权利要求4所述的机房多活环境下积分系统实现数据一致性的系统,其特征在于:所述积分消费信息包括目标机房编号,用户编号,消费积分,剩余积分,时间,以及是否跨机房;则日志格式为{目标机房编号,用户编号,消费积分,剩余积分,时间,是否跨机房},其中是否跨机房的值为false或者true。6.根据权利要求4所述的机房多活环境下积分系统实现数据一致性的系统,其特征在于:所述故障积分处理模块具体为:用户编号是双号的用户都是被网关转发到机房a的积分系统,用户编号是单号的用户都是被网关转发到机房b的积分系统,当机房在发生故障时,机房会被从网关路由上剔除;假设机房a发生了故障,机房a从网关路由上被剔除,则n=0原本要转发向机房a的请求,由于机房a不可用,则也转发向了机房b;机房b的积分系统收到请求,从请求里得知请求头head["set"]=0,和机房b的编号1不一致,那么在积分消费日志格式上把跨机房访问标识设为true。

技术总结
本发明提供了机房多活环境下积分系统实现数据一致性的方法及系统,该方法为:步骤S1、网关接收积分消费的请求,将请求中用户编号与机房数量进行取模得到机房编号n,添加机房编号n到请求头中,如果n等于0则请求转发到机房A的积分系统,如果n等于1则请求转发到机房B的积分系统;步骤S2、每隔设定时间向指定目录记录当前时间,作为心跳日志的心跳时间;步骤S3、收到网关转发的请求后,将积分消费信息按日志格式存储到日志文件中,并执行数据库的积分更新;步骤S4、当机房A发生故障,进行积分处理;步骤S5、当机房A恢复后,进行补扣积分即得到最终的余额,同时网关恢复机房A的路由。本发明保证多活环境下积分系统的数据的一致性,提高数据的稳定性。的稳定性。的稳定性。


技术研发人员:刘德建 叶伟 李佳
受保护的技术使用者:福建天晴数码有限公司
技术研发日:2023.07.17
技术公布日:2023/10/11
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐