【具体实施方式】
为使本申请实施例的目的、技术方案和优点更加清楚,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
在介绍本申请方法流程之前,先介绍一种本申请应用场景的***架构,例如可以是后续实施例中涉及的预算***。如图1a所示,该***架构包括:主数据库10、备份数据库20、业务调用者30和核对装置40。
业务调用者30主要用于操作主数据库10中的业务数据,所述操作可以包括新增、修改、删除等。业务调用者30对主数据库10中的业务数据进行操作会产生流水记录和结果记录;同时,业务调用者30对主数据库10的操作是以数据库事务为单位进行的,每个数据库事务包括至少一个数据库操作,每个数据库事务都会产生对应的日志数据,用于记录该数据库事务所包括的数据库操作的操作详情与操作结果的对应关系。
备份数据库20用于对主数据库10进行备份,具体备份机制可采用现有技术,在此不再赘述。例如,主数据库10中的复制机制可以在秒级延迟之后将主数据库10中的变更以事务提交的顺序更新至备份数据库20中。
核对装置40是指具有对结果记录和流水记录进行核对需求的装置或***,用于在有核对需求时,根据主数据库10提供的数据库事务的日志数据,对结果记录和流水记录进行核对。该日志数据存储有相应数据库事务所包括的数据库操作的操作详情与操作结果的对应关系。例如,主数据库10可以采用replication协议将数据库事务的日志数据转换成核对装置40所能理解的格式,再将转换后的日志数据提供给核对装置40。replication协议的实现可以复用已有开源工具如canal实现。值得说明的是,这里的核对装置40具体可以是后续实施例中的数据记录核对装置。
图1b为本申请一实施例提供的数据记录核对方法的流程示意图。如图1b所示,该方法包括:
101、获取核对需求对应的目标数据库事务的日志数据,日志数据存储有目标数据库事务所包括的数据库操作的操作详情与操作结果的对应关系;
102、根据上述数据库操作的操作详情与操作结果的对应关系,确定待核对的结果记录对应的流水记录;
103、对上述待核对的结果记录和待核对的结果记录对应的流水记录进行核对。
在数据库应用场景中,当需要对结果记录和流水记录等进行核对时,就会产生核对需求,该核对需求用于指示对流水记录和结果记录进行核对,以便发现结果记录和流水记录是否能够对应上,通过该核对处理可以发现数据错误、以及业务***中向数据库***流水记录等程序代码的逻辑错误等。
要实现核对目的,首先需要确定待核对的结果记录以及与待核对的结果记录对应的流水记录,若待核对的结果记录与核对使用的流水记录不对应,则无法完成核对。但是,由于数据库中的结果记录和流水记录在不停的变化,尤其是结果记录会实时被刷新,这些情况都不利于找到与待核对的结果记录对应的流水记录。
针对该问题,本实施例获取核对需求对应的数据库事务的日志数据,该日志数据中存储有该数据库事务所包括的数据库操作的操作详情和操作结果的对应关系。为便于描述,将核对需求对应的数据库事务称为目标数据库事务。一般来说,数据库事务可能包括一个或多个数据库操作,每个数据库操作的操作详情对应一系列流水记录,整个数据库事务的操作结果对应一个结果记录,但是该结果记录会随着后续数据库事务的操作而发生变化。
上述目标数据库事务的日志数据包括了本次核对需求所需的有关信息,例如操作详情与操作结果的对应关系。根据该对应关系可以找到待核对的结果记录以及其对应的流水记录。
一种获取目标数据库事务的日志数据的实施方式包括:根据上述核对需求,确定待核对时间段;根据待核对时间段,确定目标时间段;获取在目标时间段内产生的数据库事务的日志数据作为目标数据库事务的日志数据。
例如,核对需求可以是对所指定的待核对时间段内产生的流水记录和结果记录进行核对,该待核对时间段可以是从业务开始到当前时间,也可以是任何一时间段,例如要求对2014年12月1日当天产生的流水记录和结果记录进行核对。基于此,可以直接从核对需求中获取待核对时间段。
又例如,核对需求可以是对指定的结果记录进行核对,则可以以从核对需求中获取待核对的结果记录,以起始结果记录对应的起始时间和当前结果记录对应的当前时间确定根区间,采用二分法对根区间进行处理,获得待核对的结果记录所在的时间段作为待核对时间段。例如,当前结果记录为30,起始结果为100,则核对需求可以是对结果记录为50时的情况进行核对。
进一步,可以直接将待核对时间段作为目标时间段,即获取整个待核对时间段内产生的数据库事务的日志数据作为目标数据库事务的日志数据。
或者,考虑到距离待核对的结果记录的产生时间指定时长,例如5分钟内的流水记录可能会出现与该结果记录不对应的情况,而5分钟之前的流水记录一般不会出现不对应的情况。基于此,可以获取从第一时间点到待核对时间段的终止点的时间间隔作为目标时间段,第一时间点是终止点之前且与终止点相距指定时间间隔的时间点。指定时间间隔可以是5分钟、3分钟、10分钟等等。
在一可选实施方式中,上述数据库事务的日志一般存储在主数据库上,所以可以从主数据库获取目标数据库事务的日志数据。除此之外,主数据库一般会将数据库事务的日志数据发送给备份数据库,以供备份数据库进行数据同步,当备份数据库同步结束后,将数据库事务的日志数据删除。也就是说,数据库事务的日志数据也可以从备份数据库上获取到。
具体的,数据记录核对装置可以向主数据库或备份数据库发送获取请求,以请求获取目标数据库事务的日志数据。例如,该获取请求可以携带有上述目标时间段的标识信息,用于指示需要获取在该目标时间段内产生的数据库事务的日志数据。主数据库或备份数据库接收获取请求,根据获取请求找到目标数据库事务的日志数据,并返回所获取的日志数据。数据记录核对装置接收主数据库或备份数据库根据获取请求返回的目标数据库事务的日志数据。
在获取目标数据库事务的日志数据后,可以根据目标数据库事务的日志数据中存储的数据库操作的操作详情与操作结果的对应关系,对数据库操作进行自平衡检测;当数据库操作通过自平衡检测后,从流水表中获取与数据库操作的操作详情对应的流水记录,作为待核对的结果记录对应的流水记录。
可选的,数据记录核对装置可以从备份数据库中获取流水表,以便于从流水表中获取待核对的结果记录对应的流水记录。一般来说,主数据库上产生数据库事务时,会以秒级同步到备份数据库,也就是说备份数据库上的流水表满足核对对时间延迟的需求,并且从备份数据库获取流水表,可以避免对主数据库性能的影响。
在确定待核对的结果记录对应的流水记录后,数据记录核对装置可以对待核对的结果记录和该结果记录对应的流水记录进行核对处理。
由上述可见,本实施例通过日志数据中存储的数据库操作的操作详情与操作结果的对应关系,可以找到与待核对的结果记录对应的流水记录,实现待核对的结果记录和流水记录之间的对应,因此可以完成两种记录的核对。
下面以预算***的对账需求为例,详细说明本申请的技术方案。
预算***包括主数据库和备份数据库;主数据库使用binlog文件存储数据库事务的日志数据;主数据库中流水表和余额表的变更以binlog事务增量的方式同步到备份数据库,除外之外,主数据库中余额表的变更也以binlog事务增量的方式同步给数据记录核对装置,以供该装置进行对账。数据记录核对装置针对binlog中的增量数据(这些增量数据包括了新增的余额变化和余额变化后的值)和备份数据库中拥有的基线数据进行对账。这种对账方式,相比每天运行一次的基于全量数据导入到数据仓库的部署,提高了实时性。
具体的,预算***包含两张表:
预算表(budget),用于记录余额,每条记录对应一个预算业务。本举例中以一个预算示例;这里的预算表相当于存储上述结果记录的表;
控制序列表(controlOrder),用于记录每一次预算扣减,假设一个budget扣减两次,产生两条controlOrder记录,这里的控制序列表相当于存储上述的流水记录的表。
一次预算扣减服务将对主数据库发起一个数据库事务,该数据库事务包含两条SQL语句:一个是对预算表更新余额字段,一个是在控制序列表中***一条记录。
假设预算初始余额为180元,两个调用者并发发起扣减请求,并发1扣减15元,并发2扣减20元。假设并发1先处理完,则两个并发处理完后,将产生两组事件:
第1组:预算表中记录的余额由180元变为165元;控制序列表中新增一条15元的记录co1;
第2组:预算表中记录的余额由165元变为145元;控制序列表中新增一条20元的记录co2。
每组事件作为原子单元(即一个数据库操作)存储到binlog文件中。与此同时可以有别的并发扣减请求正在处理中。
此时,若希望知道预算***是否因为代码缺陷或其他原因导致预算余额由180元变成165元时控制序列表中没有新增相应的记录或控制序列表中记录的金额不是15元。本实施例采用以下方式解决此问题:
并发2执行结束后,主数据库通过如replication协议转换模块对上述两组事件对应binlog文件进行格式转换后发送给数据记录核对装置,同时主数据库会在秒级延迟之后将变更以主库事务提交的顺序更新至备份数据库中,此时备份数据库中存储有以下信息:预算表中记录的余额145元、两条记录co1和co2。由于备份数据库的更新保持着主数据库发生的事务的原子性,所以不会出现145元余额对应控制序列表中一条记录的情况。
基于上述,数据记录核对装置从binlog文件中获取上述两组事件,根据事件中记录的信息发起自平衡检查:
第1组:预算表中记录的余额由180变至165,变化15;且能找到在控制序列表中对应的***事件且额度为15元;自平衡检查完成;
第2组:预算表中记录的余额由165变至145,变化20;且能找到本组在控制序列表中对应的***事件且额度为20元;自平衡检查完成;
完成自平衡检查后,再将事件组分别在备份数据库中找到对应的记录co1和co2,完成对账。
两个事件的变化值之和,即20+15=35,与初始余额180和待核对的余额145之差相同,对账平衡。
由于binlog在每次DB事务提交时产生,秒级同步到对账***,避免了基于数据仓库导入的大延迟,具有较高的实时性。
由于binlog事件以一次完整的DB事务为单位,事件中同时包含了流水和余额前后值的对应关系,避免了余额和流水对账的不一致问题,解决率流水和余额无法对账的问题。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本申请并不受所描述的动作顺序的限制,因为依据本申请,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本申请所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
图2为本申请一实施例提供的数据记录核对装置的结构示意图。如图2所示,该装置包括:获取模块21、确定模块22和核对模块23。
获取模块21,用于获取核对需求对应的目标数据库事务的日志数据,日志数据存储有目标数据库事务所包括的数据库操作的操作详情与操作结果的对应关系;
确定模块22,用于根据获取模块21获取的数据库操作的操作详情与操作结果的对应关系,确定待核对的结果记录对应的流水记录;
核对模块23,用于对确定模块22确定的待核对的结果记录和待核对的结果记录对应的流水记录进行核对处理。
在一可选实施方式中,获取模块21的一种实现结构包括:第一确定单元、第二确定单元和获取单元。
第一确定单元,用于根据核对需求,确定待核对时间段;
第二确定单元,用于根据待核对时间段,确定目标时间段;
获取单元,用于获取在目标时间段内产生的数据库事务的日志数据作为目标数据库事务的日志数据。
在一可选实施方式中,第一确定单元具体用于:
从核对需求中获取待核对时间段;或者
从核对需求中获取待核对的结果记录,以起始结果记录对应的起始时间和当前结果记录对应的当前时间确定根区间,采用二分法对根区间进行处理,获得待核对的结果记录所在的时间段作为待核对时间。
在一可选实施方式中,第二确定单元具体用于:
直接将待核对时间段作为目标时间段;或者
获取从第一时间点到待核对时间段的终止点的时间间隔作为目标时间段,第一时间点是终止点之前且与终止点相距指定时间间隔的时间点。
在一可选实施方式中,获取模块21具体用于:
向主数据库或备份数据库发送获取请求;
接收主数据库或备份数据库根据获取请求返回的目标数据库事务的日志数据。
在一可选实施方式中,确定模块22具体用于:
根据数据库操作的操作详情与操作结果的对应关系,对数据库操作进行自平衡检测;
当数据库操作通过自平衡检测后,从流水表中获取与数据库操作的操作详情对应的流水记录,作为待核对的结果记录对应的流水记录。
本实施例提供的数据记录核对装置,获取核对需求对应的目标数据库事务的日志数据,根据该日志数据存储的该目标数据库事物所包括的数据库操作的操作详情与操作结果的对应关系,确定待核对的结果记录对应的流水记录,对待核对的结果记录与该结果记录对应的流水记录进行核对处理。本实施例提供的数据记录核对装置通过日志数据中存储的数据库操作的操作详情与操作结果的对应关系,可以找到与待核对的结果记录对应的流水记录,实现待核对的结果记录和流水记录之间的对应,因此可以完成两种记录的核对。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的***,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的***,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或处理器(processor)执行本申请各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。