读写分离架构业务系统的强一致性查询方法、装置及系统转让专利

申请号 : CN202010627851.4

文献号 : CN111797121A

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王超谷俊陈元曦黄浩

申请人 : 中国工商银行股份有限公司

摘要 :

本发明提供了一种读写分离架构业务系统的强一致性查询方法、装置及系统,查询方法包括:将写入业务系统主库的待同步到备库的联机业务数据写入缓存;接收用户的查询请求;根据对业务系统的备库和缓存的待同步到备库的联机业务数据进行查询请求改写,从而查询生成强一致性的查询结果。本发明通过缓存待同步的数据,基于缓存数据实现由备库提供强一致性的查询结果,从而提升备库资源利用率,突破备库个数限制,从而实现通过增加备库的数量,显著提升整个联机交易系统对大规模并发访问的查询响应效率。

权利要求 :

1.一种读写分离架构业务系统的强一致性查询方法,其特征在于,所述的查询方法包括:将写入业务系统主库的待同步到备库的联机业务数据写入缓存;

接收用户的查询请求;

根据业务系统的备库和缓存的待同步到备库的联机业务数据,改写查询请求,从而进行查询生成强一致性查询结果。

2.如权利要求1所述的读写分离架构业务系统的强一致性查询方法,其特征在于,所述的将写入业务系统主库的待同步到备库的联机业务数据写入缓存包括:将所述的联机业务数据写入业务系统主库;

将所述写入业务系统主库的联机业务数据写入缓存并生成缓存数据的索引信息。

3.如权利要求2所述的读写分离架构业务系统的强一致性查询方法,其特征在于,所述的根据业务系统的备库和缓存的待同步到备库的联机业务数据,改写查询请求,从而进行查询生成强一致性查询结果包括:根据所述的查询请求确定缓存中的联机业务数据的索引信息;

根据确定的索引信息将对应的缓存中尚未向备库表完成同步的联机业务数据写入备库的外部表;

利用所述的外部表改写读备库的结构化查询语句;

利用改写后的读备库的结构化查询语句进行查询生成查询结果。

4.如权利要求3所述的读写分离架构业务系统的强一致性查询方法,其特征在于,所述的索引信息包括:全局事务数字编号、备库ID、同步状态、操作表名、操作类型及缓存key。

5.如权利要求1所述的读写分离架构业务系统的强一致性查询方法,其特征在于,所述的方法还包括:接收备库发送的已完成同步的联机业务数据的通知消息;

根据所述通知消息中确定业务系统中所有备库均完成该联机业务数据的同步,清理缓存中的该联机业务数据。

6.一种读写分离架构业务系统的强一致性查询装置,其特征在于,所述的装置包括:写模块,用于将写入业务系统主库的待同步到备库的联机业务数据写入缓存;

查询请求接收模块,用于接收用户的查询请求;

读模块,用于根据业务系统的备库和缓存的待同步到备库的联机业务数据,改写查询请求,从而进行查询生成强一致性查询结果。

7.如权利要求6所述的读写分离架构业务系统的强一致性查询装置,其特征在于,所述的写模块包括:主库写入单元,用于将所述的联机业务数据写入业务系统主库;

缓存处理单元,用于将所述写入业务系统主库的联机业务数据写入缓存并生成缓存数据的索引信息。

8.如权利要求7所述的读写分离架构业务系统的强一致性查询装置,其特征在于,所述的读模块包括:索引确定单元,用于根据所述的查询请求确定缓存中的联机业务数据的索引信息;

外部表写入单元,用于根据确定的索引信息将对应的缓存中尚未向备库表完成同步的联机业务数据写入备库的外部表;

语句改写单元,用于利用所述的外部表改写读备库的结构化查询语句;

查询单元,用于利用改写后的读备库的结构化查询语句进行查询生成查询结果。

9.如权利要求8所述的读写分离架构业务系统的强一致性查询装置,其特征在于,所述的索引信息包括:全局事务数字编号、备库ID、同步状态、操作表名、操作类型及缓存key。

10.如权利要求6所述的读写分离架构业务系统的强一致性查询装置,其特征在于,所述的装置还包括:同步消息接收模块,用于接收备库发送的完成同步的联机业务数据的通知消息;

备库状态判断模块,用于根据所述的通知消息判断业务系统中所有备库是否均完成该联机业务数据的同步;

清理模块,用于确定业务系统中所有备库均完成该联机业务数据的同步时,清理缓存中的该联机业务数据。

11.一种读写分离架构的业务系统,其特征在于,所述的系统包括:主库、备库、应用服务器及缓存服务器;其中,所述的应用服务器包括:

写模块,用于将写入业务系统主库的待同步到备库的联机业务数据写入所述缓存服务器;

查询请求接收模块,用于接收用户的查询请求;

读模块,用于根据业务系统的备库和缓存的待同步到备库的联机业务数据,改写查询请求,从而进行查询生成强一致性查询结果。

12.如权利要求11所述的读写分离架构的业务系统,其特征在于,所述的写模块包括:主库写入单元,用于将所述的联机业务数据写入业务系统主库;

缓存处理单元,用于将所述写入业务系统主库的联机业务数据写入缓存并生成缓存数据的索引信息。

13.如权利要求12所述的读写分离架构的业务系统,其特征在于,所述的读模块包括:索引确定单元,用于根据所述的查询请求确定缓存中的联机业务数据的索引信息;

外部表写入单元,用于根据确定的索引信息将对应的缓存中尚未向备库表完成同步的联机业务数据写入备库的外部表;

语句改写单元,用于利用所述的外部表改写读备库的结构化查询语句;

查询单元,用于利用改写后的读备库的结构化查询语句进行查询生成查询结果。

14.如权利要求13所述的读写分离架构的业务系统,其特征在于,所述的系统还包括:共享内存服务器,用于存储所述联机业务数据的索引信息。

15.如权利要求11所述的读写分离架构的业务系统,其特征在于,所述的系统还包括:

同步队列服务器,用于将写入业务系统主库的联机业务数据写入备库;

所述的备库包括:

同步消息发送模块,用于发送完成同步的联机业务数据的通知消息;

所述的应用服务器包括:

同步接收获取模块,用于接收备库发送的完成同步的联机业务数据的通知消息;

备库状态判断模块,用于根据所述的通知消息判断业务系统中所有备库是否均完成该联机业务数据的同步;

清理模块,用于确定业务系统中所有备库均完成该联机业务数据的同步时,清理缓存中的该联机业务数据。

16.如权利要求11所述的读写分离架构的业务系统,其特征在于,所述的系统包括:多个应用服务器、多个缓存服务器;

所述的多个应用服务器构成应用服务器集群;

所述的多个缓存服务器构成缓存服务器集群。

17.一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至5任一项所述方法。

18.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有执行权利要求1至5任一项所述方法的计算机程序。

说明书 :

读写分离架构业务系统的强一致性查询方法、装置及系统

技术领域

[0001] 本发明涉及数据库技术,具体的讲是一种读写分离架构的强一致性查询方法及装置。

背景技术

[0002] 当数据库的数据规模和并发访问量达到一定规模,需要通过scale out方式实现横向扩展。对于横向扩展后的各数据库服务器,分为share nothing体系和share everything体系两种体系。
[0003] share nothing体系即分布式数据库,如hbase、postgsql、hive、以及“mysql分库分表”等,该体系能支撑海量的数据,各数据库服务器分别存储数据的不同部分(分片),查询时通过前置服务器实现sql改写,将查询分解到各分片上执行,然后进行合并计算(如排序、聚合等),最后将合并后结果返回。该体系中hbase、postgsql、hive一般用于超大规模olap场景的大数据分析,但对oltp联机交易往往响应速度较低;“mysql分库分表”可以用于大规模oltp联机交易场景,但其实质是静态并发,各实例分别处理自身范围(比如按地区分库)的交易,一般不涉及基于全局数据(其他数据分片)的交易。
[0004] Share everything体系即不同数据库服务器拥有相同的数据,最典型例子即“oracle rac”和“mysql读写分离主备同步”。该体系的数据规模有限,其“有效”数据规模受限于单台数据库服务器所能管理的数据规模(其他均为副本)。但其将一部分查询分流到备库上执行提升查询效率,也无需修改sql,对用户的友好程度高。在一般联机访问的场景中,由于不会涉及太久远的历史数据,同时也会引入按时点汇总机制(如月末生成余额、报表等)作为后续增量更新的基础,因此,Share everything体系在oltp联机交易场景中得到较多使用。Share everything又分为物理共享和逻辑共享(同步)两大类,Oracle rac或oracle exdata是物理共享的代表,虽然技术效果好,但技术准入门槛较高(除底层集群软件、共享文件系统等专用软件外,还需依赖于光纤网络、磁盘机等物理设施);mysql主从同步、mongodb等数据库则是逻辑共享(同步)的代表,将数据从写(主)库同步到读(备)库,物理限制较小,适用面较广,但存在以下问题:
[0005] Share everything体系的读(备)库不适用于强一致性查询场景:由于主备库数据间同步需要时间,因此备库(读库)和主库(写库)间存在短暂不一致,能实现最终一致性,但无法实现强一致性。对于联机交易查询系统,用户最佳期望是获得强一致性的查询结果,延时确认(如订票)或给出老状态(如互联网搜索引擎)只能是用户无奈做出妥协的特殊场景。因此,一个联机查询系统,应尽可能向余额类查询等强一致性场景看齐。
[0006] 读(备)库资源不能得到充分利用:对于强一致性查询要求,事实上只能在主库执行。由于用户对联机查询系统的最佳期望是获得强一致性的查询结果,这导致备库能执行的查询数量有限,只有可以不要求主备库数据强一致性的查询才可分流到备库,但这严重依赖于用户可接受妥协的程度。因此,读(备)库的资源无法充分利用,查询读写分离的效果不佳,“查询和热备并重”的期望无法实现,退化成“热备为主,查询为辅”。
[0007] 写(主)库到读(备)库的同步存在瓶颈,可使用的读(备)库个数受限:主备库同步间存在瓶颈,如对多个备库进行同步,则主库的网卡将成为瓶颈,备库的个数受限,影响了读写分离结构的进一步扩展。相对而言,本问题被“读(备)库资源不能得到充分利用”这个问题所掩盖,但如果能解决“读(备)库不适用于强一致性查询场景”问题,导致读(备)库资源能被充分利用,则该问题也将成为亟待解决的问题之一。

发明内容

[0008] 为了提升对大规模并发访问的查询响应效率,本发明提供了一种读写分离架构业务系统的强一致性查询方法,包括:
[0009] 将写入业务系统主库的待同步到备库的联机业务数据写入缓存;
[0010] 接收用户的查询请求;
[0011] 根据业务系统的备库和缓存的待同步到备库的联机业务数据,改写查询请求,从而进行查询生成强一致性查询结果。
[0012] 本发明实施例中,所述的将写入业务系统主库的待同步到备库的联机业务数据写入缓存包括:
[0013] 将所述的联机业务数据写入业务系统主库;
[0014] 将所述写入业务系统主库的联机业务数据写入缓存并生成缓存数据的索引信息。
[0015] 本发明实施例中,所述的根据业务系统的备库和缓存的待同步到备库的联机业务数据,改写查询请求,从而进行查询生成强一致性查询结果包括:
[0016] 根据所述的查询请求确定缓存中的联机业务数据的索引信息;
[0017] 根据确定的索引信息将对应的缓存中尚未向备库表完成同步的联机业务数据写入备库的外部表;
[0018] 利用所述的外部表改写读备库的结构化查询语句;
[0019] 利用改写后的读备库的结构化查询语句进行查询生成查询结果。
[0020] 本发明实施例中,所述的索引信息包括:全局事务数字编号、备库ID、同步状态、操作表名、操作类型及缓存key。
[0021] 本发明实施例中,所述的方法还包括:
[0022] 获取备库发送的完成同步的联机业务数据的通知消息;
[0023] 根据所述通知消息中确定业务系统中所有备库均完成该联机业务数据的同步,清理缓存中的该联机业务数据。
[0024] 同时,本发明还提供一种读写分离架构业务系统的强一致性查询装置,包括:
[0025] 写模块,用于将写入业务系统主库的待同步到备库的联机业务数据进写入缓存;
[0026] 查询请求接收模块,用于接收用户的查询请求;
[0027] 读模块,用于根据业务系统的备库和缓存的待同步到备库的联机业务数据,改写查询请求,从而进行查询生成强一致性查询结果。
[0028] 本发明实施例中,所述的写模块包括:
[0029] 主库写入单元,用于将所述的联机业务数据写入业务系统主库;
[0030] 缓存处理单元,用于将所述写入业务系统主库的联机业务数据写入缓存并生成缓存数据的索引信息。
[0031] 本发明实施例中,所述的读模块包括:
[0032] 索引确定单元,用于根据所述的查询请求确定缓存中的联机业务数据的索引信息;
[0033] 外部表写入单元,用于根据确定的索引信息将对应的缓存中尚未向备库表完成同步的联机业务数据写入备库的外部表;
[0034] 语句改写单元,用于利用所述的外部表改写读备库的结构化查询语句;
[0035] 查询单元,用于利用改写后的读备库的结构化查询语句进行查询生成查询结果。
[0036] 本发明实施例中,所述的索引信息包括:全局事务数字编号、备库ID、同步状态、操作表名、操作类型及缓存key。
[0037] 本发明实施例中,所述的装置还包括:
[0038] 同步消息获取模块,用于获取备库发送的完成同步的联机业务数据的通知消息;
[0039] 清理模块,用于根据所述通知消息中确定业务系统中所有备库均完成该联机业务数据的同步时,清理缓存中的该联机业务数据。
[0040] 进一步,本发明还提供一种读写分离架构的业务系统,包括:主库、备库、应用服务器及缓存服务器;其中,
[0041] 所述的应用服务器包括:
[0042] 写模块,用于将写入业务系统主库的待同步到备库的联机业务数据写入所述缓存服务器;
[0043] 查询请求接收模块,用于接收用户的查询请求;
[0044] 读模块,用于根据业务系统的备库和缓存的待同步到备库的联机业务数据,改写查询请求,从而进行查询生成强一致性查询结果。
[0045] 本发明实施例中,所述的写模块包括:
[0046] 主库写入单元,用于将所述的联机业务数据写入业务系统主库;
[0047] 缓存处理单元,用于将所述写入业务系统主库的联机业务数据写入缓存并生成缓存数据的索引信息。
[0048] 本发明实施例中,所述的读模块包括:
[0049] 索引确定单元,用于根据所述的查询请求确定缓存中的联机业务数据的索引信息;
[0050] 外部表写入单元,用于根据确定的索引信息将对应的缓存中尚未向备库表完成同步的联机业务数据写入备库的外部表;
[0051] 语句改写单元,用于利用所述的外部表改写读备库的结构化查询语句;
[0052] 查询单元,用于利用改写后的读备库的结构化查询语句进行查询生成查询结果。
[0053] 本发明实施例中,所述的系统还包括:
[0054] 共享内存服务器,用于存储所述联机业务数据的索引信息。
[0055] 本发明实施例中,所述的系统还包括:
[0056] 同步队列服务器,用于将写入业务系统主库的联机业务数据写入备库;
[0057] 所述的备库包括:
[0058] 同步消息发送模块,用于发送完成同步的联机业务数据的通知消息;
[0059] 所述的应用服务器包括:
[0060] 同步接收获取模块,用于接收备库发送的完成同步的联机业务数据的通知消息;
[0061] 备库状态判断模块,用于根据所述的通知消息判断业务系统中所有备库是否均完成该联机业务数据的同步;
[0062] 清理模块,用于确定业务系统中所有备库均完成该联机业务数据的同步时,清理缓存中的该联机业务数据。
[0063] 本发明实施例中,系统包括:多个应用服务器、多个缓存服务器;
[0064] 所述的多个应用服务器构成应用服务器集群;
[0065] 所述的多个缓存服务器构成缓存服务器集群。
[0066] 同时,本发明还提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现上述方法。
[0067] 同时,本发明还提供一种计算机可读存储介质,计算机可读存储介质存储有执行上述方法的计算机程序。
[0068] 本发明通过缓存待同步的数据,基于缓存数据实现由备库提供强一致性的查询结果,从而提升备库资源利用率,突破备库个数限制,从而实现通过增加备库的数量,显著提升整个联机交易系统对大规模并发访问的查询响应效率。
[0069] 为让本发明的上述和其他目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附图式,作详细说明如下。

附图说明

[0070] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0071] 图1为本发明公开的读写分离架构业务系统的强一致性查询方法的流程图;
[0072] 图2为本发明公开的读写分离架构业务系统的强一致性查询装置的框图;
[0073] 图3为本发明公开的系统的框图;
[0074] 图4为本发明实施例公开的一种读写分离强一致性查询系统的系统结构图;
[0075] 图5为本发明实施例中的联机写交易时应用服务器写模块的工作流程图;
[0076] 图6为本发明实施例中的联机读交易时应用服务器读模块的工作流程图;
[0077] 图7为本发明实施例中的读(备)库上的同步模块的工作流程图;
[0078] 图8为本发明实施例中的应用服务器的“缓存清理”的工作流程图;
[0079] 图9为本发明实施例中系统在批量时工作流程;
[0080] 图10为本发明实施例中公开的电子设备的框图。

具体实施方式

[0081] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0082] 读写分离交易系统中,每日联机交易的记录在数据库中整体比例不高,数据库中大部分为历史数据,每日新增记录中又包含联机和批量两部分。同时,联机交易数据由于同步问题也只是写主库和读备库间暂时不一致。这些“暂态”数据就是备库使用范围受到限制的主要原因。因此,如能找到一种联机交易场景中读写分离架构的强一致性查询方法及系统,将能显著提升备库资源利用率,突破读备库个数限制,从而实现通过增加备库的数量(scale out),显著提升整个联机交易系统对大规模并发访问的查询响应效率。
[0083] 如图1所示,本发明提供一种读写分离架构业务系统的强一致性查询方法,该方法包括:
[0084] 步骤S101,将写入业务系统主库的待同步到备库的联机业务数据写入缓存;
[0085] 步骤S102,接收用户的查询请求;
[0086] 步骤S103,根据业务系统的备库和缓存的待同步到备库的联机业务数据,改写查询请求,从而进行查询生成强一致性查询结果。
[0087] 本发明公开的读写分离架构业务系统的强一致性查询方法,利用缓存对待同步的联机交易业务数据进行缓存,基于缓存和备库提供查询,保证各读库也能基于最新数据对外进行服务,从而保证整个读写分离集群的数据一致性。
[0088] 本发明实施例中,步骤S101中将写入业务系统主库的待同步到备库的联机业务数据写入缓存包括:
[0089] 将联机业务数据写入业务系统主库;
[0090] 将所述写入业务系统主库的联机业务数据写入缓存并生成缓存数据的索引信息。
[0091] 即将联机业务数据写入主库的同时进行缓存,并生成缓存数据的索引数据,利用生成的索引信息以记录缓存的待同步的联机数据的信息,利用索引信息记录未同步完的记录。
[0092] 本发明实施例中,所述的根据业务系统的备库和缓存的待同步到备库的联机业务数据,改写查询请求,从而进行查询生成强一致性查询结果包括:
[0093] 根据所述的查询请求确定缓存中的联机业务数据的索引信息;
[0094] 根据确定的索引信息将对应的缓存中联机业务数据(尚未向备库表完成同步)写入备库的外部表;
[0095] 利用所述的外部表改写读备库的结构化查询语句;
[0096] 利用改写后的读备库的结构化查询语句进行查询生成查询结果。
[0097] 即本发明一实施方式中,利用缓存的索引信息找到该备库未同步完的记录,写入读(备)库的外部表,利用外部表改写读备库的结构化查询语句,改写交易固化联机结构化查询语句,用改写后的读备库的结构化查询语句进行查询生成查询结果。
[0098] 本发明涉及数据库领域的使用读写分离架构的应用,通过缓存待同步的数据,基于缓存数据实现由读(备)库提供强一致性的查询结果,从而提升读(备)库资源利用率,突破读(备)库个数限制,从而实现通过增加读(备)库的数量(scale out),显著提升整个联机交易系统对大规模并发访问的查询响应效率。对于业务系统中联机交易数据,在写库和各读库同步期间,对联机交易数据进行缓存,保证各读库也能基于最新数据对外进行服务,从而保证整个读写分离集群的数据一致性,结合读写分离架构系统的批量程序的读写库全覆盖机制,实现充分利用备库的资源提升整个读写分离集群的服务效率。其他场景和数据库类型不在适用范围内。
[0099] 同时,本发明还提供一种读写分离架构业务系统的强一致性查询装置,如图2所示,包括:
[0100] 写模块201,用于将写入业务系统主库的待同步到备库的联机业务数据进写入缓存;
[0101] 查询请求接收模块202,用于接收用户的查询请求;
[0102] 读模块203,用于根据业务系统的备库和缓存的待同步到备库的联机业务数据,改写查询请求,从而进行查询生成强一致性查询结果。
[0103] 本发明实施例中,写模块201包括:
[0104] 主库写入单元,用于将所述的联机业务数据写入业务系统主库;
[0105] 缓存处理单元,用于将所述写入业务系统主库的联机业务数据写入缓存并生成缓存数据的索引信息。
[0106] 本发明实施例中,读模块203包括:
[0107] 索引确定单元,用于根据查询请求确定缓存中的联机业务数据的索引信息;
[0108] 外部表写入单元,用于根据确定的索引信息将对应的缓存中联机业务数据(尚未向备库表完成同步)写入备库的外部表;
[0109] 语句改写单元,用于利用所述的外部表改写读备库的结构化查询语句;
[0110] 查询单元,用于利用改写后的读备库的结构化查询语句进行查询生成查询结果。
[0111] 本发明实施例中,所述的装置还包括:
[0112] 同步消息获取模块,用于获取备库发送的完成同步的联机业务数据的通知消息;
[0113] 清理模块,用于根据所述通知消息中确定业务系统中所有备库均完成该联机业务数据的同步时,清理缓存中的该联机业务数据。
[0114] 进一步,本发明还提供一种读写分离架构的业务系统,如图3所示,该系统包括:主库301、备库302、应用服务器303及缓存服务器304;其中,
[0115] 应用服务器303包括:
[0116] 写模块,用于将写入业务系统主库的待同步到备库的联机业务数据写入所述缓存服务器;
[0117] 查询请求接收模块,用于接收用户的查询请求;
[0118] 读模块,用于根据业务系统的备库和缓存的待同步到备库的联机业务数据,改写查询请求,从而进行查询生成强一致性查询结果。
[0119] 本发明实施例中,系统还包括:
[0120] 共享内存服务器,用于存储所述联机业务数据的索引信息。
[0121] 本发明实施例中,所述的系统还包括:
[0122] 同步队列服务器,用于将写入业务系统主库的联机业务数据写入备库;
[0123] 所述的备库包括:
[0124] 同步消息发送模块,用于发送完成同步的联机业务数据的通知消息;
[0125] 所述的应用服务器包括:
[0126] 同步接收获取模块,用于接收备库发送的完成同步的联机业务数据的通知消息;
[0127] 备库状态判断模块,用于根据所述的通知消息判断业务系统中所有备库是否均完成该联机业务数据的同步;
[0128] 清理模块,用于确定业务系统中所有备库均完成该联机业务数据的同步时,清理缓存中的该联机业务数据。
[0129] 本发明实施例中,系统包括:多个应用服务器、多个缓存服务器;
[0130] 所述的多个应用服务器构成应用服务器集群;
[0131] 所述的多个缓存服务器构成缓存服务器集群。
[0132] 下面结合一具体的实施例对本发明的技术方案作进一步详细说明。
[0133] 图4是本实施例公开的读写分离强一致性查询系统的系统结构图。其中包括:应用服务器集群1,由多个应用服务器j构成,(j)|1≤j≤J,缓存服务器集群2,共享内存数据库3,写(主)数据库4,同步队列服务器集群5,读(备)数据库(i)6,(i)|1≤i≤I,批量调度服务器7,写联机请求客户端8,读联机请求客户端9。其中:
[0134] A)写联机请求客户端8和读联机请求客户端9通过负载均衡装置连接到应用服务器集群1(一般根据应用服务器的连接个数进行分配)。
[0135] B)在应用服务器集群的应用服务器j(j)|1≤j≤J内部分为写模块、读模块和缓存清理模块。本实施例中,同步队列服务器集群5的数据仅限联机交易数据,因此,由应用服务器j(j)|1≤j≤J的写模块写入,而非由写(主)库上系统级库间复制工具写入。
[0136] C)在读(备)库上包含了同步模块。
[0137] D)批量调度服务器7负责发起批量计算,保证每日联机交易同步前写(主)库和所有读(备)库具有相同的起始“基线”。
[0138] 本实施例提供的用于联机交易系统的读写分离集群,提供一种能实现强一致性查询的辅助系统,提升读(备)库资源利用率,突破读(备)库个数限制,从而实现通过增加读(备)库的数量(scale out),显著提升整个联机交易系统对大规模并发访问的查询响应效率。其中,通过缓存和外部表来保存尚在同步中的新写入数据,通过改写sql将“外部表”和“读(备)库中原有表”合成“强一致性查询版本读sql”,提交读(备)库执行,从而形成强制一致性查询结果。
[0139] 本实施例提供的用于联机交易系统的读写分离集群,其中,
[0140] 1)“读”仅限于联机查询场景而非灵活查询场景,即所提交的读sql是“固定”sql。“固定”sql中可包含变量,其含义是指“sql涉及的“表/字段/关联条件/筛选条件”在版本投产后维持不变(直到下一轮版本投产)。与“固定”sql相反的概念是“灵活查询”,即提交包含任意“表/字段/关联条件/筛选条件”的sql。这些固定的读sql可预先规划,使之便于改写以容纳“外部表”的数据(即尚在同步中的新写入数据),从而获得强制一致性查询结果。
[0141] 2)联机交易系统如涉及orm框架,则需采用直接提交sql的形式,而非自动生成sql或预先配置sql。原因是本方法涉及sql改写,并需要提交改写后的sql供读(备)库执行。常见orm框架如mybatis、hibernate等均支持此功能。
[0142] 本发明实施例的核心是通过缓存待同步的数据,以及基于缓存数据的sql改写,实现由读(备)库提供强一致性的查询结果,从而提升读(备)库资源利用率,突破读(备)库个数限制,从而实现通过增加读(备)库的数量(scale out),显著提升整个联机交易系统对大规模并发访问的查询响应效率。
[0143] 本发明的总体思路如下:
[0144] A)将批量和联机分开,写(主)库和读(备)库之间仅同步联机交易数据;批量数据则同时在“写(主)库、以及完成了联机交易同步的各读(备)库”上执行,批量安排在凌晨低谷期间执行,形成第二日所有读写库上联机交易查询的基准点。
[0145] B)联机交易按读写类型实现服务分工:
[0146] a.联机写交易仅写入写(主)库
[0147] b.联机读(查询)交易在非批量期间由各完成批量的读(备)库提供,通过缓存待同步的数据,以及基于缓存数据的sql改写,由读(备)库提供强一致性的查询结果;批量期间发生的查询限制在写(主)库上执行以保证强一致性。
[0148] 本实施例中,对于由读(备)库提供强一致性的查询结果,其核心思想如下:
[0149] 由应用服务器的写模块执行如下操作:
[0150] 获取联机交易dml(数据操纵语言,Data Manipulation Language)对应的“新写入数据”(即待同步到备库的数据),并将其写入到缓存(包括:表名、操作类型、各字段值、发生时间、全局事务数字编号),其中:
[0151] 本实施例中,全局事务数字编号统一从共享内存数据库3获得。
[0152] 其它信息(如表名、操作类型、各字段值、发生时间等)通过数据库主库,即主(写)数据库的data change nofitication机制(数据库所提供的api类)获取。在现有的读写分离架构的业务系统中,联机交易的写sql(即dml操作)是固定sql。因此,事先可梳理每个菜单/按钮对应功能的写sql,确定写sql修改涉及的表名(写事务中可能涉及多张表),将这些表作为data change nofitication类注册时登记的监听对象,在提交写sql后获取返回结果。写sql和data change nofitication类监听一般不属于同一个线程,需要通过多线程协同工作机制进行协调。
[0153] 本发明实施例中,将写入业务系统主库的联机业务数据写入缓存的同时生成缓存数据的索引信息,该索引信息包括:全局事务数字编号、备库ID、同步状态、操作表名、操作类型及缓存key,利用索引信息记录缓存中的联机数据的状态。
[0154] 本发明实施例中,以登记表存储索引信息,即在共享内存数据库建立登记表,在登记表中登记对应写入待同步数据的全局事务数字编号、备库id、操作类型、待同步数据到各备库的同步状态、以及各备库上拟转换的外部表名称。即本发明实施例中索引信息同步状态为待同步数据到各备库的同步状态。本实施例中,每个备库有一条单独的登记表索引信息记录。
[0155] 部署异步线程,从缓存中获取对应的“新写入数据”,写入同步队列服务器,本发明实施例中,用kafka实现所述同步队列服务器。
[0156] 2)应用服务器的读模块:
[0157] 在版本投产前,推荐合理规划联机交易系统中浏览器或web页面上菜单/按钮对应的“读sql”使之便于读模块的改写,使其符合以下要求:
[0158] 将sql中表间关联条件和表筛选条件分开,推荐分别使用join和where实现。如果两种条件均使用where,则需分为两层where,内层sql中包含“表及其where筛选条件”,外层则包含where表间关联条件。
[0159] 将内层的“表及其where筛选条件”写成“inline结果集”的形式,便于后续改写。
[0160] 选定某个读(备)库后,从缓存中找到该读(备)库未同步完的记录,写入读(备)库的外部表,外部表名即共享内存数据库“登记表”中对应记录“拟转换的外部表名称”。
[0161] 将原sql改写为包含外部表的新sql,即将“读(备)库表”和“外部表”分别按选择条件形成结果集,再做union all,最后根据主键通过全局事务数字编号进行排序,选出最新一条形成所形成的最终结果集,形成“强一致性查询版本的读sql”。
[0162] 将改写后新sql(“强一致性查询版本的读sql”)提交给读(备)库执行,获得强一致性查询结果反馈给读请求发起方。
[0163] 3)读(备)库上的同步模块
[0164] 各读(备)库上同步模块定时从同步队列服务器拉取“新写入数据”,写入所在读(备)库。
[0165] 完成同步后通知“应用服务器的缓存清理模块”,请其根据这批“新写入数据”的“全局事务数字编号”,将共享内存数据库“登记表”中对应记录的“同步状态”更新为“完成”。
[0166] 4)应用服务器的缓存清理模块
[0167] 负责接收各备库上数据库同步模块的全局事务同步完成通知,并更新共享内存数据库表中对应记录;
[0168] 定时启动扫描,如判断共享内存数据库中某个全局事务对应所有记录的同步状态均为“完成”,则清理缓存中该全局事务的所有记录,保证缓存不会超出上限。
[0169] 图5是本实施例公开的系统中发生“联机写交易”时应用服务器写模块的工作流程图。其中,步骤0201~0207、步骤0208~0209这两者可并发执行。
[0170] 步骤0201:写联机请求客户端8提交写入请求给应用服务器集(j);
[0171] 写联机请求客户端提交“写入请求及其参数”,经过负载均衡服务器传输给应用服务器集群1。其中,负载均衡服务器按预设的负载均衡算法,将请求路由到应用服务器集群1的一应用服务器(j),业界常用的负载均衡算法包括:轮询、各应用服务器的连接个数等,可根据需要选择。
[0172] 步骤0202:应用服务器(j)提交写sql;
[0173] 应用服务器(j)根据自身配置,将写请求及其参数转换为写入sql,提交给写(主)数据库4执行。这种转换即orm(对象关系映射),常见的框架有mybaits、hibernate、jpa等,可根据需要选择。
[0174] 步骤0203:应用服务器(j)获取写入sql的行记录;
[0175] 通过data change notification(dcn)机制,应用服务器可获取写入sql对应表的行信息(各字段值)、总记录数,并计算获得总容量(写入sql如涉及多个表,则分别获取)。各种数据库有专用的Data change nofitication机制,例如oralce的cqn/ocn(11g以上)或dcn(10g以上),sqlserver的sqldependcy等。其实现方式均建议通过等待方式实现(如java基于wait+notify的多线程间等待),以获取全量的信息。
[0176] 步骤0204:应用服务器(j)获取本写请求的全局事务数字编号;
[0177] 即使该写入操作涉及多张表,也只获得一个全局事务数字编号。如果全系统只有一台写(主)数据库4,实际上可使用写请求在写(主)数据库4的事务编号;但考虑到未来扩展,应用服务器可从共享内存数据库3通过序列号(即全局事务数字编号)形式,获取本写请求的全局事务数字编号。为与步骤0205兼容,该数字编号需要使用整数。全局数据库可按需使用h2数据库等产品。
[0178] 步骤0205:应用服务器(j)在共享内存数据库3“登记表”中插入对应记录;
[0179] 本发明实施例中,利用共享内存数据库3存储的“登记表”结构如表1所示。每个(“全局事务数字编号”,备库id,操作表名,操作类型)有一行记录。
[0180] 表1:登记表
[0181]
[0182]
[0183] 本实施例中,关于表1说明如下:
[0184] 1.对于该表,会事先(在所有“联机写交易”发生之前)插入一批记录作为不删除的初始记录,用于后续的备库选择sql使用。这批记录的主键(“全局事务数字编号”,备库id,操作表名)中“全局事务编号”为全零;“备库id”和“操作表名”的组合为“所有备库id”*“写sql中所有联机交易表名”的组合;同步状态为3(不涉及)。这批初始记录是为了后续sql查询方便而引入。
[0185] 2.为保证一致性,本步骤应和下一步(步骤0206)合成一个事务提交(如利用spring jta控制),因此,本步骤的insert语句结束后还不能提交,需待步骤0206完成后才能执行共享内存数据库3的事务提交。
[0186] 步骤0206:应用服务器(j)将写入sql的行信息(各字段值)、全局事务数字编号等信息写入缓存服务器集群2;
[0187] 本发明一实施例中,考虑缓存服务器的高可用性和性能,建议使用redis作为缓存服务器集群2;考虑到相关信息的准队列化特性(先入先出,一般越早写入缓存服务器集群2的信息将越早被完成主备库间同步,即越早被清理),宜使用redis的stored set进行存储。
[0188] 具体的,Stored set的写入名令为:ZADD key score member[score][member],其中key=“写入数据库完整实例名@表名@操作类型@发生时间(即启动写入缓存服务器集群2的时间)”,score为步骤0204获得的“全局事务数字编号”,member为写入sql中一行记录所有字段的连接(分隔符可设为“@”)。
[0189] 例如,写入数据库为192.168.0.1:1521/test,对表A执行insert三行记录(a,1)(b,2)(c,3),发生时间(即启动写入缓存服务器集群2的时间)为yyyymmdd hh24:mi:ss.ff6;全局事务编号为1111222233334444,则redis缓存服务器集群2的写入命令为:ZADD 
192.168.0.1:1521/test@A@INSERT@yyyymmdd hh24:mi:ss.ff6 1111222233334444a@1 
1111222233334444b@2 1111222233334444c@3。
[0190] 步骤0207:应用服务器(j)向写联机请求客户端8返回“写入成功”标志。如果需要返回写入记录,则可将获取自步骤0203中sql的行信息,按格式要求转换后返回。
[0191] 步骤0203~0207的具体实现举例:
[0192] 以oracle cqn/ocn(continuous query notification的object change notification)为例,基于java的写请求service类的main函数实现过程如下(其重点是利用oracle ocn实现步骤0203):
[0193] Step1):用oracle connect对象来注册Database Change Registration对象dcr,该dcr对象被关联一个listener对象(监听器类implemnets Database Change Listener接口)、一个oracle statement对象以及一批表的查询语句。
[0194] Step1.1):listener对象(监听器类)是独立的线程执行,负责执行“步骤0203”需要计算的内容(如sql对应某张表的行各字段值、总记录数,总容量等),并与“service类对象所在主线程”一起完成多线程间控制权交接、以及多线程间信息传递。其中,service类对象本身可作为多线程间控制权交接时synchronized的监控对象、以及notify/wait的发起方;service类中可定义一个concurrentHashmap类型的属性用于多线程间信息(“步骤0203”需要计算内容)传递。
[0195] listener对象的核心是onDatabaseChangeNotification函数。listener对象初始化时接收service类对象,在onDatabaseChangeNotification中先完成“步骤0203”需要计算内容,再将计算结果写入service类对象的concurrentHashmap属性(多线程对象间信息传递/数据共享),最后使用“synchronized(sevice类对象){sevice类对象.notify();}”将控制权交回给service类对象main函数所在主线程。
[0196] Step1.2)oracle statement对象通过((oracle.jdbc.OracleStatement)statement对象).setDatabaseChangeRegistration(dcr)完成关联。
[0197] Step1.3)使用“Step1.2)”中完成关联的oracle statement对象,执行若干查询语句,形式为:ResultSet rs=oracle statement对象.executeQuery("select*from表名where某个字段='1'")。
[0198] 其中,表名为联机交易系统中写请求dml所涉及表。由于联机交易系统的dml固定,可预先明确每个写请求对应的表(如果是存储过程或多句sql形成的事务,则可能1个写请求有多个表)”。所有executeQuery完成后执行ResultSet对象.close()和oracle statement对象.close();
[0199] Step2):提交synchronized(this)代码段,其中先执行实际的dml语句,最后通过“this.wait();”将主线程控制权交接给“Step1.1)”中listener对象的onDatabaseChangeNotification函数,供其计算步骤0203所需内容并返回,详见“Step1.1)”。说明:这里的this即service类对象。
[0200] Step3):在synchronized(this)代码段之后,可利用service类对象的concurrentHashmap属性中数据执行其他所需步骤,如步骤0204~步骤0207,完成全部写的过程。
[0201] Step4):重新连接oracle,利用“新连接.unregisterDatabaseChangeNotification(DatabaseChangeRegistration对象dcr);”实现解除oracle cqn/ocn的注册。
[0202] 以下步骤0208~步骤0209用于在后台实现“队列同步”,可步骤独立的线程执行,与以上步骤0201~步骤0207并发执行。
[0203] 步骤0208:应用服务器(j)定期查找共享内存数据库3“登记表”中未开启同步的全局事务数字编号。本实施例中,查询语句为:
[0204]
[0205]
[0206] 为避免批量时间联机写交易的影响,需在共享内存数据库3中部署“开关表”,供批量调度服务器7在批量期间关闭“批量期间联机交易开关”,在写(主)数据库4完成批量后开启。步骤0208定期执行sql的前提条件为“开关表”中“批量期间联机写交易同步开关”=1。“批量期间联机交易开关表”如表2所示
[0207] 表2
[0208]
[0209] 步骤0209:应用服务器(j)定期从缓存服务器集群2中获取待同步的“写入sql的行信息”,并按队列消息格式写入同步队列服务器集群5(推荐为kafka队列)。
[0210] 假设从步骤0207获取的未开启同步的全局事务数字编号为1111222233334444,则从redis中获取信息的方法为ZREVRANGE key 0-1[WITHSCORES];反馈结果为多行的score member,其中score为步骤0204获得的“全局事务数字编号”,member为写入sql中一行记录所有字段的连接(分隔符设为“@”)。
[0211] 写入kafka消息队列时,消息key为“备库id+操作表名+操作类型+score(“全局事务数字编号”)”,消息value为所有member(每个member为sql中一行记录所有字段的连接,分隔符设为“@”)。
[0212] 图6是本系统中发生联机读交易时应用服务器读模块的工作流程图。
[0213] 步骤0301:读联机请求客户端9提交读请求给应用服务器(j):读联机请求客户端提交“读入请求及其参数”,经过负载均衡服务器传输给应用服务器(j)。其中,负载均衡服务器按某种算法,将请求路由到某台应用服务器,业界常用的算法包括轮询、各应用服务器的连接个数等,可根据需要选择。
[0214] 步骤0302:应用服务器(j)获取“读取sqltext”、“读请求类型编号”、“查询表名清单”和“读请求编号”:。其中:应用服务器(j)根据自身orm框架中定制的映射关系,将“读请求”转换为“读请求类型编号”,再根据“读请求类型编号”查询共享内存数据库3中“读取sql和表名对应关系表”,获取“读取sqlid”和“查询表名清单”,并将“查询表名清单”放入“v_查询表名列表”变量(其形式为:‘表名1’,‘表名2’,...)。
[0215] A)“读取sql和表名对应关系表”和“读请求类型编号”是在版本投产期间一次性完成更新。其原因是“本专利涉及的方法及系统”是用于联机交易场景而非灵活查询场景,在联机交易场景中前台browser或client界面上菜单/按钮所触发的读取sql是固定sql而非随机sql,因此可在版本投产期间仅针对有限范围的sql做分析和更新。
[0216] A.1)“读请求类型编号”:在联机交易系统中,service类会将各种读请求转换为对应的查询接口(依赖于所使用的orm框架),每个接口所对应的sql固定,因此可在版本投产期间为每个查询接口对应的sql分配唯一的“读请求类型编号”,并可通过配置文件或配置类(如java properties类等)存储,用于联机查询时从“读请求”转换为“读请求类型编号”。
[0217] A.2)“读取sql和表名对应关系表”结构如表3所示:
[0218] 表3:读取sql和表名对应关系表
[0219]
[0220] B)“读取sql和表名对应关系表”的建立方法如下:
[0221] B.1)读取sql是单句sql:虽然可通过语法树解析工具(如druid等)获取,但推荐通过查找“from关键字”获得。
[0222] B.1.1)对于sql语句中表以及子查询涉及的表,可显式查找出from关键字。
[0223] B.1.2)对于sql语句中“用户自定义函数”中使用的表,需要先通过数据库的数据字典定义获得“用户自定义函数”名称及其定义(这些函数中应只涉及select,不涉及dml操作);然后使用B.1.1的方法建立每个函数的“涉及表名清单”;最后用“函数名称(”在读取sql语句中查找,如找到则将对应函数的“涉及表名清单”append到对应sql的“查询表名清单”。
[0224] B.2)读取sql是存储过程:将存储过程中每句sql按“B.1”的方法进行分析。
[0225] C)“读请求编号”通过共享内存数据库3中独立的序列号获取,与写请求“全局事务数字编号”的序列号分开。该数字编号需要使用整数。
[0226] 步骤0303:应用服务器(j)解析sql,选取强一致性读(备)库用于查询,同时获取“改写读sql所需但尚在同步”的表名及其操作类型、缓存key。其中备库的选择依据是所需传输数据最少、连接数也尽可能少。选择方法为通过以下sql(h2数据库)查询共享内存数据库3:
[0227]
[0228] 其中,v_查询表名列表来自步骤0302;输出的“备库id”字段放入“v_备库id”变量,做为强一致性读(备)库查询时的备库,形式为“Ip:port/实例名”;输出的op_sum字段放入v_op_list变量,用于获取。共享内存数据库3中“备库读连接表”结构如表4所示。
[0229] 表4备库读连接表
[0230]
[0231]
[0232] 如果输出为空,则表示当前无可用备库(如在批量时段),需要查询转到写(主)数据库4上执行,此时将“改写的读sql”设为“原有读sql”,将“v_备库id”设为主库id,转步骤0307。
[0233] 步骤0304:从缓存服务器集群2中获取本次查询所涉及表的同步中数据,写入备库作为外部表。对于步骤0304中获得的v_op_list变量,其形式为"操作表名1@操作类型1@缓存key1@全局事务数字编号1,操作表名2@操作类型2@缓存key2@全局事务数字编号2,....",可根据以下方法写入备库的外部表:
[0234] A)根据v_op_list中的缓存key(i),使用“ZREVRANGE缓key 0 -1WITHSCORES”从缓存服务器集群2中获取相关记录,其形式为“字段1@字段2@...@字段n”,合成“表名,操作类型,全局事务数字编号,字段1,字段2,...,字段n”的内部集合形式
[0235] B)对A中内部集合进行二次整合,消除delete、update的影响,对每种主键取值仅保留当前时点最新记录。其原理是对于同一张表同一个主键的多条记录进行分组,组内按“全局事务数字编号”从小到大进行排序:如果组内最后一条的操作类型为delete,则组内所有记录都不保留;如果组内最后一条为update或insert,则组内仅最后一条保留。
[0236] C)对于B)中二次整合的结果,如某张表同步中记录整合结果不为空,则将其通过分隔符文件形式写入备库所在服务器,同时提交外部表定义语句(由于本系统为联机交易系统,联机交易写请求涉及的表能预先获知),外部表的名称为“表名_读请求编号”,外部表中除原有字段外还包含“操作类型”。
[0237] 步骤0305:获取读请求sql,利用外部表实施改写,形成“强一致性查询版本的读sql”。
[0238] 该步骤是本方法及系统的核心步骤。“读请求sql”即来自步骤0302中获得的“读取Sqltext”。由于联机交易系统的读sql预先可定。因此可预先要求将相关sql中将“表及其where筛选条件”写成“inline结果集”的形式,以简化改写和保证查询效率(尽量走索引,减少全表扫描的概率)。“inline结果集”即以下伪代码sql中的u:
[0239]
[0240] 对于上述伪代码sql,假设A表对应的外部表为“A_读请求编号”,则可按以下方式改写成强一致性查询版本的“inline结果集”,替换到原读sql中形成强一致性查询版本读sql。
[0241]
[0242] 上述改写是为了保证原有“FROM A”能继续根据“原有筛选条件语句”走索引,减少全表扫描的概率,保证效率。
[0243] 对于不具有row_number分析函数的数据库,则需要按以下sql伪代码的方式改写成强一致性查询版本的“inline结果集”:
[0244]
[0245]
[0246] 如果所用数据库(即主备库)支持在sql中使用“with as的因子化描述方式”,则推荐将上述改写后的“inline结果集”作为with后的子查询,实现sql内多次出现时复用,同时减少对原sql的改动程度。支持with as的常用数据库包括oracle、sql_server、mysql(8.0及以上)等。
[0247] 由于联机交易系统的读sql预先可定(即读sql是固定的sql)。因此上述的“inline结果集”可预先保存在系统配置文件中,实现从而提高改写速度。
[0248] 步骤0306:更新共享内存数据库3中“备库读连接表”,将备库所在记录的“读连接数”+1。备库即步骤0303生成的“v_备库id”变量。
[0249] 步骤0307:将“改写后读请求sql”提交给“v_备库id”变量指定的数据库执行,获得查询结果返回读请求客户端。
[0250] 步骤0308:恢复“备库读连接表”中对应读连接数。根据“v_备库id”查找共享内存数据库3中“备库读连接表”对应记录,如能定位到记录,则说明读sql在读(备)数据库6(i)|1≤i≤I中执行,将对应记录的“读连接数”-1;如定位到记录,则说明读sql在写(主)数据库
4中执行,则不需更新。
[0251] 图7是本系统中“读(备)库上的同步模块”的工作流程图。
[0252] 本步骤需要部署多线程并发执行,“读(备)库上的同步模块”相当于mysql中并发复制的coordinator(协调器)。步骤0401~0403、步骤0404~0405、步骤0406三者可并发执行。
[0253] 步骤0401:读取同步队列服务器集群5(推荐为kafka)中消息。
[0254] 步骤0402:完成待同步任务登记。该步骤需将kafka消息的key(“备库id+操作表名+操作类型+全局事务数字编号)”作为键值,登记到本“同步模块”类的concurrent hashmap对象中,对应的value为该待同步任务的状态,在本步骤中设置为“同步中”。
[0255] 步骤0403:选择并发复制线程池中最空闲线程,分配其执行对应的数据同步任务。“选择线程+分配数据”的过程可使用业界各种成熟的并发复制coorinator算法以提升效率,本方法中不再赘述。需要同步的数据即kafka消息key中value(需要同步各条记录的所有字段的连接,分隔符设为“@”),可放入inputstream对象,并和“操作表名+操作类型”一起传输给并发复制线程池中执行同步任务的线程。
[0256] 步骤0404:执行数据同步任务。“并发复制线程池”中执行同步任务的线程接收到inputstream对象包含的数据后,根据同时传入的“操作表名+操作类型”参数,转化为对应dml语句,提交给读(备)数据库6(i)|1≤i≤I执行。
[0257] 步骤0405:完成同步任务后,更新待同步任务的状态。对于“并发复制线程池”中的线程,完成“被分配的数据同步任务”后(dml语句执行完成),更新本“同步模块”类的concurrent hashmap对象中该任务的状态,在concurrent hashmap对象中检索该任务时,key值设为“备库id+操作表名+操作类型+全局事务数字编号”。对于检索到的key,将其value(状态)设置为“完成”。
[0258] 步骤0406:通知应用服务器的“缓存清理”模块启动相关同步数据的清理工作。部署独立进程,定时扫描本“同步模块”类的concurrent hashmap对象,获取其中任务状态为“完成”的key,将其key发给应用服务器的“缓存清理”模块,供其启动相关清理工作。
[0259] 图8是本实施例系统中应用服务器的“缓存清理”的工作流程图,通过清理缓存服务器集群2中已完成数据同步的记录,保证缓存服务器集群2不会超出上限。步骤0501、步骤0502这两者可并行执行。
[0260] 步骤0501:接收各读(备)数据库6(i)|1≤i≤I上“数据库同步模块”的通知,更新共享内存数据库3表中对应记录。步骤0406中读(备)数据库6(i)|1≤i≤I发来消息,消息中包含了已完成同步任务的“全局事务数字编号”+备库id+操作表名+操作类型,以此为主键可定位共享内存数据库3“登记表”中记录,并将该记录的“同步状态”从1(同步中)调整为2(完成)。
[0261] 步骤0502:定时扫描共享内存数据库3“登记表”中已在所有备库上完成同步的“全局事务数字编号”,清理缓存服务器集群2中对应数据。对于每个“全局事务数字编号”标定的数据(可能涉及多张表的操作),仅当其在所有备库上完成所有表的操作完成同步后,才启动缓存服务器集群2清理。定位可清理数据的“全局事务数字编号”的sql为:
[0262]
[0263] 获取全局事务数字编号和缓存key后,可通过“ZERMRANGEBYSCORE缓存key全局事务数字编号”实现清理。
[0264] 图9为本实施例系统在批量时工作流程。
[0265] 对于联机交易系统,必然存在批量时段。对于批量数据,由于数据量大,不宜采用同步机制,而需采用同时在所有读(备)数据库6(i)|1≤i≤I和写(主)数据库4上执行的方法,由批量调度服务器7统一协调。步骤0601-0604、步骤0605可并发执行。
[0266] 步骤0601:将批量文件(包含所有记录)传输到所有读(备)数据库6(i)|1≤i≤I和写(主)数据库4上。如果原有批量是检测文件到达触发,则这些批量文件只能先放到临时目录,待步骤0603、0604批量触发时才移动到最终目录。
[0267] 步骤0602:更新共享内存数据库3中“开关表”和“备库读连接表”,使联机交易“批量期间联机写交易同步开关”为0(关闭),且使所有备库不可用于查询。“开关表”的更新即将“批量期间联机写交易同步开关”的值设为0;“备库读连接表”的更新即将所有备库的“备库状态”字段设为0。该措施保证批量执行时间步骤0303无法选到可用备库,将“改写的读sql”设为“原有读sql”,将“v_备库id”设为主库id,转步骤0307,即将读请求转到写(主)数据库4上执行。
[0268] 步骤0603:在写(主)数据库4上触发批量。
[0269] 步骤0604:检查共享内存数据库3中“登记表”,找出已完成同步的读(备)数据库6(i)|1≤i≤I,触发批量。其中,“已完成同步的读(备)数据库6(i)|1≤i≤I”可通过以下sql查询:
[0270]
[0271]
[0272] 步骤0605:监听各库的批量完成情况,当写(主)数据库4完成批量后,先将共享内存数据库3中开关表中“批量期间联机写交易同步开关”设置为1;如某个读(备)数据库6(i)|1≤i≤I上批量已完成,则更新其“备库状态”,使之可用于查询。更新其“备库状态”即利用备库id定位内存数据库3中“备库读连接表”的记录,将其“备库状态”字段设为1。
[0273] 本发明针对联机交易系统中交易sql固定的特点,先通过业界的data change notification获得写sql的数据,再通过本方案设计的缓存待同步的数据、基于缓存数据的sql改写,实现了联机交易场景中读写分离架构的备库强一致性查询方法。批量服务器则负责发起批量计算,保证每日联机交易同步前写(主)库和所有读(备)库具有相同的起始“基线”。
[0274] 通过本发明提供的方案,使读(备)库也能对外提供强一致性查询,显著提升读(备)库资源利用率,不再因暂时不一致而将强一致性查询都集中在主(写)库。突破读(备)库个数限制,从而实现通过增加读(备)库的数量(scale out)。显著提升整个联机交易系统对大规模并发访问的查询响应效率。
[0275] 本发明实施例还提供一种电子设备,该电子设备可以是台式计算机、平板电脑及移动终端等,本实施例不限于此。在本实施例中,该电子设备可以参照前述的方法的实施,其内容被合并于此,重复之处不再赘述。
[0276] 图10为本发明实施例的电子设备600的系统构成的示意框图。如图10所示,该电子设备600可以包括中央处理器100和存储器140;存储器140耦合到中央处理器100。值得注意的是,该图是示例性的;还可以使用其他类型的结构,来补充或代替该结构,以实现电信功能或其他功能。
[0277] 一实施例中,读写分离架构业务系统的强一致性查询可以被集成到中央处理器100中。其中,中央处理器100可以被配置为进行如下控制:
[0278] 将写入业务系统主库的待同步到备库的联机业务数据写入缓存;
[0279] 接收用户的查询请求;
[0280] 根据业务系统的备库和缓存的待同步到备库的联机业务数据,改写查询请求,从而进行查询生成强一致性查询结果。
[0281] 在另一个实施方式中,读写分离架构业务系统的强一致性查询装置可以与中央处理器100分开配置,例如可以将读写分离架构业务系统的强一致性查询配置为与中央处理器100连接的芯片,通过中央处理器的控制来实现读写分离架构业务系统的强一致性查询功能。
[0282] 如图10所示,该电子设备600还可以包括:通信模块110、输入单元120、音频处理器130、显示器160、电源170。值得注意的是,电子设备600也并不是必须要包括图10中所示的所有部件;此外,电子设备600还可以包括图10中没有示出的部件,可以参考现有技术。
[0283] 如图10所示,中央处理器100有时也称为控制器或操作控件,可以包括微处理器或其他处理器装置和/或逻辑装置,该中央处理器100接收输入并控制电子设备600的各个部件的操作。
[0284] 其中,存储器140,例如可以是缓存器、闪存、硬驱、可移动介质、易失性存储器、非易失性存储器或其它合适装置中的一种或更多种。可储存上述与失败有关的信息,此外还可存储执行有关信息的程序。并且中央处理器100可执行该存储器140存储的该程序,以实现信息存储或处理等。
[0285] 输入单元120向中央处理器100提供输入。该输入单元120例如为按键或触摸输入装置。电源170用于向电子设备600提供电力。显示器160用于进行图像和文字等显示对象的显示。该显示器例如可为LCD显示器,但并不限于此。
[0286] 该存储器140可以是固态存储器,例如,只读存储器(ROM)、随机存取存储器(RAM)、SIM卡等。还可以是这样的存储器,其即使在断电时也保存信息,可被选择性地擦除且设有更多数据,该存储器的示例有时被称为EPROM等。存储器140还可以是某种其它类型的装置。存储器140包括缓冲存储器141(有时被称为缓冲器)。存储器140可以包括应用/功能存储部
142,该应用/功能存储部142用于存储应用程序和功能程序或用于通过中央处理器100执行电子设备600的操作的流程。
[0287] 存储器140还可以包括数据存储部143,该数据存储部143用于存储数据,例如联系人、数字数据、图片、声音和/或任何其他由电子设备使用的数据。存储器140的驱动程序存储部144可以包括电子设备的用于通信功能和/或用于执行电子设备的其他功能(如消息传送应用、通讯录应用等)的各种驱动程序。
[0288] 通信模块110即为经由天线111发送和接收信号的发送机/接收机110。通信模块(发送机/接收机)110耦合到中央处理器100,以提供输入信号和接收输出信号,这可以和常规移动通信终端的情况相同。
[0289] 基于不同的通信技术,在同一电子设备中,可以设置有多个通信模块110,如蜂窝网络模块、蓝牙模块和/或无线局域网模块等。通信模块(发送机/接收机)110还经由音频处理器130耦合到扬声器131和麦克风132,以经由扬声器131提供音频输出,并接收来自麦克风132的音频输入,从而实现通常的电信功能。音频处理器130可以包括任何合适的缓冲器、解码器、放大器等。另外,音频处理器130还耦合到中央处理器100,从而使得可以通过麦克风132能够在本机上录音,且使得可以通过扬声器131来播放本机上存储的声音。
[0290] 本发明实施例还提供一种计算机可读程序,其中当在电子设备中执行所述程序时,所述程序使得计算机在所述电子设备中执行如上面实施例所述的读写分离架构业务系统的强一致性查询方法。
[0291] 本发明实施例还提供一种存储有计算机可读程序的存储介质,其中所述计算机可读程序使得计算机在电子设备中执行上面实施例所述的读写分离架构业务系统的强一致性查询。
[0292] 以上参照附图描述了本发明的优选实施方式。这些实施方式的许多特征和优点根据该详细的说明书是清楚的,因此所附权利要求旨在覆盖这些实施方式的落入其真实精神和范围内的所有这些特征和优点。此外,由于本领域的技术人员容易想到很多修改和改变,因此不是要将本发明的实施方式限于所例示和描述的精确结构和操作,而是可以涵盖落入其范围内的所有合适修改和等同物。
[0293] 本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
[0294] 本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
[0295] 这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
[0296] 这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0297] 本发明中应用了具体实施例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。