一种基于RAC的数据库日志文件读取方法和装置
【技术领域】
本发明涉及数据库领域,特别是涉及一种基于RAC的数据库日志文件读取方法和装置。
【背景技术】
Oracle数据库的真正应用集群(Real Application Cluster,简写为RAC)作为ORACLE的一种重要数据库部署方案,在各个场景中的应用是非常广泛的。在数据库数据同步领域,同样需要RAC的数据库数据同步方法。自动存储管理(Automatic StorageManagement,简写为ASM)是ORACLE数据库的一个特性,它为数据库管理员提供了一个在所有服务器和存储平台上均一致的简单存储管理接口,基于RAC的数据库也需要使用ASM进行日志文件的读取。
ASM并非通用的文件***,只能用于Oracle数据文件、重做日志以及控制文件。在分析ASM上的归档日志时,由于ASM文件读取的限制,单线程获取归档时,最大一次读取容量必须小于32K,使用单线程时读取速度限制在2M/S左右。因此,目前普遍使用的单线程日志文件读取方法在某些情况下会形成日志归档、分析功能的瓶颈。
鉴于此,如何克服该现有技术所存在的缺陷,避免基于RAC的ORACLE数据库中日志文件读取时由于读取容量限制必须多次申请IO导致的读取速度较慢的现象,提高日志文件读取效率,是本技术领域亟待解决的问题。
【发明内容】
针对现有技术的以上缺陷或改进需求,本发明解决了基于RAC的数据库日志文件读取较慢的问题。
本发明实施例采用如下技术方案:
第一方面,本发明提供了一种基于RAC的数据库日志文件读取方法,包括:将需读取的日志文件分为连续的数据片,每一个数据片的小于等于预设阈值;创建至少2个日志读取线程,日志读取线程数量小于等于每个数据片中包含的日志块数量;根据日志读取线程的数量计算每个日志读取线程需读取的日志文件起始日志块偏移值,根据日志块偏移值为每个日志读取线程分配需读取的数据块,每个数据块包含至少一个日志块;
启动所有日志读取线程,按照被分配的需读取的日志块偏移值对日志文件并行读取,直至将被分配的需读取的数据块读取完成;将每个日志读取线程读取到的数据块按照原日志文件中的顺序合并为读取到的数据片;对待读取的日志文件中的每一个数据片依次进行读取,直至日志文件读取完成。
优选的,将每个日志读取线程读取到的数据块按照原日志文件中的顺序合并为读取到的数据片之前,还包括:创建读取管理线程,日志读取管理线程获取日志文件读取请求、完成日志文件读取过程中的计算任务,并对日志读取线程进行管理,计算任务包括将需读取的日志文件分为连续的数据片、计算每个日志读取线程需读取的日志文件起始日志块偏移值、将每个日志读取线程读取到的数据块按照原日志文件中的顺序合并为读取到的数据片。
优选的,还包括:进行日志文件读取前,日志读取管理线程判断需读取的日志文件是否已被读取;若是,不进行日志读取;若否,开始进行日志读取。
优选的,将每个日志读取线程读取到的数据块按照原日志文件中的顺序合并为读取到的数据片之前,还包括:建立日志缓存区,日志缓存区的大小不小于划分后的数据片大小,且以日志块大小为标准对齐内存地址,以便于存放日志读取线程所读取到的数据块。
优选的,存放日志读取线程所读取到的数据块,具体为:按照每个日志读取线程分配到的需读取的日志块偏移值,将每个日志读取线程读取到的数据块存入日志缓存区中相应的偏移位置。
优选的,还包括:需读取的日志文件全部读取并存入日志缓冲区后,读取管理线程将日志缓冲区中的全部数据整体取出,保存为新的日志文件,或将数据提供给其它需要使用日志文件数据的功能模块。
优选的,将每个日志读取线程读取到的数据块存入日志缓存区中相应的偏移位置之前,还包括:对每个日志读取线程读取到的每一个日志块进行数据校验,判断每一个日志块是否读取正确;若读取正确,将读取到的日志块放入日志缓存区;若读取错误,重新对读取不正确的日志块进行读取。
优选的,还包括:存在已完成被分配的数据块读取任务的空闲日志读取线程,且日志文件未读取完成时,读取管理线程按顺序为空闲日志读取线程再次分配需读取的数据块。
优选的:当需读取的日志文件中未被读取的数据长度小于读取管理线程划分的每个日志读取线程的需读取的数据块长度时,日志读取线程需读取的数据块长度与日志文件中未被读取的数据长度一致。
另一方面,本发明提供了一种基于RAC的数据库日志文件读取装置,具体为:包括至少一个处理器和存储器,至少一个处理器和存储器之间通过数据总线连接,存储器存储有可被至少一个处理器执行的指令,指令在被处理器执行后,用于完成权利要求1-9任一的基于RAC的数据库日志读取方法。
与现有技术相比,本发明实施例的有益效果在于:采用并发读取的方式提高数据库日志文件的读取速度,解决因ASM数据读取限制导致的日志文件读取速度限制问题,在总的IO请求次数不变的情况下,通过并发读取方式,在同一时间段内同时进行多个读取操作,提高了读取带宽,提高了单位时间内的读取效率,减少日志文件整体的读取时间。
本发明提供了一种基于RAC的数据库日志文件读取方法和装置,其目的在于,通过多线程并发读取方式,突破ASM单线程读取时的速度限制,提升日志文件读取速度。
【附图说明】
为了更清楚地说明本发明实施例的技术方案,下面将对本发明实施例中所需要使用的附图作简单地介绍。显而易见地,下面所描述的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种基于RAC的数据库日志文件读取方法的流程图;
图2为本发明实施例提供的一种基于RAC的数据库日志文件读取方法的现有技术示意图;
图3为本发明实施例提供的一种基于RAC的数据库日志文件读取方法的日志文件划分方式示意图;
图4为本发明实施例提供的一种基于RAC的数据库日志文件读取方法的日志读取线程工作方式示意图;
图5为本发明实施例提供的另一种基于RAC的数据库日志文件读取方法的流程图;
图6为本发明实施例提供的另一种基于RAC的数据库日志文件读取方法的流程图;
图7为本发明实施例提供的一种基于RAC的数据库日志文件读取装置的结构图。
【具体实施方式】
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明各实施方式的基于RAC的数据库日志文件读取装置可以多种形式存在,通常为数据库服务器。数据库服务器的构成包括处理器、硬盘、内存、***总线等,数据库服务器和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高,以适应数据库服务中数据量、安全性要求高、业务请求频繁等功能。其它可完成RAC部署,并且可以通过ASM方式对数据库日志文件完成读取的装置也可以作为本发明实施例中的数据库日志文件读取装置。
本发明将通过以下具体实施例,展开阐述如何在不同应用场景中,克服相关技术问题。
此外,下面所描述的本发明各个实施方式中所涉及到的技术特征只要彼此之间未构成冲突就可以相互组合。下面就参考附图和实施例结合来详细说明本发明。
RAC存储需要部署在共享文件***上,针对技术基于ASM存储的RAC源端,在分析ASM上的归档日志时,必须遵循ASM文件读取的限制。单线程获取归档时,最大一次读取容量必须小于32K,使用单线程时读取速度限制在2M/S左右。
由于ASM上的Oracle数据库归档日志是非常大的,对于大文件的读写,可以通过Direct I/O的方式,不使用***缓冲操作***的Page Cache并且减少CPU消耗。Oracle在ASM文件***写入日志文件时,即使用了Direct I/O的方式;那么,在读取Oracle归档日志时,同样采用Direct I/O方式。使用Direct I/O方式读写文件的限制条件如下:
a)在数据库***中,文件***页是文件***读写数据的最小单位。开辟缓存文件的缓存必选是文件***页的整数倍,并且必须以页大小为标准对齐;由于ASM基于裸设备,针对其特殊性,得到Oracle日志块(Log Block Size)即为读写数据的最小单位,日志块与文件***页在数据库管理***中属于同一概念。
b)针对ASM文件***,由于其尚未公开的ASM文件读写机制,在每次在以Direct I/O方式读取归档日志时,不仅必须遵循a),并且一次读取的最大容量必须小于32*1024byte;否则,即使我们试图读取大于此容量的文件到缓存,实际上也无法达到预期值。
实施例1:
由于ASM文件***的***限制,通常的单线程读写方式每读写32K数据,就需要申请一次IO,频繁申请及建立IO的时间会导致日志文件读取效率降低。
因此,本发明实施例中使用多线程并发方式对数据库日志文件进行读写,以减少IO次数,并利用并发特性提高读取效率。具体步骤如下,如图1所示:
步骤101:将需读取的日志文件分为连续的数据片,每一个数据片的大小不大于预设数据大小阈值。
为了减少日志文件读取时的IO请求次数,如图2所示,本实施例提供的日志文件读取方法先将日志文件分为一次IO可读写的尽可能大的包括多个日志块的数据片,以一个数据片作为一个整体向ASM进行IO申请,再将数据片划分为多个读取任务,每个读取任务为一个数据块。由于如图3所示的传输速度限制,还需要通过多线程并发方式,使用多个日志读取线程同时对不同数据块进行读取,共同完成每一个数据片的读取。由于ASM的***限制,每个数据片的大小需要小于***限制的预设数据长度阈值。
在本实施例的某些具体实施场景中,可以按照公式1对待读取的日志文件进行划分:
其中,ORA_IO_READ_BUFFER为每个线程度读取的数据块大小,MAX_IO_READ为预设数据长度阈值,LOG_BLOCK_SIZE为Direct I/O读写限制的日志块大小。
进一步的,当分片后日志文件末尾存在小于ORA_IO_READ_BUFFE的剩余部分时,最后一个分片的大小不能够使用公式1计算,而是直接取剩余部分的实际大小值,同时,由于读取的最小单位为一个日志块,因此需要将大小为LOG_BLOCK_SIZE的日志块的数量减少一整块,不对最后一个小于一整个日志块的分片进行读取,以避免因为读取越界造成的错误。因此,计算时需要先使用
计算MAX_IO_READ相对于LOG_BLOCK_SIZE的整数倍数,再减去末尾的1个日志块。
在实际使用场景中,MAX_IO_READ的值可设置为***限制的预设数据长度阈值。在目前使用的ASM中,一次读取的最大容量必须小于32*1024byte,因此预设数据长度阈值最大可设置为32*1024byte。在实际应用中,可以根据实际需要将预设数据长度阈值设置为符合上述限制的其它值。
步骤102:创建至少2个日志读取线程,日志读取线程数量不大于每个数据片中包含的日志块数量。
为了实现对日志文件的多线程并发读取,因此与现有的只创建一个日志读取线程不同,本方法中创建至少两个日志读取线程对日志文件进行读取,通过多线程并发处理实现读取带宽的扩展。由于日志文件读取的最小单位为日志块,因此同时进行读取的线程数不能多于每个数据片中包含的日志块数量。
步骤103:根据日志读取线程的数量计算每个日志读取线程需读取的日志文件起始日志块偏移值,根据日志块偏移值为每个日志读取线程分配需读取的数据块。
为了实现多线程并发读取,开始读取前,需要将需读取的日志文件划分为多个读取任务,每一个读取任务为一个数据块。由于Direct I/O读写的限制,每个日志读取线程都需要以日志块为最小单位进行读取,所以每个日志读取线程单次读取的大小必须为日志块大小的整数倍,如果不整块读取,则无法使用Direct I/O,降低读写效率,因此,为每个日志读取线程分配的读取长度需要与日志读取线程单次读取的大小一致,也应为日志块大小的整数倍。每个数据块起始位置相对于需读取的日志文件的起始位置的偏移值,就是需读取该数据块的日志读取线程需读取的日志块偏移值。
步骤104:启动所有日志读取线程,按照被分配的需读取的日志块偏移值对日志文件并行读取,直至将被分配的需读取的数据块读取完成。
在进行并发读取时,日志读取线程同时启动,或可视为同时启动,每一个日志读取线程同时由日志块偏移值位置开始按顺序读取日志文件中的日志块,直至读完分配的数据块。所有日志读取线程都完成一次读取后,即完成了一个数据片的读取。
步骤105:将每个日志读取线程读取到的数据块按照原日志文件中的顺序合并为读取到的数据片。
由于每个日志读取线程仅读取到了一个数据片中的一个数据块,因此,当日志读取线程将一个数据片读取完成后,还需要将每个日志读取线程读取到的数据块进行合并,恢复为完整的数据片,再对数据片进行IO操作或其它操作,以避免因读取顺序错乱造成的错误,同时也避免对每一个数据块请求IO导致的读取效率损失。
如公式2,并发读取时所有线程一次读取的日志大小为:
其中,REAL_LOG_SIZE为实际读取的大小,n为同时并发读取的日志读取线程数量,MAX_IO_READ为预设数据长度阈值,LOG_BLOCK_SIZE为Direct I/O读写限制的日志块大小。
由于单线程读取时,一次读取的日志大小为LOG_BLOCK_SIZE。因此,由公式2可见,并发读取的读取效率高于单线程读取的效率。
步骤106:对待读取的日志文件中的每一个数据片依次进行读取,直至日志文件读取完成。
如图4所示,需读取的日志文件起始位置为A,终止位置为B。1-2、2-3、3-4、4-5分别为一个数据片1的位置与A相同。1-2、2-3、3-4、4-5依次为读取线程rac_io_thread-1至rac_io_thread-4需读取的数据块,读取线程rac_io_thread-1至rac_io_thread-4的日志块偏移值依次分别为1(即A)、2、3、4。一个数据片读取完成后,再以4为日志文件起始位置计算每个日志读取线程的日志块偏移值再次分配读取任务,直至读取到B位置,日志文件全部读取完成。通过这样的分配方式,可以将需读取的日志文件全部内容以数据块的形式连续分配给多个读取线程进行读取,以实现日志文件的多线程并发读取。
本实施例提供的基于RAC的数据库日志文件读取方法,将待读取的日志文件划分为多个数据片,尽可能减少IO次数,并在每个数据片内部使用并发读取的方式对日志文件进行读取,通过并发执行来突破单线程执行导致的性能瓶颈,提高了日志文件的读取效率,减少了读取的***开销。
实施例2:
在实施例1中提供的基于RAC的数据库日志文件读取方法基础上,不同的具体使用场景中,还可以将实施例1中提供的方法进行不同的适应性改进或调整。
在某些具体实施方案中,为了将与日志读取相关的一些功能模块化,便于***使用和管理,可以将获取日志文件读取申请、完成日志文件读取过程中的计算任务、管理日志读取线程等功能进行整合,通过创建日志读取管理线程同一管理。创建读取管理线程后,实施例1中的步骤101、步骤103、步骤105中的计算任务都由读取管理线程完成。
在某些具体实施方案中,为了便于完成实施例1中步骤105中将每个日志读取线程读取到的数据块合并为数据片的功能,并且减少每个日志读取线程单独将读取到的数据写入外部存储造成的多次IO请求,可以通过设置日志缓存区的方式将所有日志读取线程读取到的数据块进行缓存,整合为完整的数据片后再通过一次IO申请写入外部存储。一般使用场景中与方案实施者自行设定的满足实施例1中数据片大小限制的数据片大小一致,,具体的,方案实施者可以通过实施例1中的公式1计算数据缓存区的大小。在某些情况下,为了保证日志块内存对齐,日志缓存区大小也可以相对于公式1计算所得的大小增加为满足内存对齐要求而需要的大小。
存在日志缓存区的使用场景下,每个日志读取线程完成被分配的数据块读取后,不直接申请IO将数据块放入外部存储,而是先将数据放入日志缓存区中。由于日志读取线程对日志文件进行读取时时以日志块为单位进行读取,并且每个日志块在日志文件头和块头信息中包含了每个日志块的偏移位置信息。因此,可以直接使用日志文件头和块头信息中的偏移位置信息,将读取到的数据块直接放入日志缓存区中相应偏移值为起点的内存地址段中。在具备读取管理线程的场景下,已读取的数据块按照相应偏移值缓存的过程由读取管理线程进行管理。
当所有日志读取线程都完成被分配的数据块读取,并且所有日志在日志缓存区中已按照顺序完成缓存后,还原为一个完整的数据片。由于数据片的大小比***限制的预设数据长度阈值小,因此可以作为一个整体,仅进行一次IO就可以完成整个数据片的IO。在具备读取管理线程的场景下,读取管理线程可以根据申请日志文件读取的具体需求对数据片进行不同类型的操作,如存入外部存储进行归档,或提供给日志分析线程进行日志数据分析等。
在本发明提供的数据库日志读取方法具体实施时,在***支持和不影响读取效率的情况下,可以根据实际需要同时设置日志读取管理线程和日志缓存区,也可以仅设置其中一项。
为了进一步提高读取效率,避免日志读取过程中出现的异常或错误,还可以通过以下改进方式对数据库日志读取方法进行优化。
为了避免对读取过的日志文件重复读取,如图5所示,读取管理线程中可以记录已读取的日志文件的记录,当接收到日志文件读取请求后,不直接开始进行读取,而是判读请求的日志文件是否已被读取。若请求的日志文件未被读取,在对需读取的日志文件进行数据片和数据块划分,并分配日志处理线程进行读取。若请求的日志文件已被读取,则不再进行重复读取。当存在日志缓存区时,若请求的日志文件已被读取,读取管理线程也可以直接定位至日志缓存区中相应的偏移位置,使用日志缓存区中已读取的日志文件数据。
在某些对数据准确性和完整性要求较高的场景下,如图6所示,在每个日志读取线程完成对数据块的读取后,可以对读取到的数据块进行数据校验,以判断日志块是否读取正确。在具体使用功能场景中,由于每个日志块的块头中都包含循环冗余校验的校验码,因此可以对读取到的每个日志块进行循环冗余校验。若进行循环冗余校验后获得的校验码和块头信息中的校验码一致,表示读取到日志块数据正确,可以进一步使用;获得的校验码和块头信息中心的校验码不一致,表示读取到的日志块存在数据读取错误或读取不完整,则需要放弃读取到的该日志块,并重新读取该日志块。
在某些具体实施场景中,进行多线程并发读取时,由于并发处理的特性,可能存在各日志读取线程对被分配的数据块读取完成读取的时间不一致的情况。此时,先读取完成的日志读取线程在最后读取完成的日志读取线程完成之前会一直处于空闲状态,若先读取完成的日志读取线程仅单纯等待,可能造成资源浪费。因此,在***允许的情况下,可以对空闲的日志读取线程再次分配读取任务,继续向后读取未读取的日志文件,进一步减少***资源浪费,提高读取效率。在具有读取管理线程的使用场景中,日志读取线程的工作状态判断及任务再分配,都有读取管理线程完成。在具备日志缓存区的使用场景中,若日志读取线程再次分配的读取任务位于下一个数据片,需要对下一个数据片建立相应的日志缓存区后再进行数据缓存。
通过本实施例中提供的补充和优化方法与实施例1中提供的数据库日志文件读取方法选择性的结合使用,可以一步提高实施例1中提供的数据库日志文件读取方法的读取效率和读取准确率。
实施例3:
在上述实施例1和实施例2提供的基于RAC的数据库日志文件读取方法的基础上,本发明还提供了一种可用于实现上述方法的基于RAC的数据库日志文件读取装置,如图7所示,是本发明实施例的装置架构示意图。本实施例的基于RAC的数据库日志文件读取装置包括一个或多个处理器21以及存储器22。其中,图7中以一个处理器21为例。
处理器21和存储器22可以通过总线或者其他方式连接,图7中以通过总线连接为例。
存储器22作为一种基于RAC的数据库日志文件读取方法非易失性计算机可读存储介质,可用于存储非易失性软件程序、非易失性计算机可执行程序以及模块,如实施例1或实施例2中的基于RAC的数据库日志文件读取方法。处理器21通过运行存储在存储器22中的非易失性软件程序、指令以及模块,从而执行基于RAC的数据库日志文件读取装置的各种功能应用以及数据处理,即实现实施例1和实施例2的基于RAC的数据库日志文件读取方法。
存储器22可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他非易失性固态存储器件。在一些实施例中,存储器22可选包括相对于处理器21远程设置的存储器,这些远程存储器可以通过网络连接至处理器21。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
程序指令/模块存储在存储器22中,当被一个或者多个处理器21执行时,执行上述实施例1中的基于RAC的数据库日志文件读取方法,例如,执行以上描述的图1、图5、图6所示的各个步骤。
本领域普通技术人员可以理解实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,Random AccessMemory)、磁盘或光盘等。
以上仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。