数据库读写分离方法、装置和系统与流程

文档序号:11407152阅读:218来源:国知局
数据库读写分离方法、装置和系统与流程

本发明属于数据库技术领域,具体地说,涉及一种数据库读写分离方法、装置和系统。



背景技术:

目前常用的数据库读写分离方案通常是由应用程序判断结构化查询语言(structuredquerylanguage,sql)请求是否为查询操作,如果是查询操作,则固定的访问备份数据库,如果是写操作则访问主数据库。这种方式的缺点是:查询操作过于集中到备份数据库上,如果是读多写少的应用程序,则备份数据库压力较大,导致查询慢,同时主数据库会出现资源浪费;应用程序还需要自己识别读写操作,对于复杂的sql识别难度大;对于主数据库和备份数据库的可靠性要求很高,一旦备份数据库或者主数据库宕机,查询服务或者写服务就会停止,大大降低可用性。

在另外一种数据库读写分离的方案中,通过设计一个代理(proxy)程序,客户端的sql都要经过代理程序转发,代理程序根据客户端的sql类型,自动将sql分配到主数据库或者备份数据库。这种方式的缺点是:代理程序解析sql的能力有限,由于数据库sql类型繁多,除非是数据库自身来解析sql,否则代理程序难以有效地区分所有的sql类型,同时代理程序解析一次sql后,数据库本身也会再次解析sql,这样降低了效率;代理程序不能实时了解主数据库和备份数据库当前的压力,这会导致主备压力不均,性能降低;代理程序不能够实时了解主数据库和备份数据库之间的延迟,对于还未同步到备份数据库的数据进行查询将不会得到期望的结果。



技术实现要素:

有鉴于此,本申请提供了一种数据库读写分离方法、装置和系统,以解决现有技术中sql对应的读操作与写操作在主数据库与备份数据库之间分配不合理的技术问题。

为了解决上述技术问题,本申请公开了一种数据库读写分离方法,适用于第一数据库,包括:接收来自客户端的sql语句;解析所述sql语句以确定对应的操作类型;响应于所述操作类型是只读操作时,检测所述只读操作所读取的数据是否已同步至第二数据库;响应于所述只读操作所读取的数据已同步至第二数据库时,转发所述sql语句至所述第二数据库,由所述第二数据库完成执行。

为了解决上述技术问题,本申请还公开了一种数据库读写分离方法,适用于第二数据库,包括:向第一数据库发送数据同步信息;当只读操作所读取的数据已从第一数据库同步至本地时,接收所述第一数据库转发的与所述只读操作对应的sql语句;执行所述sql语句,完成所述只读操作。

为了解决上述技术问题,本申请还公开了一种数据库读写分离装置,包括:第一接收模块,用于接收来自客户端的sql语句;解析模块,用于解析所述sql语句以确定对应的操作类型;检测模块,用于响应于所述操作类型是只读操作时,检测所述只读操作所读取的数据是否已同步至第二数据库;转发模块,用于响应于所述只读操作所读取的数据已同步至第二数据库时,转发所述sql语句至所述第二数据库,由所述第二数据库完成执行。

为了解决上述技术问题,本申请还公开了一种数据库读写分离装置,包括:第一发送模块,用于向第一数据库发送数据同步信息;第二接收模块,用于当只读操作所读取的数据已从第一数据库同步至本地时,接收所述第一数据库转发的与所述只读操作对应的sql语句;执行模块,用于执行所述sql语句,完成所述只读操作。

为了解决上述技术问题,本申请还公开了一种数据库读写分离系统,包括:第一数据库和第二数据库;所述第一数据库用于接收来自客户端的sql语句,解析所述sql语句以确定对应的操作类型;响应于所述操作类型是只读操作时,检测所述只读操作所读取的数据是否已同步至第二数据库;响应于所述只读操作所读取的数据已同步至第二数据库时,转发所述sql语 句至所述第二数据库;所述第二数据库用于向第一数据库发送数据同步信息;当只读操作所读取的数据已从第一数据库同步至本地时,接收所述第一数据库转发的与所述只读操作对应的sql语句;执行所述sql语句,完成所述只读操作。

与现有技术相比,本申请可以获得包括以下技术效果:第一数据库可根据其与第二数据库之间的数据同步状态来判定是否将只读操作分离出去,实现读操作与写操作分离。

当然,实施本申请的任一产品必不一定需要同时达到以上所述的所有技术效果。

附图说明

此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:

图1是本申请实施例的一种数据库读写分离系统的架构示意图;

图2是本申请实施例的一种数据库读写分离方法的流程图;

图3是本申请实施例的sql语句对应的执行计划的示意图;

图4是本申请实施例的sql语句对应的执行计划的示意图;

图5是本申请实施例的一种数据库读写分离方法的流程图;

图6是本申请实施例的一种数据库读写分离装置的框图;

图7是本申请实施例的一种数据库读写分离装置的框图。

具体实施方式

以下将配合附图及实施例来详细说明本发明的实施方式,藉此对本发明如何应用技术手段来解决技术问题并达成技术功效的实现过程能充分理解并据以实施。

本申请实施例,第一数据库接收客户端的sql语句,如果对应的是只 读操作则检测所读取的数据是否已同步到第二数据库,当所读取的数据已同步到第二数据库时,将sql语句转发至第二数据库,由第二数据库来执行只读操作,将读操作转移到第二数据库,实现读操作与写操作的分离,在正常数据库主备架构基础上,将主数据库的sql请求转发到备份数据库执行,不依赖第三方代理程序,主数据库能够实时了解主备之间的数据同步状态,可以更合理地选择是否将sql进行转发至备用数据库。

图1是本申请实施例的数据库读写分离系统的架构示意图,包括第一数据库11和第二数据库12。其中,第一数据库11为主数据库,第二数据库12为备份数据库,第一数据库11用于接收客户端13的sql。

对第一数据库11建立虚拟ip地址(virtualipaddress,vip),并向客户端公开虚拟ip地址和端口,用于客户端13访问。在一个实施例中,可以在第一数据库11建立多个虚拟机并分别设置对应的虚拟ip地址和端口。例如,真正应用集群1(realapplicationcluster1,rac-1)的虚拟ip地址及端口号为:tcp:\\192.168.57.221:1522;真正应用集群2的虚拟ip地址及端口号为:tcp:\\192.168.57.222:1522。那么,对客户端13开放这两个虚拟ip地址,客户端13可以分别访问第一数据库11的真正应用集群1和真正应用集群2。

第一数据库11与第二数据库12之间通过日志来同步状态,日志是由第一数据库11主动发送至第二数据库12,第二数据库12同步更新日志后,会向第一数据库11发送反馈信息,故第一数据库11能够了解第二数据库12的同步状态。因此,第一数据库11可以根据第二数据库12的同步状态来判定是否将接收到的sql只读操作转移至第二数据库12来执行。第一数据库11接收第二数据库12的执行结果,并将执行结果返回至客户端13。

下面对第一数据库11和第二数据库12的处理过程分别进行说明。如图2所示的一种数据库读写分离方法,适用于第一数据库,包括以下步骤s10-s13。

s10,接收来自客户端的sql语句。

s11,解析sql语句以确定对应的操作类型。

判定sql语句对应的是只读操作(查询)还是写入操作(包括更新、添加、删除记录等操作)。例如,可以对sql语句进行词法分析,根据sql语句中出现的关键字识别出sql的操作类型。

s12,响应于操作类型是只读操作时,检测只读操作所读取的数据是否已同步至第二数据库。

根据第二数据库返回的日志同步状态来检测该只读操作所要读取的数据是否已经同步到第二数据库,即判定从第二数据库是否能够读取相应的数据。这种方式是根据最终的同步结果进行判定的方式。而在一个实施例中,还可以根据第一数据库与第二数据库之间日志同步的延迟状态来确定是否将sql语句转发至第二数据库执行。该延迟可以通过以下方式确定,从第一数据库向第二数据库发送更新的日志数据时开始起算,直到第一数据库接收到第二数据库返回的日志同步状态为止,这期间的时间长度即为日志同步的延迟。例如,可以为第一数据库与第二数据库之间日志同步的延迟时长设置一预设阈值(例如2秒);当第一数据库与第二数据库之间日志同步的延迟时长大于或等于预设阈值时,不会将sql语句转发到第二数据库执行,而在第一数据库本地执行;当第一数据库与第二数据库之间日志同步的延迟时长小于预设阈值时,将sql语句转发到第二数据库执行。这样,能够维持对只读操作的快速响应,防止在日志同步状态延迟过高时转发只读操作而不能得到及时响应。

如果sql语句对应的操作类型是写操作,则会在第一数据库继续执行。

s13,响应于只读操作所读取的数据已同步至第二数据库时,转发sql语句至第二数据库,由第二数据库完成执行。

只读操作被转移到第二数据库,实现读操作与写操作分离。第一数据库可根据其与第二数据库之间的数据同步状态来判定是否将只读操作分离出去;或者根据其与第二数据库之间的数据同步的延迟来判定当前是否适合将只读操作分离出去。

第一数据库对sql语句进行解析并判定为只读操作时,将sql语句转发至第二数据库。而第二数据库在执行前还需要对sql语句再次进行解析,会出现重复解析的情况,影响sql执行效率。因此,在一个实施例中,步 骤s11还可进一步实施为以下步骤s111-s112。

s111,对sql语句进行语法分析,生成执行计划。

通过语法分析得到sql语句的业务处理逻辑,由该业务处理逻辑组成sql语句对应的执行计划(explainplan)。

例如,从一个表中查询所有名字为“张三”的人,对应的sql语句为:

select*frompersonwherename='张三';

解析后生成的执行计划如图3所示,sql的执行计划从右侧开始,先进行表扫描,从person列中查询名字为“张三”的人,再将结果输出。

再例如,从一个表中查询年龄最大的人,对应的sql语句为:

selectmax(age)fromperson;

解析后生成的执行计划如图4所示,先进行表扫描,由于max()函数属于聚合函数,因此在执行计划中会有流聚合(aggregate)出现,用于计算汇总值,这里用于找到年龄(age)这一列的最大值,最后输出结果。

s112,根据执行计划确定对应的操作类型。

通过执行计划来判定sql语句对应的操作是否都是只读操作。

在这个实施例中,步骤s13相应的进一步实施为以下步骤s131。

s131,转发sql语句对应的执行计划至第二数据库。

第二数据库直接按照执行计划来执行只读操作,读取对应的数据并返回执行结果至第一数据库。这样,第二数据库就无需再对sql语句再进行一次解析,提升了sql执行效率。

此外,第一数据库还可以进一步对自身的负载情况进行判定,在自身负载较高时,将只读操作转移到第二数据库。此时步骤s12可进一步实施为以下步骤s121-s122。

s121,响应于操作类型是只读操作时,检测本地的负载信息是否大于或等于第一预设门限。

s122,响应于本地的负载信息大于或等于第一预设门限时,检测只读操作所读取的数据是否已同步至第二数据库。

本地的负载信息包括cpu使用率、输入/输出(i/o)次数、内存使用率等信息,可以分别针对上述信息设置阈值,当其中任意一个或多个大于或等于对应的预设阈值时,判定需要将sql语句或者执行计划发送至第二数据库,从而继续检测只读操作所读取的数据是否已同步至第二数据库。而上述负载信息都小于对应的预设阈值时,判定不需要将sql语句转发给第二数据库,在第一数据库本地继续执行。这样,在第一数据库负载较低时,不进行读写分离,在第一数据库负载较高时进行读写分离,以保证读操作和写操作各自的执行效率。

第一数据库还可以对第二数据库的负载情况进行判定,在第二数据库负载较低时,将只读操作转移到第二数据库。此时步骤s13可进一步实施为以下步骤s132-s133。

s132,响应于只读操作所读取的数据已同步至第二数据库时,检测第二数据库的负载信息是否小于第二预设门限;

s133,响应于第二数据库的负载信息小于第二预设门限时,转发sql语句至第二数据库,由第二数据库完成执行。

第二数据库会实时的将其负载信息发送至第一数据库,同样包括cpu使用率、输入/输出(i/o)次数、内存使用率等信息。当其中任意一个或多个大于或等于对应的预设阈值时,第一数据库不会将只读操作转移到第二数据库,而继续在本地执行;当上述负载信息都小于对应的预设阈值时,判定第二数据库当前负载较低,可以将只读操作转移到第二数据库执行,此时将sql语句或者执行计划转发至第二数据库。这样,在第二数据库负载较高时,不进行读写分离,在第二数据库负载较低时,进行读写分离,以保证读操作和写操作各自的执行效率。

同理,上述第一数据库对本地负载信息的检测和对第二数据库负载信息的检测也可以合并同时进行,所能达到的效果是,在第一数据库负载较高并且第二数据库负载较低时,进行读写分离,其他情况都不进行读写分离,使第一数据库能够更加合理的判定是否将只读操作转移到第二数据库。

图5是本申请实施例提供的一种数据库读写分离方法,适用于第二数据库,包括以下步骤s20-s22。

s20,向第一数据库发送数据同步信息。

将已同步到本地的日志信息返回给第一数据库,使第一数据库能够得知第一数据库与第二数据库之间的同步状态或者推算出第一数据库与第二数据库之间日志同步的延迟。

s21,当只读操作所读取的数据已从第一数据库同步至本地时,接收第一数据库转发的与所述只读操作对应的sql语句。

或者,在只读操作所读取的数据已从第一数据库同步至本地,并且与第一数据库的日志同步延迟小于预设阈值时,接收第一数据库转发的与所述只读操作对应的sql语句。

s22,执行所述sql语句,完成所述只读操作。

第二数据库做为备份数据库在只读操作所读取的数据已同步至本地时,接收第一数据库的转移的只读操作,实现读写分离,为第一数据库分担只读操作的执行任务并返回执行结果至第一数据库,保证读写任务的高效执行。

在一个实施例中,第二数据库还会向第一数据库发送负载信息,由第一数据库对第二数据库的负载情况进行判定。如果第一数据库判定第二数据库的负载情况过高,则将不会让第二数据库执行只读操作,在判定第二数据库负载较低时,再进行读写分离,由第二数据库执行只读操作,保证读操作和写操作各自的执行效率。

在一个实施例中,步骤s21可进一步实施为:当只读操作所读取的数据已从第一数据库同步至本地时,接收所述第一数据库转发的与只读操作对应的执行计划;步骤s22可进一步实施例为:根据执行计划完成只读操作。

这样,第二数据库就不需要再对sql语句重新做一次解析,而直接按照来自第一数据库解析后得到的执行计划来执行只读操作,从而有助于提高读操作在第二数据库的执行效率。

对于图1所示的数据库读写分离系统,如果第二数据库12出现了宕机,那么第一数据库11不会再进行读写分离,读操作和写操作都会在第一数据库执行。而如果第一数据库出现了宕机,那么系统会对第一数据库11和第二数据库12进行主备切换处理,将第二数据库12临时作为主数据库,在主 备切换期间(第一数据库11恢复之前),读操作和写操作都会在第二数据库12中执行。

以下是本申请的装置实施例,用于执行本申请的方法实施例。

图6是本发明实施例提供的一种数据库读写分离装置,包括:

第一接收模块30,用于接收来自客户端的sql语句;

解析模块31,用于解析sql语句以确定对应的操作类型;

检测模块32,用于响应于操作类型是只读操作时,检测只读操作所读取的数据是否已同步至第二数据库;

转发模块33,用于响应于只读操作所读取的数据已同步至第二数据库时,转发sql语句至第二数据库,由第二数据库完成执行。

在一个实施例中,该解析模块31进一步包括:

分析子模块,用于对所述sql语句进行语法分析,生成执行计划;

确定子模块,用于根据所述执行计划确定对应的操作类型;

该转发模块33进一步包括:

第一转发子模块,用于转发所述sql语句对应的执行计划至所述第二数据库。

在一个实施例中,该检测模块32进一步包括:

第一检测子模块,用于响应于所述操作类型是只读操作时,检测本地的负载信息是否大于或等于第一预设门限;

第二检测子模块,用于响应于所述本地的负载信息大于或等于第一预设门限时,检测所述只读操作所读取的数据是否已同步至第二数据库。

在一个实施例中,该转发模块33进一步包括:

第三检测子模块,用于响应于所述只读操作所读取的数据已同步至第二数据库时,检测所述第二数据库的负载信息是否小于第二预设门限;

第二转发子模块,用于响应于所述第二数据库的负载信息小于第二预设门限时,转发所述sql语句至所述第二数据库,由所述第二数据库完成执行。

图7是本发明实施例提供的一种数据库读写分离装置,包括:

第一发送模块40,用于向第一数据库发送数据同步信息;

第二接收模块41,用于当只读操作所读取的数据已从第一数据库同步至本地时,接收所述第一数据库转发的与所述只读操作对应的sql语句;

执行模块42,用于执行所述sql语句,完成所述只读操作。

在一个实施例中,该装置还包括:

第二发送模块,用于向所述第一数据库发送负载信息;

该第二接收模块41进一步包括:

第一接收子模块,用于当只读操作所读取的数据已从第一数据库同步至本地时,并且所述负载信息小于第二预设门限时,接收所述第一数据库转发的与所述只读操作对应的sql语句。

在一个实施例中,该第二接收模块41进一步包括:

第二接收子模块,用于接收所述第一数据库转发的与所述只读操作对应的执行计划;

所述执行模块包括:

执行子模块,用于根据所述执行计划完成所述只读操作。

在一个典型的配置中,计算设备包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。

内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。

计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储 器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。

如在说明书及权利要求当中使用了某些词汇来指称特定组件。本领域技术人员应可理解,硬件制造商可能会用不同名词来称呼同一个组件。本说明书及权利要求并不以名称的差异来作为区分组件的方式,而是以组件在功能上的差异来作为区分的准则。如在通篇说明书及权利要求当中所提及的“包含”为一开放式用语,故应解释成“包含但不限定于”。“大致”是指在可接收的误差范围内,本领域技术人员能够在一定误差范围内解决所述技术问题,基本达到所述技术效果。此外,“耦接”一词在此包含任何直接及间接的电性耦接手段。因此,若文中描述一第一装置耦接于一第二装置,则代表所述第一装置可直接电性耦接于所述第二装置,或通过其他装置或耦接手段间接地电性耦接至所述第二装置。说明书后续描述为实施本发明的较佳实施方式,然所述描述乃以说明本发明的一般原则为目的,并非用以限定本发明的范围。本发明的保护范围当视所附权利要求所界定者为准。

还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的商品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种商品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的商品或者系统中还存在另外的相同要素。

上述说明示出并描述了本发明的若干优选实施例,但如前所述,应当理解本发明并非局限于本文所披露的形式,不应看作是对其他实施例的排除,而可用于各种其他组合、修改和环境,并能够在本文所述发明构想范围内,通过上述教导或相关领域的技术或知识进行改动。而本领域人员所进行的改动和变化不脱离本发明的精神和范围,则都应在本发明所附权利要求的保护范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1