基于时间戳的日志采集方法、装置、设备及介质
文献发布时间:2024-04-18 19:58:21
技术领域
本公开涉及计算机技术领域,尤其涉及一种基于时间戳的日志采集方法、装置、设备及介质。
背景技术
目前,在flink-cdc-postgresql(一种基于Flink的数据变更采集插件)中,不支持设置采集起点。对于查阅PostgreSQL源码,在构建复制流对象时,只支持设置LSN(LogSequence Number,日志序列号)的值为采集起点。
但是,用户往往无法获取采集起点的LSN值。对于实时采集任务,必须开启checkpoint用户才能拿到LSN值,否则用户无从获取。这样对用户的专业性要求过高,对于实时采集的使用难度过大。
发明内容
为了解决上述技术问题,本公开提供了一种基于时间戳的日志采集方法、装置、设备及介质。
根据本公开的一方面,提供了一种基于时间戳的日志采集方法,包括:
读取采集任务的配置文件中添加的时间戳采集起点;
基于所述时间戳采集起点查找目标事务日志文件;
读取并解析所述目标事务日志文件,以确定所述配置文件中设置的日志序列号LSN;
基于所述LSN开启采集复制流,基于所述复制流采集日志数据。
根据本公开的另一方面,提供了一种基于时间戳的日志采集装置,包括:
时间读取模块,用于读取采集任务的配置文件中添加的时间戳采集起点;
文件查找模块,用于基于所述时间戳采集起点查找目标事务日志文件;
LSN确定模块,用于读取并解析所述目标事务日志文件,以确定所述配置文件中设置的日志序列号LSN;
日志采集模块,用于基于所述LSN开启采集复制流,基于所述复制流采集日志数据。
根据本公开的另一方面,提供了一种电子设备,所述电子设备包括:
处理器;
用于存储所述处理器可执行指令的存储器;
所述处理器,用于从所述存储器中读取所述可执行指令,并执行所述指令以实现上述方法。
根据本公开的另一方面,提供了一种计算机可读存储介质,所述存储介质存储有计算机程序,所述计算机程序用于执行上述方法。
本公开实施例提供的技术方案与现有技术相比具有如下优点:
本公开实施例提供的基于时间戳的日志采集方法、装置、设备及介质,包括:读取采集任务的配置文件中添加的时间戳采集起点;基于时间戳采集起点查找目标事务日志文件;读取并解析目标事务日志文件,以确定配置文件中设置的日志序列号LSN;基于LSN开启采集复制流,基于复制流采集日志数据。本公开能够利用时间戳采集起点确定出对应的LSN,大大降低了LSN的获取难度,降低了对用户的专业性要求,进而有利于执行实时采集任务。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,示出了符合本公开的实施例,并与说明书一起用于解释本公开的原理。
为了更清楚地说明本公开实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,对于本领域普通技术人员而言,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本公开实施例所述基于时间戳的日志采集方法流程图;
图2为本公开实施例所述查找目标事务日志文件方法流程图;
图3为本公开实施例所述确定LSN方法流程图;
图4为本公开实施例所述代码示意图;
图5为本公开实施例所述基于时间戳的日志采集装置的结构示意图;
图6为本公开实施例所述电子设备的结构示意图。
具体实施方式
为了能够更清楚地理解本公开的上述目的、特征和优点,下面将对本公开的方案进行进一步描述。需要说明的是,在不冲突的情况下,本公开的实施例及实施例中的特征可以相互组合。
在下面的描述中阐述了很多具体细节以便于充分理解本公开,但本公开还可以采用其他不同于在此描述的方式来实施;显然,说明书中的实施例只是本公开的一部分实施例,而不是全部的实施例。
目前,用户虽然很难获取采集起点的LSN值,但是很容易获取时间戳的值。基于此,本公开实施例提供一种基于时间戳的日志采集方法、装置、设备及介质。本公开基于postgresql源码,在构建LogicalStreamBuilder(逻辑流构建类)逻辑流对象时,需要指定LSN,如果不指定LSN,则默认用0。如果用户传入的参数并不是LSN而是时间戳,现有技术无法直接使用该时间戳,通过本方案则可以将时间戳转换为LSN,然后再基于LSN构建逻辑流对象。为便于理解,以下对本公开实施例展开详细描述。
在此首先对一些技术名词进行解释。
事务日志是数据库的重要组成部分,存储了数据库系统中所有更改和操作的历史,以确保数据库不会因为故障(例如掉电或其他导致服务器崩溃的故障)而丢失数据。在PostgreSQL(以下简称PG)中,事务日志文件称为Write Ahead Log(WAL,事务日志文件),即数据页写入磁盘前务必要将对应的操作日志写入磁盘,这句话就是整个数据库实现数据不丢失的核心思想。上述PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统。PostgreSQL的事务日志为Pgwal。
为了便于管理,PG把事务日志文件划分为N个数据文件空间,每个数据文件称为WAL分段文件,每个文件大小默认为16MB。
数据库的操作日志(XLOG Record)是一个逻辑概念,可以理解为PG中的每一个变更都对应一条操作日志,这些操作日志存储在数据文件空间中。PG读取这些操作日志记录进行故障恢复等操作。
LSN即日志序列号,表示操作日志记录写入到事务日志中位置。日志序列号LSN的值为无符号64位整型。在事务日志中,LSN单调递增且唯一。事务日志文件的日志序列号LSN表示操作日志记录写入到事务日志文件中的位置。LSN可以理解为操作日志在事务日志文件中的偏移。LSN由3部分组成,分别是逻辑文件ID、物理文件ID和文件内偏移。如LSN:1/4288E228,其中1为逻辑文件ID,42为物理文件ID,88E228为WAL分段文件内偏移。
图1为本公开实施例提供的一种基于时间戳的日志采集方法的流程图,该方法可以适用于flink-cdc、chunjun等框架的pgwal数据同步和采集的情况。该方法可以由配置于终端的基于时间戳的日志采集装置执行,该装置可以采用软件和/或硬件实现。参照图1,基于时间戳的日志采集方法包括如下步骤S10至S40。
S10、读取采集任务的配置文件中添加的时间戳采集起点。
在本实施例中,通过读取采集任务的配置文件来获取配置文件中添加的时间戳采集起点,该步骤的具体实现过程可以参照如下所示。
读取采集任务的配置文件。具体为读取Pgwal采集任务的配置文件。Pgwal是PostgreSQL的事务日志,PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统。
本实施例可以判断配置文件中是否设置有LSN;在设置有LSN的情况下,可以直接基于该LSN执行如下步骤S108,即:基于LSN开启采集复制流,基于复制流采集日志数据。
在配置文件中未设置LSN的值的情况下,判断配置文件中是否添加有时间戳采集起点;在是的情况下,获取时间戳采集起点。
在一种实现方式中,在配置文件中未设置LSN的情况下,可以获取配置文件中容易得到的时间戳采集起点,再通过步骤S104及其后续步骤将时间戳采集起点转换为LSN即可。
在另一种实现方式中,在配置文件中未设置LSN的值,且判断配置文件中未添加有时间戳采集起点的情况下,本实施例可以设置LSN的值为0,并根据该值为0的LSN执行如下步骤S108。
S20、基于时间戳采集起点查找目标事务日志文件。其中,在PostgreSQL中,事务日志文件可简称为WAL(Write Ahead Log),即数据页写入磁盘前务必要将对应的操作日志写入磁盘。
如图2所示,本实施例基于时间戳采集起点查找目标事务日志文件的过程可以参照如下内容。
S201、连接postgresql-jdbc,采用SQL语句查询时间戳采集起点之后的首个事务日志文件。该SQL语句示例性为:
SELECT name FROM pg_ls_waldir()where modification>TO_TIMESTAMP(%d)order by modification asc limit 1;
showdata_directory;
根据上述SQL语句查询数据库目录中满足预设条件的所有事务日志文件,该预设条件包括:文件的改变时间大于时间戳采集起点;也就是说,在数据库目录中,查询改变时间大于时间戳采集起点的所有事务日志文件。查询到这些事务日志文件后,按照各事务日志文件的改变时间的先后顺序,确定首个事务日志文件,获取该首个事务日志文件的文件名。
S202、采用SQL语句查询postgresql中事务日志文件的数据存储路径。
S203、将首个事务日志文件和数据存储路径下的事务日志文件,拼接出目标事务日志文件。具体的,根据以上步骤S201和S202中查询的结果,将首个事务日志文件的数据存储路径和postgresql中事务日志文件的数据存储路径拼接出目标事务日志文件的完整路径。
S30、读取并解析目标事务日志文件,以确定配置文件中设置的LSN。参照图3,本实施例可以通过如下步骤实现。
S301、将目标事务日志文件进行格式转换,得到字符串。在具体实现时,首先使用SQL语句读取目标事务日志文件为二进制流,再将该二进制流转为java字符串。
S302、使用换行符分割对字符串进行处理后,逐行读取字符串,并将字符串的每一行逐一作为当前行字符串,循环执行如下步骤S303至S306。
S303、判断当前行字符串中是否匹配到预设的关键词,关键词的后面字符为表示操作时间的字符。
在具体实施例中,循环判断当前行字符串中是否匹配到预设的关键词,关键词如commit、abort,关键词的后面为操作时间。例如图4截取的部分代码中包括“COMMIT 2023-02-22 10:09:20.684301”、“COMMIT 2023-02-22 10:55:07.539116”,COMMIT为匹配到的关键词,COMMIT后面的一串字符表示由年、月、日、时、分、秒组成的操作时间。
如果当前行字符串中没有匹配到关键词,则直接跳过当前行字符串,将下一行字符串作为新的当前行字符串,并再次执行步骤S303。如果当前行字符串中匹配到关键词,则执行如下步骤S304。
S304、当当前行字符串中匹配到关键词时,截取关键词后的操作时间。
S305、将操作时间与时间戳采集起点进行比较。
S306、如果操作时间小于或等于时间戳采集起点,则缓存当前行字符串至预设的变量中,并替换变量中的原始字符串。
在本实施例中,每次匹配到关键字时,截取出关键词后面的操作时间;将操作时间与时间戳采集起点进行比较;如果操作时间小于或等于时间戳采集起点,则缓存当前行字符串至预设的变量中,并替换变量中的原始字符串。而后,将下一行字符串作为新的当前行字符串,并再次执行步骤S303;以此类推,直至当前行字符串中截取到的操作时间大于时间戳采集起点时停止,跳出循环。
S307、如果操作时间大于时间戳采集起点,则解析当前行字符串中的LSN,解析得到的LSN为配置文件中设置的LSN。
具体的,当操作时间大于时间戳采集起点时,跳出循环。循环结束后,解析当前行字符串,得到当前行字符串中的关键字“LSN:”,该关键字“LSN:”后面的数值即为用户要在配置文件中寻找的LSN的值。
S40、基于LSN开启采集复制流,基于复制流采集日志数据。
本实施例包括:在开启复制流时,设置LSN的值;根据LSN的值构建LogicalStreamBuilder逻辑流对象,启动PGReplicationStream复制流。通过循环监听PGReplicationStream复制流采集日志数据;可以理解,循环监听PGReplicationStream复制流,每次读取一条二进制流,将该二进制流序列化为ChangeLog对象,ChangeLog对象是一条日志数据对应的Java对象,也即,该ChangeLog对象是用户要采集的日志数据。
在以上实施例的基础上,本方法还可以包括:
判断采集任务的配置文件中是否设置有LSN;如果设置有LSN,则在开启复制流时,直接设置该LSN的值;根据LSN的值构建LogicalStreamBuilder逻辑流对象,启动PGReplicationStream复制流。
如果没有设置LSN,则在配置文件中未添加时间戳采集起点的情况下,设置LSN的值为0;根据LSN的值构建LogicalStreamBuilder逻辑流对象,启动PGReplicationStream复制流。
在以上实施例中,在采集任务的配置文件中添加时间戳采集起点,如果配置文件设置了LSN的值,则直接使用此LSN构建LogicalStreamBuilder逻辑流对象。如果没有设置LSN的值,则可以利用时间戳采集起点确定LSN,具体为:基于时间戳采集起点查找目标事务日志文件;读取并解析目标事务日志文件,以确定配置文件中设置的LSN;而后再基于LSNLogicalStreamBuilder逻辑流对象。此外,在配置文件中也没有时间戳采集起点的情况下,本方案还能够设置LSN的值为0,由此来构建LogicalStreamBuilder逻辑流对象,也就是不设置采集起点。
以上实施例提供的方法可以应用于预设框架的日志数据同步和采集;预设框架包括但不限于:flink-cdc和chunjun。具体而言,本实施例是基于postgresql源码构建复制逻辑流时设定的startLocation开始起点而构建,可以应用于flink-cdc、chunjun等开源框架的Pgwal数据同步和采集,是Pgwal日志数据采集的补充和功能扩展,兼容更实用和更可靠的采集起点设定,让采集任务更灵活。
综上,本公开实施例提供的基于时间戳的日志采集方法,通过读取采集任务的配置文件中添加的时间戳采集起点;基于时间戳采集起点查找目标事务日志文件;读取并解析目标事务日志文件,以确定配置文件中设置的LSN;基于LSN开启采集复制流,基于复制流采集日志数据。本技术方案通过在采集任务的配置文件中添加时间戳采集起点,这样能够在配置文件中未设置LSN的值、或者用户很难获取LSN的值的情况下,利用时间戳采集起点确定出对应的LSN,大大降低了LSN的获取难度,降低了对用户的专业性要求,进而有利于执行实时采集任务。
而且,本技术方案利用易于获取的时间戳采集起点,能成功将时间戳转换为对应的LSN,这样大大的减少了数据采集的冗余和浪费,避免了非目标数据的采集。如果每次采集任务都是从0开始采集数据,很大的浪费了系统的性能。有了时间戳采集起点做过滤,可以提高开发采集效率,增加采集的灵活性,节省运行成本。对于实时采集任务,用户在不开启checkpoint时,无需太过于关注Pgwal日志的构成部分,无需关注LSN的获取途径,即可完成采集。对于实时采集补充任务,可以自定义时间,完成后续数据的补充采集。
图5为本公开实施例提供的一种基于时间戳的日志采集装置的结构示意图,该装置可以用于实现上述基于时间戳的日志采集方法。参照图5,基于时间戳的日志采集装置包括如下模块。
时间读取模块510,用于读取采集任务的配置文件中添加的时间戳采集起点;
文件查找模块520,用于基于所述时间戳采集起点查找目标事务日志文件;
LSN确定模块530,用于读取并解析所述目标事务日志文件,以确定所述配置文件中设置的日志序列号LSN;
日志采集模块540,用于基于所述LSN开启采集复制流,基于所述复制流采集日志数据。
本实施例所提供的装置,其实现原理及产生的技术效果和前述方法实施例相同,为简要描述,装置实施例部分未提及之处,可参考前述方法实施例中相应内容。
图6为本公开实施例提供的一种电子设备的结构示意图。如图6所示,电子设备600包括一个或多个处理器601和存储器602。
处理器601可以是中央处理单元(CPU)或者具有数据处理能力和/或指令执行能力的其他形式的处理单元,并且可以控制电子设备600中的其他组件以执行期望的功能。
存储器602可以包括一个或多个计算机程序产品,所述计算机程序产品可以包括各种形式的计算机可读存储介质,例如易失性存储器和/或非易失性存储器。所述易失性存储器例如可以包括随机存取存储器(RAM)和/或高速缓冲存储器(cache)等。所述非易失性存储器例如可以包括只读存储器(ROM)、硬盘、闪存等。在所述计算机可读存储介质上可以存储一个或多个计算机程序指令,处理器601可以运行所述程序指令,以实现上文所述的本公开的实施例的基于时间戳的日志采集方法以及/或者其他期望的功能。在所述计算机可读存储介质中还可以存储诸如输入信号、信号分量、噪声分量等各种内容。
在一个示例中,电子设备600还可以包括:输入装置603和输出装置604,这些组件通过总线系统和/或其他形式的连接机构(未示出)互连。
此外,该输入装置603还可以包括例如键盘、鼠标等等。
该输出装置604可以向外部输出各种信息,包括确定出的距离信息、方向信息等。该输出装置604可以包括例如显示器、扬声器、打印机、以及通信网络及其所连接的远程输出设备等等。
当然,为了简化,图6中仅示出了该电子设备600中与本公开有关的组件中的一些,省略了诸如总线、输入/输出接口等等的组件。除此之外,根据具体应用情况,电子设备600还可以包括任何其他适当的组件。
进一步,本实施例还提供了一种计算机可读存储介质,所述存储介质存储有计算机程序,所述计算机程序用于执行上述基于时间戳的日志采集方法。
本公开实施例所提供的一种基于时间戳的日志采集方法、装置、电子设备及介质的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行前面方法实施例中所述的方法,具体实现可参见方法实施例,在此不再赘述。
需要说明的是,在本文中,诸如“第一”和“第二”等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅是本公开的具体实施方式,使本领域技术人员能够理解或实现本公开。对这些实施例的多种修改对本领域的技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本公开的精神或范围的情况下,在其它实施例中实现。因此,本公开将不会被限制于本文所述的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
- 基于穿戴式设备的发烧提醒方法、装置、设备及存储介质
- 基于车载设备的内容推荐方法、装置、设备和存储介质
- 基于双控的存储设备数据同步方法、装置、设备及介质
- 基于集群计算的数据批处理方法、装置、电子设备及介质
- 一种基于区块链的链货币兑换方法、装置、设备和介质
- 基于k8s的日志采集方法、装置、设备及存储介质
- 基于云边协同的日志采集方法、装置、设备及介质