数据库|Pump日志出现错误,你的数据被清空了吗?

news/2024/5/19 13:34:59 标签: 数据库, tidb, pump

一、pump日志错误信息疑问

pump 排查问题的时候(6.1.5版本),偶然发现一条错误日志:

[ERROR] [server.go:635]drainer's checkpoint is older than pump gc ts, some binlogs are purged,draine=drainerip:port,gc ts=2023-07-10 06:05,drainer checkpoint=2023-07-09 11:05(为了便于表达,直接将相应的ts转为了相应的时间)

第一眼看到这条日志时,我曾误以为drainer要从pump读取的数据已被pump清除。但是,经过仔细查看日志上下文和代码逻辑,我发现实际上drainer要从pump读取的数据并未被清除

那么,为什么会显示这样的错误日志呢?

二、日志初步检查

从日志中可以看到,drainer试图从pump中读取2023年7月9日11:05之后的数据(简称drainer request ts)。然而,gcTS(垃圾回收时间戳)显示的是2023年7月10日06:05,这似乎表明这个时间段内的数据已经被pump进行了清除。

为了验证这个结论,我查看了pump的上下文日志。通过使用“grep -in 'request gc ts' pump.log”命令,我找到了最近一次pump的垃圾回收时间(pump每小时进行一次垃圾回收)。根据该日志记录,我发现pump当前的最大gc ts(当前时间减去pump配置的垃圾回收参数)是2023年7月9日10:05。这意味着2023年7月9日10:05之前的数据已被清除。

然而,drainer的请求时间是2023年7月9日11:05,它并不需要读取2023年7月9日10:05之前的数据。因此,日志中“drainer's checkpoint is older than pump gc ts, some binlogs are purged”这条信息是错误的。更令人惊讶的是,这个日志消息还是以ERROR级别的。

本着好奇的态度,我去研究了pump相关的代码。

三、代码逻辑

日志里面显示关于这部分逻辑的代码在pump/server.go:635行detectDrainerCheckPoints方法里面,下面是相关代码

ifdrainer.MaxCommitTS < gcTS {
log.Error("drainer's checkpoint is older than pump gc ts, some binlogs are purged",
zap.String("drainer", drainer.NodeID),
zap.Int64("gc ts", gcTS),
zap.Int64("drainer checkpoint", drainer.MaxCommitTS),
)
// will add test when binlog have failpoint
detectedDrainerBinlogPurged.WithLabelValues(drainer.NodeID).Inc()
}

这段代码的逻辑比较简单,主要是用来检测drainer的checkpoint是否比pump的垃圾回收时间(gcTS)要早。如果drainer的MaxCommitTS小于gcTS,就会打印出错误日志“drainer’s checkpoint is older than pump gc ts, some binlogs are purged”。

要理解这个逻辑,首先需要知道drainer.MaxCommitTS这个变量的含义。这个变量实际上表示的是drainer同步pump数据到哪个tso(即drainer savepoint里面的commitTS)。

那么关键就是gcTS变量是如何计算的。在代码中,gcTS是作为参数传入的,而detectDrainerCheckPoints方法 被pump/server.go:546行被调用。

gcTS := s.storage.GetGCTS()
alertGCMS := earlyAlertGC.Nanoseconds() / 1000/ 1000
alertGCTS := gcTS + int64(storage.EncodeTSO(alertGCMS))

log.Info("use gc ts to detect drainer checkpoint", zap.Int64("gc ts", gcTS))
// detect whether the binlog before drainer's checkpoint had been purged
s.detectDrainerCheckPoints(s.ctx, alertGCTS)

从上述代码中可以看到,gcTS是通过alertGCTS参数变量传递进来的。而alertGCTS的值是gcTS与alertGCMS的和。其中,gcTS是通过调用s.storage.GetGCTS()方法获取的。该方法返回的gcTS实际上是pump最近一次垃圾回收的gc tso(当前时间-pump配置的gc参数,也就是说pump 已经把这个时间点以前的数据给gc了)。因此,日志中看到的request gc ts的时间是07-09 10:05。

[INFO] [server.go:592] ["send gc request to storage"] ["request gc ts"=07-09 10:05]

那么alertGCMS的值是多少呢?其实alertGCMS在代码里面显示了

earlyAlertGC = 20* time.Hour
//pump/server.go:56

也就是说在detectDrainerCheckPoints方法里面判断drainer请求的数据是否被pump给gc的时候,是和gcTS这个变量做比较。但是在某些情况下,这个gcTS是实际的 gcTS增加了20小时,所以才会有上述的日志报错说drainer 请求的pump日志被清楚。

四、总结

经过查看代码,我们可以确定这个报错的根本原因已经找到。不过,为什么要在判断时将gcTS加上20小时呢?

对于这个问题,我只能提出一些猜测。这可能是一个历史遗留问题,也可能是为了提醒用户drainer归档binlog的速度太慢,导致需要读取的pump数据有被清除的风险。一般来说,当这个错误日志出现时,drainer归档binlog的速度确实较慢。

不过,具体的原因可能只有开发人员才能确切知道。在此,我们就不做过多研究了。值得注意的是,该错误日志级别为ERROR,并可能会让用户产生误解。因此,建议更改日志级别和输出信息,以避免这些问题。

版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。

公众号搜索神州数码云基地,后台回复数据库,加入数据库技术交流群。


http://www.niftyadmin.cn/n/5093640.html

相关文章

前置过滤器安错了,是过滤不了水里的虫卵的

1,其实自来水石出来的水是干净的,但是在运输到我们家的过程中      是不排除会造成二次污染的,比如管道材料故障,小区二次加压等环节      都可能带来虫卵,铁锈,泥沙等污染物,      2,不光咱们的自来水会有这种情况,很多欧美国家的饮用水,      也都需要自己 再…

AC修炼计划(AtCoder Regular Contest 165)

传送门&#xff1a;AtCoder Regular Contest 165 - AtCoder 本次习题参考了樱雪猫大佬的题解&#xff0c;大佬的题解传送门如下&#xff1a;Atcoder Regular Contest 165 - 樱雪喵 - 博客园 (cnblogs.com) A - Sum equals LCM 第一题不算特别难 B - Sliding Window Sort 2 对…

java小区物业水电费管理系统springboot+vue

智能小区管理系统被人们投放于现在的生活中进行使用&#xff0c;该款管理类软件就可以让管理人员处理信息的时间介于十几秒之间。在这十几秒内就能完成信息的编辑等操作。有了这样的管理软件&#xff0c;智能小区管理信息的管理就离无纸化办公的目标更贴近了。 这次开发的智能小…

js 删除数组中指定元素——5种方式

1.使用splice()方法删除元素 JavaScript 中的 splice() 方法可用于在数组中添加或删除元素。如果我们需要删除数组中的元素&#xff0c;可以使用 splice() 方法。该方法接受两个参数&#xff0c;第一个参数指定要删除的元素的位置&#xff0c;第二个参数指定要删除的元素个数&…

推荐5款各种原因导致很少人知道的小软件

​ 很多软件用起来很好用&#xff0c;但是由于这样那样的原因&#xff0c;一直没什么知名度&#xff0c;但是不代表它们不好用&#xff0c;我的任务就是把这些宝藏分享给大家。 1.图像编辑——GIMP ​ GIMP是一款免费的开源图像编辑器&#xff0c;可以用于创建和修改图像&…

【JVM面试】从JDK7 到 JDK8, JVM为啥用元空间替换永久代?

系列文章目录 【JVM系列】第一章 运行时数据区 【面试】第二章 从JDK7 到 JDK8, JVM为啥用元空间替换永久代&#xff1f; 大家好&#xff0c;我是青花。拥有多项发明专利&#xff08;都是关于商品、广告等推荐产品&#xff09;。对广告、Web全栈以及Java生态微服务拥有自己独到…

探寻蓝牙的未来:从蓝牙1.0到蓝牙5.4,如何引领无线连接革命?

►►►蓝牙名字的来源 这要源于一个小故事&#xff0c;公元940-985年&#xff0c;哈洛德布美塔特(Harald Blatand)&#xff0c;后人称Harald Bluetooth&#xff0c;统一了整个丹麦。他的名字“Blatand”可能取自两个古老的丹麦词语。“bla”意思是黑皮肤的&#xff0c;而“tan…

通达OA V12版本,好用的自定义函数

通达OA V12版本&#xff0c;好用的自定义函数 后端getBpmTbAllInfoCy 后端 getBpmTbAllInfoCy /* //2023年10月16日 功能&#xff1a;根据flow_id&#xff0c;或run_id&#xff0c;获取该流程的全部表名及描述&#xff0c;和字段及描述 返回值&#xff1a;$returnDataarray(s…