一种数据库读写方法、装置及电子设备
技术领域
本发明涉及计算机通信技术,尤指一种数据库读写方法、装置及电子设备。
背景技术
读写分离是一种常见的数据库系统扩展方式。如图1所示,主数据库负责处理含有写操作的请求,从数据库负责处理只读请求。用户的请求被数据库代理(Proxy)组件识别和分配。主库的写操作产生的更新,通过事务日志,同步给从库。从库通过回放日志,来同步数据,保持从库中的数据与主库的一致。
数据库代理在分配用户请求时,将含有写操作的请求分配给主库,只读请求分配给从库。如果写操作请求是数据库模式定义语言(Data Definition Language,DDL)操作或其他可能长时间阻塞查询的更新操作,由于上述写操作在主库执行时,对主库的修改不断通过日志同步到从库,所以从库在响应读请求时可能遇到主从同步操作,两种操作可能会涉及对同一数据块的读和写,从而产生冲突。相关技术中,有两种处理方法,一种方法是主从同步操作等待查询操作完成后再执行,这样处理会造成主从数据同步延迟,使得从库的查询结果不准确。另一种方法是在查询进行中遇到主从同步则终止查询,这样处理会导致用户等待很长时间后却发现查询没有成功,影响用户体验。
发明内容
本申请提供了一种数据库读写方法、装置及电子设备,能够避免数据库主库的写操作与从库的读操作产生冲突,改善用户体验。
本申请采用如下技术方案:
本申请实施例提供了一种数据库读写方法,包括:
数据库代理接收到预定类型的写操作请求后,检查从库的任务处理状态;
根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理。
可选地,所述根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理,包括:
在检测到所述从库存在未完成的读操作任务时,拒绝所述写操作请求并向所述写操作请求的发起方返回失败响应,或者接受所述写操作请求但进行延迟处理。
可选地,所述接受所述写操作请求但进行延迟处理,包括:
等待所述从库处理读操作任务,在检测到所述从库处理完所有的读操作任务后,将所述预定类型的写操作请求发送到主库;或者
启动定时器,在定时时间到之前检测到所述从库处理完所有的读操作任务,则将所述预定类型的写操作请求发送到主库,在定时时间到时检测到所述从库还存在未完成的读操作任务,则向所述写操作请求的发起方返回失败响应。
可选地,根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理之前,所述方法还包括:
判断所述预定类型的写操作请求的处理对象与所述从库未完成的读操作任务的处理对象是否为同一对象或存在关联关系;
在判定所述预定类型的写操作请求的处理对象与所述从库未完成的读操作任务的处理对象为同一对象或存在关联关系时,拒绝所述写操作请求并向所述写操作请求的发起方返回失败响应,或者接受所述写操作请求但进行延迟处理。
可选地,所述方法还包括:
在接收到读操作请求后,检查主库的任务处理状态;
在检测到所述主库存在未完成的预订类型的写操作任务时,将所述读操作请求发送到所述主库。
可选地,在将所述读操作请求发送到所述主库之前,所述方法还包括:
判断所述预定类型的写操作任务的处理对象与所述读操作请求的处理对象是否为同一对象或存在关联关系;
在判定所述预定类型的写操作任务的处理对象与所述读操作请求的处理对象为同一对象或存在关联关系时,将所述读操作请求发送到所述主库。
本申请实施例还提供了一种数据库读写方法,应用于读写分离的数据库系统中的数据库代理,包括:
写操作请求接收模块,用于接收到预定类型的写操作请求后,检查从库的任务处理状态;
写操作请求处理模块,用于根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理。
可选地,写操作请求处理模块,用于采用以下方式根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理:
在检测到所述从库存在未完成的读操作任务时,拒绝所述写操作请求并向所述写操作请求的发起方返回失败响应,或者接受所述写操作请求但进行延迟处理。
可选地,写操作请求处理模块,用于采用以下方式接受所述写操作请求但进行延迟处理:
等待所述从库处理读操作任务,在检测到所述从库处理完所有的读操作任务后,将所述预定类型的写操作请求发送到主库;或者
启动定时器,在定时时间到之前检测到所述从库处理完所有的读操作任务,则将所述预定类型的写操作请求发送到主库,在定时时间到时检测到所述从库还存在未完成的读操作任务,则向所述写操作请求的发起方返回失败响应。
可选地,写操作请求接收模块,还用于在根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理之前,判断所述预定类型的写操作请求的处理对象与所述从库未完成的读操作任务的处理对象是否为同一对象或存在关联关系;在判定所述预定类型的写操作请求的处理对象与所述从库未完成的读操作任务的处理对象为同一对象或存在关联关系时,拒绝所述写操作请求并向所述写操作请求的发起方返回失败响应,或者接受所述写操作请求但进行延迟处理。
可选地,所述装置还包括:
读操作请求接收模块,用于在接收到读操作请求后,检查主库的任务处理状态;
读操作请求处理模块,用于在检测到所述主库存在未完成的预订类型的写操作任务时,将所述读操作请求发送到所述主库。
可选地,读操作请求接收模块,还用于在将所述读操作请求发送到所述主库之前,判断所述预定类型的写操作任务的处理对象与所述读操作请求的处理对象是否为同一对象或存在关联关系;在判定所述预定类型的写操作任务的处理对象与所述读操作请求的处理对象为同一对象或存在关联关系时,将所述读操作请求发送到所述主库。
本申请实施例还提供了一种用于数据库读写的电子设备,包括:存储器和处理器;
所述存储器用于保存用于数据库读写的程序,所述用于数据库读写的程序在被所述处理器读取执行时,执行以下操作:
接收到预定类型的写操作请求后,检查从库的任务处理状态;
根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理。
本申请包括以下优点:
本申请至少一个实施例,数据库代理接收到预定类型的写操作请求后,检查从库的任务处理状态,根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理,该实施例的技术方案可以避免数据库主库的写操作与从库的读操作产生冲突,改善用户体验。
当然,实施本申请的任一产品不一定需要同时达到以上所述的所有优点。
附图说明
附图用来提供对本发明技术方案的进一步理解,并且构成说明书的一部分,与本申请的实施例一起用于解释本发明的技术方案,并不构成对本发明技术方案的限制。
图1为现有技术中读写分离的数据库系统的结构示意图;
图2为本发明实施例一的一种数据库读写方法的流程图;
图3为本发明应用示例1的一种数据库读写方法的流程图;
图4为本发明实施例二的一种数据库读写装置的示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,下文中将结合附图对本发明的实施例进行详细说明。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互任意组合。
在附图的流程图示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行。并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
实施例一
如图2所示,一种数据库读写方法,包括:
S210,数据库代理接收到预定类型的写操作请求后,检查从库的任务处理状态;
S220,根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理;
本实施例中,所述根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理,包括:
在检测到所述从库存在未完成的读操作任务时,拒绝所述写操作请求并向所述写操作请求的发起方返回失败响应,或者接受所述写操作请求但进行延迟处理。
本实施例中,所述接受所述写操作请求但进行延迟处理,包括:
等待所述从库处理读操作任务,在检测到所述从库处理完所有的读操作任务后,将所述预定类型的写操作请求发送到主库;或者
启动定时器,在定时时间到之前检测到所述从库处理完所有的读操作任务,则将所述预定类型的写操作请求发送到主库,在定时时间到时检测到所述从库还存在未完成的读操作任务,则向所述写操作请求的发起方返回失败响应;
一种实现方式中,根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理之前,所述方法还包括:
判断所述预定类型的写操作请求的处理对象与所述从库未完成的读操作任务的处理对象是否为同一对象或存在关联关系;
在判定所述预定类型的写操作请求的处理对象与所述从库未完成的读操作任务的处理对象为同一对象或存在关联关系时,拒绝所述写操作请求并向所述写操作请求的发起方返回失败响应,或者接受所述写操作请求但进行延迟处理;
本实施例中,所述预定类型的写操作请求包括:数据库模式定义语言DDL操作,针对元数据的操作、或磁盘整理操作;
在其他实现方式中,所述预定类型的写操作请求也可以是其他类型的写操作请求,这些写操作请求可能会与从库的读操作任务发生读写冲突。具体实现时可以根据实际的应用场景设置或调整预定类型的种类。
一种实现方式中,根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理,还包括:
在检测到所述从库已经完成所有的读操作任务时,将所述预定类型的写操作请求发送到主库;
一种实现方式中,所述方法还包括:
S230,在接收到读操作请求后,检查主库的任务处理状态;
S240,在检测到所述主库存在未完成的预订类型的写操作任务时,将所述读操作请求发送到所述主库;
一种实现方式中,在检查主库的任务处理状态后,所述方法还包括:
在检测到所述主库不存在未完成的预订类型的写操作任务时,将所述读操作请求发送到所述从库;
一种实现方式中,在将所述读操作请求发送到所述主库之前,所述方法还包括:
判断所述预定类型的写操作任务的处理对象与所述读操作请求的处理对象是否为同一对象或存在关联关系;
在判定所述预定类型的写操作任务的处理对象与所述读操作请求的处理对象为同一对象或存在关联关系时,将所述读操作请求发送到所述主库。
主库在处理预定类型的写操作任务时,通常会为元数据加排他锁,在之后接收到读操作请求时,所述读操作请求发现此时元数据被加上了排他锁,则会立即向读操作请求的发起方返回失败响应,或者,启动一个定时器,如果所述定时器定时时间到时所述排它锁还处于锁定状态,则向读操作请求的发起方返回失败响应,如果所述定时器定时时间未到时所述排它锁处于解锁状态,则主库开始处理所述读操作请求。读操作和预订类型的写操作都由主库去处理,一方面能够避免用户等待很长时间才发现读操作失败,另一方面也可以避免主库和从库之间数据不同步。
下面用一个例子(应用示例1)说明本实施例。如图3所示,本例子中,预订类型的写操作请求是数据库模式定义语言DDL操作,数据库读写方法包括下述步骤301~308:
步骤S301,数据库代理接收到用户的DDL操作请求;
步骤S302,判断从库是否存在未完成的读操作任务,是则执行步骤S304,否则执行步骤S303;
步骤S303,将所述DDL操作请求发送给主库,转到步骤S305;
步骤S304,向用户返回失败响应,或者延迟处理所述DDL操作请求;
其中,所述延迟处理所述DDL操作请求,可以是在检测到所述从库处理完所述查询任务后,再将所述DDL操作请求发送到主库;或者,启动定时器,如果定时时间到时所述从库还未处理完所述查询请求,则向用户返回失败响应;如果定时时间到之前检测到所述从库已经处理完所述查询请求,则将所述DDL操作请求发送到主库;
在其他的实现方式中,在步骤S302判定出从库存在未完成的读操作任务后,还可以增加一个判断步骤:判断所述DDL操作请求的处理对象与所述从库未完成的读操作任务的处理对象是否为同一对象或存在关联关系,是则执行步骤S304,否则执行步骤S303;
比如,如果DDL操作请求是对表1~20的元数据进行操作,从库正在进行查询操作,所述查询操作的处理对象是表1~10,则判定所述DDL操作与所述查询操作的处理对象存在关联关系;
步骤S305,数据库代理接收到用户的查询请求;
步骤S306,判断主库是否存在未完成的预定类型的写操作任务,是则执行步骤S308,否则执行步骤S307;
步骤S307,将所述查询请求发送给从库,结束;
步骤S308,将所述查询请求发送到所述主库;
在其他的实现方式中,在步骤S306判定出主库存在未完成的预定类型的写操作任务后,还可以增加一个判断步骤:判断所述查询请求的处理对象与所述主库未完成的写操作任务的处理对象是否为同一对象或存在关联关系,是则执行步骤S308,否则执行步骤S307;
比如,如果所述查询请求的处理对象是表11~15,主库正在进行DDL操作,所述DDL操作是对表1~20的元数据进行操作,则判定所述DDL操作与所述查询操作的处理对象存在关联关系;
主库在处理DDL操作请求时,通常会为元数据加排他锁,在之后接收到查询请求时,所述查询请求发现此时元数据被加上了排他锁,则会立即向用户返回失败响应,或者,启动一个定时器,如果所述定时器定时时间到时所述排它锁还处于锁定状态,则向用户返回失败响应,如果所述定时器定时时间未到时所述排它锁处于解锁状态,则主库开始处理所述查询请求。查询请求和DDL操作都由主库去处理,一方面能够避免用户等待很长时间才发现查询失败,从而改善用户体验;另一方面也可以避免主库和从库之间数据不同步,防止从库查询结果不准确。
在其他的实现方式中,上述步骤S301-304,与步骤S305-308之间可以没有先后关系,二者独立运行;
实施例二
如图4所示,一种数据库读写装置,应用于读写分离的数据库系统中的数据库代理,包括:
写操作请求接收模块401,用于接收到预定类型的写操作请求后,检查从库的任务处理状态;
写操作请求处理模块402,用于根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理。
本实施例中,所述写操作请求接收模块401是上述装置中负责接收预定类型的写操作请求的部分,可以是软件、硬件、或两者的结合。
本实施例中,所述写操作请求处理模块402是上述装置中负责处理所述预定类型写操作请求的部分,可以是软件、硬件、或两者的结合。
本实施例中,写操作请求处理模块,用于采用以下方式根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理:
在检测到所述从库存在未完成的读操作任务时,拒绝所述写操作请求并向所述写操作请求的发起方返回失败响应,或者接受所述写操作请求但进行延迟处理。
本实施例中,所述写操作请求处理模块,还用于采用以下方式根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理:
在检测到所述从库已经完成所有的读操作任务时,将所述预定类型的写操作请求发送到主库;
本实施例中,写操作请求处理模块,用于采用以下方式接受所述写操作请求但进行延迟处理:
等待所述从库处理读操作任务,在检测到所述从库处理完所有的读操作任务后,将所述预定类型的写操作请求发送到主库;或者
启动定时器,在定时时间到之前检测到所述从库处理完所有的读操作任务,则将所述预定类型的写操作请求发送到主库,在定时时间到时检测到所述从库还存在未完成的读操作任务,则向所述写操作请求的发起方返回失败响应。
在一种实施方式中,写操作请求接收模块,还用于在根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理之前,判断所述预定类型的写操作请求的处理对象与所述从库未完成的读操作任务的处理对象是否为同一对象或存在关联关系;在判定所述预定类型的写操作请求的处理对象与所述从库未完成的读操作任务的处理对象为同一对象或存在关联关系时,拒绝所述写操作请求并向所述写操作请求的发起方返回失败响应,或者接受所述写操作请求但进行延迟处理。
本实施例中,所述预定类型的写操作请求包括:数据库模式定义语言DDL操作,针对元数据的操作、或磁盘整理操作;
在其他实现方式中,所述预定类型的写操作请求也可以是其他类型的写操作请求,这些写操作请求可能会与从库的读操作任务发生读写冲突。具体实现时可以根据实际的应用场景设置或调整预定类型的种类。
一种实施方式中,所述装置还包括:
读操作请求接收模块403,用于在接收到读操作请求后,检查主库的任务处理状态;
读操作请求处理模块404,用于在检测到所述主库存在未完成的预订类型的写操作任务时,将所述读操作请求发送到所述主库。
一种实施方式中,读操作请求接收模块,还用于在将所述读操作请求发送到所述主库之前,判断所述预定类型的写操作任务的处理对象与所述读操作请求的处理对象是否为同一对象或存在关联关系;在判定所述预定类型的写操作任务的处理对象与所述读操作请求的处理对象为同一对象或存在关联关系时,将所述读操作请求发送到所述主库。
一种实现方式中,读操作请求处理模块404,还用于在检测到所述主库已经完成所有预订类型的写操作任务时,将所述读操作请求发送到所述从库。
实施例三
一种用于数据库读写的电子设备,包括:存储器和处理器;
所述存储器用于保存用于数据库读写的程序,所述用于数据库读写的程序在被所述处理器读取执行时,执行以下操作:
接收到预定类型的写操作请求后,检查从库的任务处理状态;
根据从库完成读操作任务的情况对所述预定类型的写操作请求进行处理。
本实施例中用于数据库读写的程序在被处理器读取执行时,所执行的操作对应于实施例一的步骤S210~S220;该程序所执行的操作的其它细节可参见实施例一。
虽然本发明所揭露的实施方式如上,但所述的内容仅为便于理解本发明而采用的实施方式,并非用以限定本发明。任何本发明所属领域内的技术人员,在不脱离本发明所揭露的精神和范围的前提下,可以在实施的形式及细节上进行任何的修改与变化,但本发明的专利保护范围,仍须以所附的权利要求书所界定的范围为准。