Redo日志 (4)—log sequence number(六十二)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: Redo日志 (4)—log sequence number(六十二)

前面说了redo日志的格式,刷新到磁盘后台有线程每秒运行一次,还有事务提交的时候,buffer pool不会刷新到磁盘,但是log buffer会刷新到磁盘。Log buffer会分成若干的block,吧这些block持久化到磁盘上,mysql根目录有两个log_file0和log_file1,可以增加,当存满的时候,从0循环继续存储,默认是48Mb。每个block是512个字节,前面四个block占比2048个字节是记录管理信息,2048字节后面开始记录block。

redo日志文件格式(3)—mysql进阶(六十一)


Log sequence number


自系统修改开始,就不断的修改页面,也就不断的生成redo日志。为了记录一共生成了多少日志,于是mysql设计了全局变量log sequence number,简称lsn,但不是从0开始,是从8704开始。

我们知道log buffer中写入redo日志不是一条一条写入的,而是mtr生成的一组redo日志为单位写入,实际吧内容写在log block body处,但在统计lsn增长量时,是按照实际写入日志量占用log block header和log block tralider来计算的。举个例子:

例1:系统第一次启动初始化log buffer时,buf_free会指向第一个block偏移量为12个字节大小的地方,那么lsn值也会增加12。

那么lsn值就会记录成:8704+12 = 8716

例2:如果以mtr为一组redo日志占用存储的空间比较小,则会吧mtr占用的空间加进去。

那么lsn值就会记录成8716+200 = 8916

例3:如果以mtr为一组redo日志占用的存储空间比较大,则会吧log block header 和log block trailder占用的12个字节和4个字节也算进去。假设mtr2占用了三个block,此刻里面包含两个header 和两个trailder。

那么lsn值就会记录成1000+2*12 +4 * 2 = 1032 + 8716

至于为什么开始设置为8704呢,这是mysql规定好的,从上可以指定,每一组mtr都对应一个lsn值,如果lsn值越小,则redo日志生产的越早。


Flushed_to_disk_lsn


Redo日志首先写到log buffer中,之后才会被刷新到磁盘的redo日志文件上(ib_file0和ib_file1)。所以innoDB设计了一个全局变量buf_next_to_write,这个字段前面的数据都是已经被刷新到磁盘上的。所以log buffer的组成应该是:第一部分是到buf_next_to_write表示已经持久化到磁盘的数据,buf_next_to_write之后到buf_free表示记录的数据,还未持久化,buf_free之后的数据则是空间的log buffer。

我们前面说过lsn值代表redo日志量,包括未刷新到磁盘的redo日志,相对应的,innoDB设计了从   redo日志刷新到磁盘的全局变量,称为flushed_to_disk_lsn。系统第一次启动,lsn和flushed_to_disk_lsn值是相同的,但随着redo不断持久化到磁盘,就拉开距离了。

举例场景:当有mtr1:8716~8916

Mtr2:8916~9948

Mtr3:9948~10000

这时候因为还未持久化,所以flushed_to_disk_lsn还是8716,但是lsn值已经到了10000。

当mtr1和mtr2持久化到磁盘的时候,lsn值不变,flushed_to_disk_lsn则变为9948.

由上可以知道,当有新的redo日志,lsn值会增长,fulshed_to_disk_lsn不变,当持久化数据到磁盘的时候,则lsn不变,flushed_to_disk_lsn增长。当他们值相同的时候,说明所有redo日志已经持久化到磁盘。

LSN值和redo日志文件偏移量对应关系

因为lsn值是日志增长量的和,所以偏移量可以直接用lsn值减去初始的lsn值8704,剩下的就是redo日志文件偏移量。


Flush链表中的LSN


我们知道mtr代表一次对底层页面原子的访问,每次mtr结束的时候,都会吧redo日志写入到log buffer 中。除此之外,在mtr结束还有重要的事要做,写入到buffer pool的flush 链表中。回忆一下

Buffer pool是由控制块+碎片+缓存页组成。

而flush链表存的是还未持久化完成的脏数据,吧这些控制块通过双向链接组成链表,头部有一个链表基节点,有总的控制块数量,及其strat位子和end位子。

当第一次修改了buffer pool中的页面,则会吧这个控制块放入这个链表里,也就是链表里的位子顺序是根据第一次修改来放入的,后面就算修改因为已经存在了,直接在flush 链表修改就好。

Oldest_modification:如果某个页面被加载到buffer pool后进行第一次修改,那么就将mtr对应的lsn值写入这个。

Newest_modification:每次修改页面都会在mtr结束时候,吧lsn值写入这个。

而且每次新增的的修改页会放在flush链表的最前面。

综上知道,当第一次修改会在flush链表新增控制块,并且放在最前面,olderst_modification写入lsn值,newest_modification则是写入mtr结束时候的lsn值。如果当前页已经存在flush链表,则不需要新增当前页,old值不需要修改,吧newest值修改成mtr结束的lsn值即可。


Checkpoint


前面我们说过,log buffer内存是优先的,当使用完毕之后,我们得从第一个文件重新循环使用,所以这样很容易追尾。那我们可以想想redo日志干嘛的,是为了防止系统崩溃,记录数据,吧数据持久化到磁盘上的,那么如果已经把这些数据持久化到磁盘了,是不是系统崩溃这些数据也不需要恢复,可以放弃了呢?

用我们上面的例子,mtr1和mtr2和mtr2,当1和2已经持久化到磁盘,但修改的脏数据仍然留在buffer pool里,所以他们生成在redo日志在磁盘里的空间是不可以覆盖的。随着系统的运行,当页已经被刷新到磁盘里,这时候控制块就会从flush链表中移除。

所以这时候innoDB设计了checkpoint_lsn全局变量来代表当前系统可以覆盖的redo日志总量,这个值默认也是8704。

比方说页a刷新到磁盘上,mtr1生成的redo日志就可以被覆盖了,我们可以进行增加一个checkpoint_lsn的操作,这个过程我们称做checkpoint。做一次checkpoint可以分为两个步骤:

步骤一:计算一下当前系统中可以覆盖的redo日志对应的lsn值是多少

Redo日志可以覆盖,意味着脏数据已经刷新到磁盘,我们只要知道最早修改的脏页对应的oldest_modification,凡是checkpoint_lsn小于这个值的,都是可以覆盖的,比如我们前面的例子,最小的oldest_ modification值是8916,这时候我们吧8916赋值给checkpoint_lsn,小于这个值的都可以覆盖。

步骤二:将checkpoint _lsn和对应的redo日志文件组偏移量以及checkpoint编号写到日志文件管理信息(就是checkpoint1和checkpoint2)中

innoDB设计了一个全局变量,checkpoint_no,每做一次point就+1,还有计算checkpoint_offset偏移量,可以通过checkpoint_lsn计算。

每个redo都有2048个管理文件的信息,当checkpoint_no是偶数的时候,就存储在checpoint1中,当checkpoint_no是奇数的时候,就存储在checkpoint2中。


批量从flush链表刷出脏页


一般情况下,后台的线程都会对flush链表和lru链表刷脏到磁盘上,主要磁盘I/O操作比较慢,不想影响用户线程的处理请求。但如果系统操作频繁,写日志频繁,系统lsn增值太快。如果后台无法及时持久化脏数据,无法checkpoint,这时候可能需要用户线程同步刷新脏数据到磁盘,这样脏数据对应的redo日志没用了,就可以去checkpoint。


查看系统中的各种LSN值


我们可以用show engine innodb status;查看lsn值

其中log_sequence_number:代表系统中的lsn值,也就是当前系统的redo日志量,包括写入log buffer中的日志

Log_flushed_up_to:代表flushed_to_disk_lsn的值,代表已经写入的磁盘的redo日志字节量。

Page flushed up to:代表fulsh链表中最早修改那个页面对应的oldest_modification属性。

Last checkpoint at:当前系统的checkpoint_lsn值。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
267 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
5天前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
|
2月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
294 3
|
15天前
|
存储 监控 安全
什么是事件日志管理系统?事件日志管理系统有哪些用处?
事件日志管理系统是IT安全的重要工具,用于集中收集、分析和解释来自组织IT基础设施各组件的事件日志,如防火墙、路由器、交换机等,帮助提升网络安全、实现主动威胁检测和促进合规性。系统支持多种日志类型,包括Windows事件日志、Syslog日志和应用程序日志,通过实时监测、告警及可视化分析,为企业提供强大的安全保障。然而,实施过程中也面临数据量大、日志管理和分析复杂等挑战。EventLog Analyzer作为一款高效工具,不仅提供实时监测与告警、可视化分析和报告功能,还支持多种合规性报告,帮助企业克服挑战,提升网络安全水平。
|
2月前
|
SQL 存储 关系型数据库
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
老架构师尼恩在其读者交流群中分享了关于 MySQL 中 redo log、undo log 和 binlog 的面试题及其答案。这些问题涵盖了事务的 ACID 特性、日志的一致性问题、SQL 语句的执行流程等。尼恩详细解释了这些日志的作用、所在架构层级、日志形式、缓存机制以及写文件方式等内容。他还提供了多个面试题的详细解答,帮助读者系统化地掌握这些知识点,提升面试表现。此外,尼恩还推荐了《尼恩Java面试宝典PDF》和其他技术圣经系列PDF,帮助读者进一步巩固知识,实现“offer自由”。
美团面试:binlog、redo log、undo log的底层原理是什么?它们分别实现ACID的哪个特性?
|
27天前
|
存储 监控 安全
什么是日志管理,如何进行日志管理?
日志管理是对IT系统生成的日志数据进行收集、存储、分析和处理的实践,对维护系统健康、确保安全及获取运营智能至关重要。本文介绍了日志管理的基本概念、常见挑战、工具的主要功能及选择解决方案的方法,强调了定义管理目标、日志收集与分析、警报和报告、持续改进等关键步骤,以及如何应对数据量大、安全问题、警报疲劳等挑战,最终实现日志数据的有效管理和利用。
|
2月前
|
存储 关系型数据库 MySQL
MySQL中的Redo Log、Undo Log和Binlog:深入解析
【10月更文挑战第21天】在数据库管理系统中,日志是保障数据一致性和完整性的关键机制。MySQL作为一种广泛使用的关系型数据库管理系统,提供了多种日志类型来满足不同的需求。本文将详细介绍MySQL中的Redo Log、Undo Log和Binlog,从背景、业务场景、功能、底层实现原理、使用措施等方面进行详细分析,并通过Java代码示例展示如何与这些日志进行交互。
188 0
|
2月前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
40 0
|
2月前
|
数据可视化
Tensorboard可视化学习笔记(一):如何可视化通过网页查看log日志
关于如何使用TensorBoard进行数据可视化的教程,包括TensorBoard的安装、配置环境变量、将数据写入TensorBoard、启动TensorBoard以及如何通过网页查看日志文件。
255 0
|
算法
Leetcode 313. Super Ugly Number
题目翻译成中文是『超级丑数』,啥叫丑数?丑数就是素因子只有2,3,5的数,7 14 21不是丑数,因为他们都有7这个素数。 这里的超级丑数只是对丑数的一个扩展,超级丑数的素因子不再仅限于2 3 5,而是由题目给定一个素数数组。与朴素丑数算法相比,只是将素因子变了而已,解法还是和朴素丑数一致的。
104 1